在CSDN上看到这哥的后台开发面试问题整理,覆盖面还算比较全,这里拿出来强答一发。这里,我可能会额外加入几个自己想到的试题。
题目列表
- 了解哪几种排序方式?有没有 O(n) 的排序
- 平衡二叉树的插入
- 二叉查找树
- 10 个 G 的最高访问 Ip 统计
- 倒排索引
- 常用缓存置换算法
- Lru算法的实现及优化
- 堆和栈的区别
- 常用 hash 算法
- md5、sha1 的实现
- 一万个 url 的快速查找
- 两个有序数组找并集的优化
- 10亿个整数中找最大的 100 个,用 O(n)
- RSA加密原理(附加)
题解
了解哪几种排序方式?有没有 O(n) 的排序
- 冒泡排序、快速排序、堆排序、直接(或二分)插入排序、希尔排序、归并排序、基数排序
- 在一些限制条件下有O(n)的排序
平衡二叉树的插入
看这里吧。总结旋转的4条规则
- LL旋转
- RR旋转
- LR旋转 先左子树RR,自己再LL
- RL旋转 先右子树LL,自己再RR
二叉查找树。
这题是要干嘛!!!还是不管他了!
让来面试的自称有男朋友的妹纸用C语言实现一个红黑树吧。
10 个 G 的最高访问 Ip 统计
10个G的IP,如果4字节一个来算的话,大约250亿个。
- 如果重复率高,内存足够,直接用hash表计数即可
- 如果重复率低,那就先将10G文件通过hash分组到多个文件中,之后分别对每个文件进行hash计数。
倒排索引
引用wiki
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
有两种不同的反向索引形式:
- 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
- 一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置。
后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建。
常用缓存置换算法
- FIFO 先进先出 常规实现 队列
- LRU Least Recently Used 最近最久未使用算法 常规实现 链表
- LFU Least Frequently Used 最近最少使用算法 常规实现 小顶堆
Lru算法的实现及优化
常规实现是一个双向链接+hashmap。时间复杂度为O(1),基本上没什么优化空间了。
通常优化会集中在内存方面,即双向链接这块的内存占用。如redis会会使用近似lru算法来优化掉双向链表
堆和栈的区别
不知道这题为啥被放到了这里。
- stack区 由编译器自动分配释放,为连续的空间,向底地址增长,存放局部变量,函数参数等数据。
- heap区 一般由程序员主要分配释放,如malloc,free,new,delete。分配方式类似链表,底层通过调用brk和mmap进行分配
- 理论上stack区的数据操作效率比heap区要高
常用 hash 算法
- 复杂散列算法如md5,sha1
- 简单散列算法如ELF,SDBM,RS,FNV等
md5、sha1 的实现
不至于真考这种题吧,汗!
一万个 url 的快速查找
一万个 url,扔hash表里不就好了。没明白这题是想考啥。不像是要考trie,AC自动机这些东西
两个有序数组找并集的优化
归并的思路,时间复杂度最坏的情况 O(max(m,n)) 了,没得优化了。
10亿个整数中找最大的 100 个,用 O(n)
真正的 O(n) 谁能做到麻烦告知下
- TopN问题,常规思路是用一个堆,之后不断地取新数据更新这个堆,更新完后即可得到结果。但这个复杂度是 O(nlgm)
- 如果整数的范围不大,内存也足够的话,可以用一个char数组来计数。之后倒序找出最大的100个。这个理论上能在 O(n) 内。
RSA加密原理(附加)
欧拉函数n有比它小的互质数的个数Phi(n)=n*(1-1/p1)(1-1/p2)... p是其质因数
欧拉定理a与n互质则(a^Phi(n))%n==1 => (a^(p-1))%p=1(p质数)
质数p,q,p!=q,N=pq,r=(p-1)(q-1)
选择一个e(e<r),求得e关于模r的模反元素d
(N,e)是公钥,(N,d)是私钥
加密ne ≡ c (mod N) 解密cd ≡ n (mod N) (n为信息,c为加密结果)
cd ≡ n e·d(mod N)
作者原创,转载请注明出处