吴军《计算之魂》第一章:大O概念-笔记
1.3 怎样寻找最好的算法?:
这一小节主要介绍了如何在面对一个具体问题时,尽量减少做无用功,从一道“总和最大区间问题”切入,四个算法完成了从时间复杂度 O(n^3) 到 O(n) 的转变。我在力扣上也找到这道题(https://leetcode.cn/problems/maximum-subarray/)

本来力扣原题只需要找出最大值,是不需要进行具体最大值对应区间的下标的(会难一点),我在这里用四种方法找到了并分别用p和q表示区间的左右下标。这四种方法中分治法最精妙也最有意思,和正常人的思维完全不同,倒是很贴合机器的处理方式。而第四种最快的O(n)算法作者在书里写的两遍扫描太麻烦了,就自己另外找了一个更好用更易懂的【在线处理】算法。

1.4 关于排序的讨论:
书中这一节主要介绍排序,其实这几种经典的排序算法都是教案上的老东西了,现如今,更多的日常使用中,比如各种语言内置的或数据处理时使用的排序算法更多是的一种混合排序算法,比如将【快排】和【堆排】结合起来的内省算法(Introspective Sort, i.e. Introsort),就是如今大多数标准函数库STL中排序函数的算法;此外还有Java和Android操作系统内部使用的蒂姆排序(Timsort)等,其实Timsort最初在python中实现,今天仍然是该语言默认的排序算法,具体细节可见源码(https://github.com/python/cpython/blob/main/Objects/listsort.txt)。蒂姆排序速度和快排相当,并具有【稳定性】,便于多列列表的排序,使用广泛。
这里的排序题,力扣上也有(https://leetcode.cn/problems/sort-an-array/)


算法设计就是在尽量“少做无用功”,这话我大概懂了,但是具体操作起来还是很难啊怎么办。另外章节的最后作者给出了“排序算法的复杂度不可能小于O(nlgn)” 的数学证明,大概意思就是因为要进行比较,可以画出一颗“决策树”,相当于N个元素的数组最多有可能会出现N!的序列,要区分这么多种序列,挑出最小一个,至少需要比较log(N!)(即树高)次,使用斯特林公式(Stirling Formula),便可以得出log(N!) ~ O(nlgn)的结论。