本文给到的是相关具体可能会被问及的问题 (编程、基础算法、机器学习算法)。从本次关于算法工程师常见的九十个问题大多是各类网站的问题汇总,希望你能从中分析出一些端倪,文末附了部分参考的答案。
问题区
1. struct 和 class 区别,你更倾向用哪个
2. kNN,朴素贝叶斯,SVM 的优缺点,朴素贝叶斯的核心思想,有没有考虑属性之间不是相互独立的情况
3. 10 亿个整数,1G 内存,O(n) 算法,统计只出现一次的数。
4. SVM 非线性分类,核函数的作用
5. 海量数据排序
6. 项目中的数据是否会归一化处理,哪个机器学习算法不需要归一化处理
7. 两个数组,求差集
8. 开放性问题:每个实体有不同属性,现在有很多实体的各种属性数据,如何判断两个实体是否是同一种东西
9. 写程序实现二分查找算法,给出递归和非递归实现,并分析算法的时间复杂度。
10. 用 C/C++ 实现单链表的反转。
11. python 读取文件,写代码
12. python 计算一个文件中有 N 行,每行一列的数的平均值,方差,写代码
13. C++ 求两个一维数组的余弦相似度,写代码
14. SVM 详细过程,支持向量,几何间隔概念,拉格朗日函数如何求取超平面,非线性分类
15. 海量数据中求取出现次数最大的 100 个数。
16. 字符串翻转,手写
17. 快排,手写
18. KNN(分类与回归)、CART(回归树用平方误差最小化准则,分类树用基尼指数最小化准则)、Logistics(推导)、GBDT(利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树)、随机森林(Bagging+CART)
19. 非递归的二叉前序遍历 && 两个字符串的复制(除了字符串地址重叠的情况,也要注意判断字符串本身的空间足够不足够,对于异常情况要考虑全面)
20. 一个概率题目: 6 个 LED 灯管,找整体旋转 180'后仍然是一个正常输入的情况(考虑全即可) 21. 给一个情境,考察你对于机器学习算法的了解程度以及常用情境的了解(要特别注意思维要开阔,我就是陷入某一个)
22. 一个数组,如果存在两个数之和等于第三个数,找出满足这一条件的最大的第三个数(设为 x+y =c)
23. 聚类和分类有什么区别?分类是事先知道类标的,而聚类事先不知道类标。
24. 快速排序,怎样将二叉排序树变成双向链表,且效率最高,从栈里找最小的元素,且时间复杂度为常数级,
25. 神经网络, plsi 的推导,还有 float 转 string, 判断一棵树是否是另一棵的子树。
26. 写写 SVM 的优化形式、推导 SVM
27. 在一个 n*n 的矩阵中填数的问题,那种转圈填数,上网搜搜有
28. 链表存在环问题,环的第一个节点在哪里?
29. 几个排序算法,必须写出
30. 用拉格朗日公式推导 SVM kernel 变换
31. 数据结构当中的树,都有哪些?
32. 推荐系统
33. 输出一个循环矩阵,这个我想的有点复杂了,简单的循环即可实现,我用了递归
34. 翻转字符串,《剑指 offer》原题
35. 确定链表中环的起始位置
36. N 个数找 K 大数那个题, 堆解释了一遍, 比较满意, 问还能怎么优化 O(Nlogk) 的方法,并行方面想
37. 一个班 60 个人怎么保证有两个人生日相同, 听完后有点奇怪,①为什么是 60 个人?②为什么是保证?, 反正没管这么多就是概率嘛, 算就完了.
38. 问一个字符串怎么判断是邮箱比如: vzcxn@sdf.gre. 有限状态自动机, 然后要我画状态转移图.
39. 快排的空间复杂度, 答 O(n). 归并的空间复杂度, 答 O(n). 他让我好好想想, 我想了会, 难道空间复杂度的常数不能省吗? 然后做了修改, 快排是 O(n) 归并是 O(2n).
40. 给 10^10 个 64 位数, 100M 内存的空间排序, 感谢队长刚好在去的前一天教过我一个求中位数的方法. 用文件操作来做了, 像快排一样, 二分选个数统计大于那个数的数量和小于那个数的数量, 如果能用 100M 的空间排序就把那些数排了, 如果不能继续. 直到能排为止.
41. main(argc,argv[]) 里面两个参数什么意思
42. kmp 算法
43. 电梯问题
44. 一个应用题,考察 hash 算法
45. 求最大字段和,用动态规划和分治法两个方法,时间复杂度怎么算
46. 写了一下二分查找算法的代码
47. 统计字符串中出现的字符个数,忽略大小写,其中可能有其他字符。
48. 一个文件 2G 内容是 userid,username 一个文件 3G 内容是 username,userpassword 要求:输出 userid,userpassword 8 核 cpu 2G 内存
49. 贝叶斯概率、卷积
50. 寻找二叉树的公共父节点
51. 通过寻找两条路径,然后寻找最后一个公共节点。
52. SVM 核函数,合并两个文件的问题
53. b+ b - 树、红黑树、要求写出排序算法
54. 判断两条链表是否交叉。
55. 归并排序,random 指针的链表复制等
56. 树的广度、深度遍历,
57. L1 和 L2 的区别
58. 生成与判别模型
59. 隐式马尔科夫
60. SVM:中文分词
61. 关联分析、aprior
62. 各类算法优缺点、模型调优细节
63. 特征提取的方法(无关键词也是一个特征)
64. 稳定与不稳定排序
65. RBF 核与高斯核的区别
66. Python 实现 LogReg
67. ROC 与 AUC
68. K-means 起始点
69. 深度学习和机器学习的区别、数据挖掘和人工智能的区别、测试集和训练集的区别 kmeans,FCM,SVM 算法的具体流程、如何优化 kmeans 算法
70. 二叉树前序遍历非递归实现,大家总结一下前序,中序,后序遍历的非递归实现,尝试多几种方法会有不一样的收获。
71. Deep CNN, Deep RNN, RBM 的典型应用与局限,看 Hinton 讲义和 Paper 去吧
72. 有哪些聚类方法?
73. 判断一个链表是否存在环?回 答:通过两个指针,快慢指针进行遍历。
74. 正则化是怎么回事(L1 和 L2)
75. PCA
76. 学校食堂如何应用数据挖掘的知识
77. 哪些模型容易过拟合,模型怎么选择
78. 什么是模糊聚类,还有划分聚类,层次聚类等
79. 最长上升子序列啊,两个大小相同的有序数组找公共中位数
80. 并行计算、压缩算法
81. SVD、LDA
82. naive bayes 和 logistic regression 的区别
83. LDA 的原理和推导
84. 做广告点击率预测,用哪些数据什么算法
85. 推荐系统的算法中最近邻和矩阵分解各自适用场景
86. 用户流失率预测怎么做(游戏公司的数据挖掘都喜欢问这个)
87. 一个游戏的设计过程中该收集什么数据
88. 如何从登陆日志中挖掘尽可能多的信息
89. 统计学习的核心步骤:模型、策略、算法,你应当对 logistic、SVM、决策树、KNN 及各种聚类方法有深刻的理解。能够随手写出这些算法的核心递归步的伪代码以及他们优化的函数表达式和对偶问题形式。
90. 梯度下降、牛顿法、各种随机搜索算法(基因、蚁群等等)
部分参考答案整理
1. struct 比 class 有更多的限制,详见下面链接
http://t.cn/RWWgs3H
2. 朴素贝叶斯核心思想利用先验概率得到后验概率,并且最终由期望风险最小化得出后验概率最大化,从而输出让后验概率最大化的值(具体概率与先验概率由加入拉普拉斯平滑的极大似然估计而成的贝叶斯估计得到),特征必须相互独立。
3. 方案一:分拆然后分布式,方案二:对应每个数有三个状态,01 代表出现一次,统计 10 亿以内数据,然后看最终哪些是 01 状态
4. 应对非线性分类问题
5. bit 位操作
6. 量纲问题:归一化有利于优化迭代速度(梯度下降),提高精度(KNN)
7. 实操,算法流程:
从数组 1 的尚未比较的元素中拿出第一个元素 array1(i),用 array1(i) 与 array2(j) 进行比较(其中 j > i 且 j < array2 的长度),可能出现下面两种情况,
1. 数组 2 中找到了一个与 array1(i) 相等的元素,则将 array2(j) 与 array2(i) 进行交换,I 加一,进行下次迭代 2. 数组 2 直到结尾也没找到与 array1(i) 相等的元素,则将 array1(i) 与尚未进行比较的最后一个元素 array1(k) 进行交换,i 不加一,进行下次迭代。
8. 重写 equals 方法,对类里面的对象进行属性比较
9. 实操
10. 实操: 为了反转这个单链表,我们先让头结点的 next 域指向结点 2,再让结点 1 的 next 域指向结点 3,最后将结点 2 的 next 域指向结点 1,就完成了第一次交换,顺序就变成了 Header - 结点 2 - 结点 1 - 结点 3 - 结点 4-NULL,然后进行相同的交换将结点 3 移动到结点 2 的前面,然后再将结点 4 移动到结点 3 的前面就完成了反转,思路有了,就该写代码了: 每次都将原第一个结点之后的那个结点放在 list 后面。
11.12.13.14. 实操
15. 处理海量数据问题,无非就是,详细见链接
http://t.cn/RWWeIQA
分而治之 / hash 映射 + hash 统计 + 堆 / 快速 / 归并排序;
双层桶划分
Bloom filter/Bitmap;
Trie 树 / 数据库 / 倒排索引;
外排序;
分布式处理之 Hadoop/Mapreduce。
16. 实操:将原数组看成 ab,需要转换成 ba,先单独对子数组 a 进行反转得到 a'b(a'表示 a 反转后的结果),同理单独反转 b,得到 a'b', 最后将得到的 a'b' 一起进行一次反转可得 (a'b')', 而这就是最终结果 ba 了
17.18. 实操
19. 实操:http://t.cn/S74kdS
22. 先排序,然后遍历数组,每次遍历的元素求是否是前后两个元的和,小于则左边前进,大于则右边后退
23. 分类是事先定义好类别 , 类别数不变, K - 均值聚类算法、K - 中心点聚类算法、CLARANS、 BIRCH、CLIQUE、DBSCAN 等
24. 实操:http://t.cn/RWWeNkz,http://t.cn/RWWejgB
25. 实操,子树问题分两步:
找值相同的根结点(遍历解决)
判断两结点是否包含(递归:值、左孩子、右孩子分别相同)
26. 实操
27. http://t.cn/RWWe3xr
28. http://t.cn/RyrpiFN
29.30. 实操
31. 二叉查找树(二叉排序树)、平衡二叉树(AVL 树)、红黑树、B - 树、B + 树、字典树(trie 树)、后缀树、广义后缀树。详见下面链接
http://t.cn/zTlSadn
32. http://t.cn/RWWD4Qt
33. 实操 34. 见 16,实操 35. 见 28
36. http://t.cn/RWWDcsK
37.1 减去 50 个人生日不同的概率≈100%
38. http://t.cn/RWWDJDC
39. 空间复杂度:快排是 O(n) 归并是 O(2n).
40. http://t.cn/zlZWjUl
41. args 是 Java 命令行参数,我们在 DOS 中执行 Java 程序的时候使用 “java 文件名 args 参数”。args 这个数组可以接收到这些参数。当然也可以在一个类中 main 方法中直接调用另一个类里的 main 方法,因为 main 方法都是 static 修饰的静态方法,因此可以通过类名. main 来调用,这时就可在调用处 main 方法中传入 String[] 类型的字符串数组,达到调用的目的,也可不传入参数。
42. http://t.cn/R2KFGu1
43. http://t.cn/zOkQxik
44. http://t.cn/RtR9OH2
45. http://t.cn/zTBDbep
46.47. 实操
48. http://t.cn/RWWDsy8
49. http://t.cn/R9kq4XN
http://t.cn/zlwcK3x
50. http://t.cn/RWWk5hX
http://t.cn/RWWkIuY
51.52. 53. 实操
54. http://t.cn/RWWkSXb
55. 实操
56. http://t.cn/RvBhxUx
57. 实操
58. 生成是先 P(X,Y) 再 P(Y|X), 判别是 P(Y|X)
59. 实操
60.LDA 提取特征,再用 SVM 做分类
61.62.63. 实操
64.a1 与 a2 值相等,排序完以后两者顺序仍然没变则是稳定排序,稳定排序有插入、冒泡、归并
65. 一样
66. http://t.cn/8Fd6HOZ
67. http://t.cn/RWWk1iN
68. http://t.cn/RWWkk2u
69. 实操
70. 见 19
71. 实操
72. K - 均值聚类算法、K - 中心点聚类算法、CLARANS、 BIRCH、CLIQUE、DBSCAN 等
73. http://t.cn/RWWFhPv
74.75.76.77. 实操
78. http://t.cn/RWWFABs
http://t.cn/RWWF4jx
79. http://t.cn/RWWFtrj
http://t.cn/RViKu8Q
80. http://t.cn/RWWF9C5
81. 实操
82. http://t.cn/RWWFHHa
83. 实操
84. http://t.cn/RWWFBOm
85. http://t.cn/RWWFF9D
86. http://t.cn/RWWsZLW
87.
88. http://t.cn/RWWs4Sk
89.90. 实操