基础算法总览复习
最近正在上左神的算法基础课,左神讲的非常透彻,重要的还是课下把课上讲的和作业的自己实现并且加以复习。
这篇复习集(姑且取个名字)总结下个人在这段时间学习到的算法topics,这样方便我以后回来复习。
¶排序 Sort
直接上干货
Sort Algorithm
Time Complexity
Space Complexity
Stability
Selection Sort
O(N²)
O(1)
False
Bubble Sort
O(N²)
O(1)
True
Insertion Sort
O(N²)
O(1)
True
Merge Sort
O(N*logN)
O(N)
True
Heap Sort
O(N*logN)
O(1)
False
Quick Sort
O(N*logN)
O(logN)
False
Bucket Sort
O(N)
O(N)
True
归并排序,堆排序,和快速排序是最快并且最方便使用的三种排序。根据需求选择需要的排序算法。
桶排序包括了 计数排序和基数排序,桶排序尽管很快但是对数据状况有要求,例如计排要求数据状况处于一个相对窄的域,基数排序要求样本都为十进制数
对于使用递归调用的排序算法可利用Master Theorem分析时间复杂度:
适用于子过程(subprocess)缩小的规模都是 n/b,调用a次subprocess(且都是等规模地缩小),加上其他的 f(n) 或者 可以表示为 O(n^d)的 时间操作。
这样就能细分为三种情况:
- log b (a) < d => O(n^d)
- log b (a) > d => O(n^(log b (a)))
- log b (a) = d => O(n^(d) * log(n))
快排:不追求稳定性,指标最优,常数最优。
堆排:追求更少的额外空间复杂度。
归并:追求稳定性。
¶排序相关练习题目
- 局部最小: arr无序,相邻不相等,返回任意一个局小index
- 提出奇次数:arr中只有一个数出现了奇数次,其余为偶数次,找到这个数
- 拓展:有两个数出现奇数次,其余为偶数次,找到这两数
- 小和(small sum):arr中一个数左边比当前数小的数累加起来,叫做这个数组的小和,求arr 的小和
- 逆序对:一个arr中左边的数如果比右边的数大,则这两个数构成逆序对,打印所有逆序对
- 几乎有序的数组,每个元素排好序最多不移动k距离,求最好的排序算法排序
- 荷兰国旗
¶链表 Linked List 和
¶哈希表(字典)Hash Table
单链表和双向链表是重要的数据结构
关于链表, 基础的问题有:
- 反转单向链表和双向链表
- 打印两个有序链表的公共部分
进阶一点的问题有:
- 判断一个链表是否为回文结构(palindrome)
- 复制含有随机指针节点的链表
- 两个单链表相交的问题
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!