算法图解-学习笔记

第四章:

本章通过农场主划地的例子引入分而治之(D&C)的思想,快速排序正是使用了这种分而治之的策略。

例子1:农场主划地

假设有一个农场主,他有一块地。他想将这块地均匀的分成方块,且使分出的方块尽可能大。

如图所示一直分下去;如果剩余形状的长是宽的整数倍,则为分割的基准条件,即完成分割,方块的边长为剩余形状的宽,且为可分的最大方块。

如果不能理解分出的方块即为可分得的最大方块:可参见欧几里得算法的思想(最大公约数算法);即蓝色土地块可分得的最大方块和去掉红色方块后的蓝色部分可分得的最大方块是一样的,且为两者的最大公约数。

练习4.1 请编写前述sum函数的代码。

 

练习4.2 编写一个递归函数来计算列表包含的元素数。

 快速排序代码

 合并排序和快速排序:

在常见排序算法中,合并排序和快速排序是典型的分治算法,其时间复杂度的平均性能均为nlgn。合并排序的最坏时间复杂度也能保持nlgn,而快速排序的最坏时间复杂度却为n*n合并排序是稳定的,而快速排序不是稳定的。

合并排序又称归并排序,主要的思想是:将待排序列拆分至数个足够小的子序列,然后将相邻子序列合并为一个有序子序列,重复合并相邻有序子序列直到整个序列有序。

快速排序的主要思想:将待排序列拆分为左右两个子序列A,B,使得子序列A的元素都小于子序列B,然后对子序列A,B继续进行这种拆分,直到待拆分的序列足够小,最后整个序列变成有序。

大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。

比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(logn)的速度比O(n)的速度快得多。

第五章:

散列函数定义:即“将输入映射到数字”

要求:1、它必须是一致的,2、它应将不同的输入映射到不同的数字。

注意:数组和链表都被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。

python中使用字典来作为散列表。

缓存的应用:网站

原理:网站将数据记住,而不再重新计算,所有大型网站都使用缓存,而缓存的数据则存储在散列表中。

散列表的适用条件:1、模拟映射关系,2、防止重复,3、缓存/记住数据,以免服务器再通过处理来生成它们。

冲突:给两个键分配的位置相同。

如何避免冲突?1、散列函数很重要,好的散列函数很少导致冲突2、较低的填装因子(度量的是散列表中有多少位置是空的)。

若填装因子大于0.7,就调整散列表的长度。

散列表非常适合用于防止重复。

 

第六章:广度优先搜索

解决最短路问题的算法被称为广度优先搜索。

 

posted @ 2018-06-30 11:45  沐阳静枫  阅读(156)  评论(0编辑  收藏  举报