算法图解笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《算法图解》

第一章算法简介

1、二分查找:其输入必须是一个有序的元素列表

2、简单查找:每次猜测只能排除一个数字

※对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。

3、选择算法的方法:选择效率最高的算法,以最大限度地减少运行时间或占用空间。

4、线性时间:最多需要查找的次数与列表的长度相同。------O(n)<最糟糕的情况下>

5、二分查找的运行时间为对数时间(或log时间)。------O(log2n)

6、二分查找与简单查找的运行时间的增速不同。

7、大O表示法能够比较操作数,指出了算法运行时间的增速。

8、大O表示法:O(操作数)

9、二分查找的速度比简单查找的速度快得多。需要搜索的元素较多,最好选用二分查找。

10、算法的运行时间不是以秒为单位,是从其增速的角度度量的。

第二章选择排序

1、需要同时读取所有元素时,链表的效率很高。

2、仅当能够立即访问要删除的元素时,删除操作的运行时间才为O(1)。

3、数组支持随机访问,链表支持顺序访问。

4、链表数组结构查找速度比数组慢,其他方面和链表相当。

5、在同一个数组中,所有元素的类型都必须相同。

第三章递归

1、每个递归函数都有两部分:基线条件和递归条件。

2、调用另一个函数时,当前函数暂停并处于未完成状态。

3、调用栈:用于存储多个函数的变量的栈

4、递归函数没完没了地运行时,栈将不断地增大。每个程序可使用的调用栈空间都有限,程序用完这些空间(终将如此)后,将因栈溢出而终止。

5、所有函数调用都进入调用栈,调用栈可能很长,这将占用大量的内存。

第四章快速排序(分而治之)-------D&C算法

1、使用D&C解决问题的过程:

(1)找出基线条件,这种条件必须尽可能简单

(2)不断将问题分解(或者说缩小规模),直到符合基线条件

2、编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。

3、快速排序的基准值==哨兵位

4、合并排序的运行时间为O(n log2n)

5、快速排序在最糟情况下运行时间为O(n²),平均情况下运行时间为O(n log2n)。

6、快速排序的常量比合并排序小,如果它们的运行时间都为O(n log2n),快速排序的速度将更快。

第五章散列表

1、散列函数:将不同的输入映射到不同的数字

2、散列函数+数组=散列表

3、DNS解析:将网址映射到IP地址,可使用散列表实现

4、散列表的应用:查找、防止重复、缓存

5、散列表的冲突:给两个键分配的位置相同。最简单的解决办法:在这个位置存储一个链表。

6、不管数组多大,从中获取一个元素所需的时间都是相同的。

7、使用散列表时,避免冲突的方法:较低的填装因子、良好的散列函数。

8、散列表的查找、插入和删除速度都非常快。

9、散列表是无序的,因此添加键值对的顺序无关紧要。

了解:1、填装因子=散列表包含的元素数/位置总数

2、填装因子大于1时需要调整长度(通常将数组增长一倍)

3、填装因子越低,发生冲突的可能性越小,散列表的性能越高。

4、一旦填装因子大于0.7,就调整散列表的长度

5、良好的散列函数让数组中的值呈均匀分布

第六章广度优先搜索-------解决最短路径问题(段数最少)

1、图由节点和边组成,直接相连的节点相互之间称为邻居(注意有向图和无向图的区别)

2、广度优先搜索算法理解:有没有?有的话最短是?

3、队列的使用

4、广度优先搜索的运行时间为O(V+E)

5、拓扑排序:有序列表,如果任务A依赖于任务B,在列表中任务A必须在任务B后面。

6、树是一种特殊的图,其中没有往后指的边。树是图的子集。

第七章狄克斯特拉算法-------寻找加权图中的最短路径(总权重最小)

1、狄克斯特拉算法用于每条边都有关联数字(权重)的图

2、狄克斯特拉算法只适用于有向无环图。

3、如果有负权边,就不能使用狄克斯特拉算法。

4、扩展:贝尔曼-福德算法可以找出包含负权边的图的最短路径

第八章贪婪算法

1、贪婪算法:每步都选择局部最优解,最终得到全局最优解。

2、近似算法:在获得精确解需要的时间太长时,可使用近似算法,得到的近似解接近于最优解,而且速度较快。

3、集合不能包含重复的元素,列表可以包含重复的元素。

4、NP完全问题的特点:

(1)元素较少时算法的运行速度非常快,随着元素的增加,速度会变得非常慢。

(2)涉及“所有组合”的问题通常是NP完全问题

(3)不能将问题分成小问题,必须考虑各种可能的情况。

(4)问题涉及序列(如旅行商问题)或集合(如广播台问题)

(5)问题可转换为集合覆盖问题或旅行商问题

5、对于NP完全问题,还没有找到快速解决的方案,最佳的做法是使用近似算法。

6、贪婪算法易于实现、运行速度快,是不错的近似算法。

第九章动态规划----背包问题的解决

1、动态规划算法原理:先解决子问题,再逐步解决大问题。

2、使用动态规划时,要么考虑拿走整件商品,要么考虑不拿,而没法判断该不该拿走商品的一部分。

3、仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才适用。

4、根据动态规划算法的设计,最多只需合并两个子背包,即根本不会涉及两个以上的子背包,这些子背包可以又包含子背包。

5、动态规划在给定约束条件下找到最优解。

6、网格的绘制和填充:

(1)单元格中的值是需要优化的值。

(2)每个单元格都是一个子问题,需要适当地将问题分成子问题。

相关文档
最新文档