陌陌笔试题总结 算法岗

内容:
推荐算法:基于用户,基于内容,重点学习
关联推荐算法:Apriori和FP-Growth
欧式距离,曼哈顿距离,切比雪夫距离
聚类算法:k-means
银行家算法
计算机网络:7层协议及功能
静态路由,动态路由

一面:
项目介绍,特别详细,详细到我项目中的树是怎么建的,每方面怎么考虑的。

算法:
1。分类和聚类哪个熟悉?
答分类
2。分类算法中你用过哪个,详细介绍一下:结合项目介绍的
朴素贝叶斯(音乐推荐系统),LG(银行贷款预测),SVM(朋友圈分类)

3。推荐算法熟悉么?

推荐算法大致可以分为三类: 基于内容的推荐算法协同过滤推荐算法基于知识的推荐算法。
基于内容的推荐算法,原理是 用户喜欢和自己关注过的Item在内容上类似的Item,比如你看了哈利波特I,基于内容的推荐算法发现哈利波特II-VI,与你以前观看的在内容上面(共有很多关键词)有 很大关联性,就把后者推荐给你,这种方法 可以避免Item的冷启动问题冷启动:如果一个Item从没有被关注过,其他推荐算法则很少会去推荐,但是基于内容的推荐算法可以分析Item之间的关系,实现推荐), 弊端在于推荐的Item可能会重复,典型的就是新闻推荐,如果你看了一则关于MH370的新闻,很可能推荐的新闻和你浏览过的,内容一致;另外一个弊端则是对于一些 多媒体的推荐(比如音乐、电影、图片等)由于 很难提内容特征,则很难进行推荐,一 种解决方式则是人工给这些Item打标签

协同过滤算法,原理 是用户喜欢那些具有相似兴趣的用户喜欢过的商品,比如你的朋友喜欢电影哈利波特I,那么就会推荐给你,这是最简单的 基于用户的协同过滤算法(user-based collaboratIve filtering),还有一种是 基于Item的协同过滤算法(item-based collaborative filtering),这两种方法都是 将用户的所有数据读入到内存中进行运算的,因此成为 Memory-based Collaborative Filtering,另一种则是 Model-based collaborative filtering,包括Aspect Model,pLSA,LDA,聚类,SVD,Matrix Factorization等,这种方法 训练过程比较长,但是训练完成后,推荐过程比较快。

基于知识的推荐算法,也有人将这种方法归为 基于内容的推荐,这种方法比较典型的是 构建领域本体,或者是 建立一定的规则,进行推荐。

混合推荐算法,则会融合以上方法,以 加权或者串联、并联等方式尽心融合。
当然,推荐系统还包括很多方法,其实机器学习或者数据挖掘里面的方法,很多都可以应用在推荐系统中,比如说LR、GBDT、RF(这三种方法在一些电商推荐里面经常用到),社交网络里面的图结构等,都可以说是推荐方法。

4。协同过滤里面怎么细分?细分之后的算法举出几个?:基于用户的和基于内容的,用户的考察用户间相似性,基于内容的不知道。

协同过滤(Collaborative Filtering,简称CF)推荐算法
CF算法分为两大类,一类为 基于memory的(Memory-based),另一类为 基于Model的(Model-based)User-based和Item-based算法均属于Memory-based类型
基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering)。

基于用户的协同过滤算法是 通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分。根据 不同用户对相同商品或内容的态度和偏好程度计算用户之间的关系。在 有相同喜好的用户间进行商品推荐。简单的说就是如果A,B两个用户都购买了x,y,z三本图书,并且给出了5星的好评。那么A和B就属于同一类用户。可以将A看过的图书w也推荐给用户B。
具体算法:
聚类算法:K-Means,
用聚类算法做协同过滤就和前面的基于用户或者项目的协同过滤有些类似了。我们可以按照用户或者按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。

基于物品的协同过滤算法与基于用户的协同过滤算法很像,将商品和用户互换。 通过计算不同用户对不同物品的评分获得物品间的关系基于物品间的关系对用户进行相似物品的推荐。这里的 评分代表用户对商品的态度和偏好。简单来说就是如果用户A同时购买了商品1和商品2,那么说明商品1和商品2的相关度较高。当用户B也购买了商品1时,可以推断他也有购买商品2的需求。
具体算法:
关联推荐算法有Apriori,FP Tree和PrefixSpan
一般我们可以找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,那么我们可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。

基于模型的协同过滤推荐(model-based collaborative filtering recommendation)
基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好信息进行预测推荐。

5。你提到了关联规则, 关联规则具体你知道哪些算法?
Apriori和FP-Growth
Apriori算法原理总结 - 刘建平Pinard - 博客园   http://www.cnblogs.com/pinard/p/6293298.html
FP Tree算法原理总结 - 刘建平Pinard - 博客园   http://www.cnblogs.com/pinard/p/6307064.html

6。这两个算法异同性?

Apriori算法是 发现频繁项集的一种方法,Apriori算法的 两个输入参数分别是 最小支持度数据集,该算法首先会 生成所有单个元素的项集列表。接着 扫描数据集来查看哪些 项集满足最小支持度要求,那些 不满足最小支持度的集合会被去掉,然后,对 剩下来的集合进行组合以生成包含两个元素的项集,接下来,再 重新扫描交易记录去掉不满足最小支持度的项集。该过程 重复进行直到所有项集都被去掉


apriori和fp-growth之间的联系和差异。
初读fp-growth算法,估计都感觉不到它和apriori有什么关系,但我个人猜测 fp-growth是从apriori的统计候选集太耗时的那里改良开始的,希望 实现候选项集的更快速的计算支持度,最后就彻底的改变的搜索频繁项集的方式。我觉得两个算法的最根本的差异在于 apriori是以搜索项集组合的空间作为基础,通过数据库来对照。而f p-growth是以数据库为基础,在里面寻找项集是否频繁,表现为搜索方式 一个是广度优先一个是深度优先。
apriori的那剪枝步和统计支持度在fp-growth上就是不断的建fp-tree和遍历。而 前者的统计需要经过的IO后者已经压缩到内存了;但fp-growth不是在所有数据集上都比apriori强,比如 在稀疏的数据集上,fp-tree每个节点可能包含 非常多子孙,因此 保存子孙节点的指针也是很大开销,fp-tree本来就是通过 压缩使得数据集能被内存容纳,结果导致 最后fp-tree起不到压缩效果适得其反优化实现的apriori在稀疏数据集上也往往比fp-growth要快。

经典的关联规则挖掘算法包括Apriori算法和FP-growth算法。apriori算法 多次扫描交易数据库,每次利用候选频繁集产生频繁集;而FP-growth则 利用树形结构无需产生候选频繁集而是直接得到频繁集,大大 减少扫描交易数据库的次数,从而 提高了算法的效率。但是apriori的算法 扩展性较好,可以用于并行计算等领域
陌陌笔试题总结 算法岗_第1张图片

7。k-means知道么,具体是怎么回事?
最大化簇间距离,最小化簇内距离
算法工作流程:首先随机确定k个初始点作为质心,然后将数据集中的每个点分配到一个簇中,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。完成此步后,每个簇的质心更新为该簇所有点的平均值。

注:最近质心的说法,意味着需要进行某种距离计算,可以使用任意距离的度量方法。K-均值算法的性能会受到所选距离计算方法的影响。


8。距离使用的哪种距离,你知道哪种距离?
欧式距离,曼哈顿距离,切比雪夫距离
欧氏距离:两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:
也可以用表示成向量运算的形式:

曼哈顿距离:也称为城市街区距离(City Block distance)。两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离
切比雪夫距离 ( Chebyshev Distance )
二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离
两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离
这个公式的另一种等价形式是



操作系统:

银行家算法
操作系统191页,资源分配拒绝
银行家算法,死锁避免策略:该策略能确保系统中进程和资源总是处于安全状态。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求,否则,阻塞该进程直到同意该请求后仍然是安全的。
安全状态:至少有一个进程执行序列不会导致死锁(即所有进程都能运行直到结束)
不安全状态:不安全的一种状态。
详细看笔记或书


死锁条件
操作系统188页。
若可能出现死锁,则必定要出现三个条件:
1,互斥:一次只有一个进程可以使用一个资源,其他进程不能访问已分配给其他进程的资源。
2,占有且等待:当一个进程在等待分配得到其他资源时,其继续占有已分配得到的资源。
3,非抢占:不能强行抢占进程中已占有的资源。
满足上述三个条件可能会存在死锁,但如果只有这三个条件,则不一定产生死锁。对死锁的产生还需要第四个条件:
4,循环等待:存在一个封闭的进程链,使得每个资源至少占有此链中下一个进程所需要的一个资源。如图
前三个条件是死锁存在的必要条件,但不是充分条件。
四个条件连在一起构成了死锁的充分必要条件。





计算机网络:
从上到下说出网络有哪些层,每层具体应用?
      【1】物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特。
  【2】数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
  【3】网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择,Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
  【4】传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的), 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,常常把这一层数据叫做段。
  【5】会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
  【6】表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
  【7】应用层: 是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。




动态协议和静态协议有哪些?

静态路由需要人 手工配置,是在路由器中设置的 固定的路由表不适应网络的变化更新;
动态路由它 不需要手工配,是 网络中的路由器之间相互通信传递路由信息利用收到的路由信息更新路由器表的过程,可以 动态更新,能 适应各种环境。当然,各种动态路由协议会 不同程度地占用网络带宽和CPU资源

静态路由: 事先设置好路由器和主机中并 将路由信息固定的一种方法
动态路由:让路由协议在 运行过程中自动地设置路由控制信息的一种方法。
静态路由的设置通常是由使用者手工操作完成的。
缺点:1). 每增加一个新网络,就需要将这个被追加的网络信息设置在之前所有的路由器上。
2). 一旦某个路由器发生故障,基本只能由管理员手工设置以后才能恢复正常。
使用动态路由,管理员 必须设置好路由协议,其设定过程的 复杂程度与具体要设置路由协议的类型有直接关系。如RIP就简单,而OSPF就复杂。动态路由能避免静态的1,2点问题,
缺点:1).路由器为能够定期相互交换必要的路由控制信息,会与相邻的路由器之间互发消息,这些互换的消息会 给网络带来一定程序的负荷,特别是 环路情况下,需要特别注意

动态路由协议分为 内部网关协议(IGP)外部网关协议(EGP)。这里的自治域指一个具有统一管理机构、统一路由策略的网络。自治域内部采用的路由选择协议称为 内部网关协议,常用的有RIP、OSPF外部网关协议主要用于多个自治域之间的路由选择,常用的是 BGP和BGP-4

静态路由的优点:
·占用的 CPU 处理时间少。
·便于管理员了解路由。
·易于配置。

静态路由的缺点:
·配置和维护耗费时间。
·配置容易出错,尤其对于大型网络。
·需要管理员维护变化的路由信息。
·不能随着网络的增长而扩展;维护会越来越麻烦。
·需要完全了解整个网络的情况才能进行操作。

动态路由的优点:
·增加或删除网络时,管理员维护路由配置的工作量较少。
·网络拓扑结构发生变化时,协议可以自动做出调整。
·配置不容易出错。
·扩展性好,网络增长时不会出现问题。

动态路由的缺点:
·需要占用路由器资源(CPU 时间、内存和链路带宽)。
·管理员需要掌握更多的网络知识才能进行配置、验证和故障排除工作。




数据结构:
1。最大子序列和:一串序列,找出和最大的子序列:

O(N)的时间。因为最大连续子序列和只可能是以位置0~n-1中某个位置结尾。当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0
如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;
否则,则以位置i结尾的最大连续子序列和为元素i。

2。平衡二叉树是怎么回事,介绍一下

平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法)
具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说AVL树每个节点的平衡因子只可能是-1、0和+1(左子树高度减去右子树高度)。

3。链表中有环怎么找?
单链表有环的定义:链表的尾节点指向了链接中间的某个节点。
如下图所示,如果有环,则遍历到结点7时,又重新回到结点3,结点3就是环的入口结点。
陌陌笔试题总结 算法岗_第2张图片
思路:采用快慢指针的思想,设两个工作指针,一个快一个慢,如果链表有环,它们必然会在某个结点处相遇。
1.链表中是否有环的判断
可以设置两个指针(fast,slow),初始值均指向头,slow每次向前一步,fast每次向前两步;
如果链表中有环,则fast先进入环中,而slow后进入环中,两个指针在环中必定相遇;
如果 fast遍历到尾部为NULL,则无环

2.链表有环,判断环的入口点
  
步骤:
<1> 定义两个 指针p1和p2,在初始化时都 指向链表的头节点
<2> 如果 链表中的环有n个节点,指针 p1先在链表上向前移动n步
<3> 然后指针 p1和p2以相同的速度在链表上向前移动直到它们相遇
<4> 它们 相遇的节点就是环的入口节点。

在MeetingNode方法中,当快慢指针(slow、fast)相遇时, slow指针肯定没有遍历完链表,而fast指针已经在 环内循环了n(n>=1)圈
假设slow指针走了s步,则fast指针走了2s步。同时,fast指针的步数还等于s加上在环上多转的n圈,设环长为r,则满足如下关系表达式:
2s = s + nr;
所以可知:s = nr;
假设链表的头节点到“环的尾节点“的长度为L(注意, L不一定是链表长度),环的入口节点与相遇点的距离为x,链表的头节点到环入口的距离为a,则满足如下关系表达式:
a + x = s = nr;
可得:a + x = (n - 1)r + r = (n - 1)r + (L - a)
进一步得:a = (n - 1)r + (L -a - x)
结论:
<1> (L - a -x)为相遇点到环入口节点的距离,即 从相遇点开始向前移动(L -a -x)步后,会再次到达环入口节点。
<2> 从链表的头节点到环入口节点的距离 = (n - 1) * 环内循环 + 相遇点到环入口点的距离。
<3> 于是 从链表头与相遇点分别设一个指针每次各走一步,两个指针必定相遇,且 相遇第一点为环入口点



4。海量数据中找中位数(数据有100G,内存只有1G)
题目如下:
只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法。

给出了四种方法来解决
算法:
1.利用 外排序的方法,进行排序 ,然后再去找中位数
2.另外还有个思路利用
先求 第1G大,然后 利用该元素求第2G大,然后利用第2G大,求第3G大...当然这样的话虽 不需排序,但是 磁盘操作会比较多,具体还需要 分析下与外排序的效率哪个的磁盘IO会比较多
建立一个1g个整数的最大值堆,如果 元素小于最大值则入堆,这样可以得到 第1g大的那个元素然后利用这个元素,重新建一次堆,这次 入堆的条件还要加上大于这个第1g大的元素,这样建完堆可以得到第2g大的那个...
3.借鉴基数排序思想
偶认为可以用位来判断计数,从最高位到最低位,为了方便表述我们假设为无符号整数,即0x00000000~0xFFFFFFFF依次递增,那么可以遍历所有数据,并记录最高位为0和1的个数(最高位为0的肯定是小于最高位为1的)记为N0、N1
那么根据N0和N1的大小就可以知道中位数的最高位是0还是1
假设N0>N1,那么再计算N00和N01,
如果N00>(N01+N1),则说明中位数的最高两位是00
再计算N000和N001.。。。依次计算就能找到中位数
如果改进一下,设定多个计数器
好像一次磁盘io也可以统计出N0,N00,....的数值
4.借鉴桶排序思想
一个整数假设是32位无符号数
第一次扫描把0~2^32-1分成2^16个区间,记录每个区间的整数数目
找出中位数具体所在区间65536*i~65536*(i+1)-1
第二次扫描则可找出具体中位数数值

第一次扫描已经找出中位数具体所在区间65536*i~65536*(i+1)-1
然后第二次扫描再统计在该区间内每个数出现的次数,就可以了







你可能感兴趣的:(陌陌笔试题总结 算法岗)