题1. 求n个数中的最大值和最小值,最少的比较次数是 3n2 .
解析:最大值和最小值是有逻辑关系的,一个比最大值大的数不需要和最小值去比较;同样,一个比最小值小的数不需要跟最大值比较.
将所有数两两分成一组,共n/2组,进行比较值大的归为新的一组tmax,值小的归为另一组tmin, 再分别和max和min比较,比较了2个n/2次.
左右值数
即“前序遍历树“,有如下特征:
1. lft < rgt
2. lft 小于任何子节点(包括子孙节点)的lft
3. rgt 大于任何子节点(包括子孙节点)的lft
4. 由于左右值是自然数致密分配,子树节点=(rgt - lft - 1) / 2
循环队列
循环队列内有效长度为:$(rear - front + N) % N
HashTable
“哈希取模“是实际工程中去hash code的方法。
P_K = hash(K) mod N
解决hash(K) < 0 的问题,优化为:
h(k) = ((k mod N) + N) mod N
单向链表
有两个较长的单向链表a和b,想要找出同时存在于链表a和b中的节点node,请设计空间使用尽量小的算法。
分析
如果有相同的节点,那么首个相同的节点之后的所有节点都相等,a和b的单向链表将会是横着的Y字型。
算法
- 遍历a和b得到链表长度lenA和lenB
- 假设lenA > lenB, fix iA = lenA - lenB, iB = 0
- 再次遍历a,跳过iA个节点
- a和b做merge遍历
HashTable and BloomFilter
HashTable 冲突大的时候,尝试不同的hash函数,在桶内需要处理字符串比较。
BloomFilter,适用于key较多的时候
- Insert only
- 有一定误判率
- 空间需求大大减少
Huffman Code
字符串“alibaba”的二进制哈夫曼编码有_位。
算出来9位,答案13位,答案 = my answer + x * n where n is the number of characters and x = 1, 2, 3…
Skip List insert操作最坏情况的时间复杂度是O(N).
用数组表示座位,链表描述每个座位的售票情况。
Red-black Tree
插入操作解决红红冲突
删除操作解决黑黑冲突
B & B+ Tree
- 都可用于文件的索引结构
- 都能有效地支持顺序检索
- 有效支持随机检索
- 存储空间类似
Merge sort usually takes O(nlogn) time but inserve array may cost O(n^2) time.
冒泡排序的算法复杂度较低。
在长度为n的数组内,找到升序排在n/5位置的元素的最优算法时间复杂度是O(n).