算法图解笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)每个单元格都是一个子问题,需要适当地将问题分成子问题。