下面将按照本书的顺序做一下读书笔记的整理。
1.大O表示法
大O表示法表示的为算法运行的时间复杂度,但不是以秒为单位,而是表示随着操作数n的变大,算法运行时间的增速。
是操作数为n下的查找次数,是指在最糟糕情况下的运行时间复杂度。
常见的二分查找时间复杂度为o(log n),在大O表示法中讨论时间log都是以2为底的对数,快排时间复杂度为O(n*log n),划分成log n 层,每一层的时间复杂度为n。
2. 数组和链表
数组的元素存储在一起,链表的元素分开存储,每一个元素都存储了下一个元素的地址;数组读取快,链表插入和删除快。
3.递归
每一个递归函数都有两部分组成,基线条件和递归条件。基线条件是指函数不在自己调用自己,即递归停止的条件。递归条件就是自己调用自己。
4. 分而治之
分而治之是一种递归式解决问题的办法,需要将问题逐步化小。
工作原理:(1)找出简单的基线条件,当涉及数组时,基线条件一般为数组为空或者数组只包含一个元素
(2)确定如何缩小问题的规模,使其符合基线条件。(经典的分治算法:快速排序)
5. 散列表
散列表就是常说的哈希结构,字典数据结构,由键值对组成,模拟映射关系,可以防止重复,缓存记住数据,以免服务器在生成他们。
当两个键映射到同一个位置时,在这个位置用一个链表存储不同的值。
6.广度优先搜索
广度优先搜索是一种用于图结构的查找算法,用于解决两类问题:1. 是否有从A到B的路径。2. 从A到B的最短路径是多少。
图由节点和边组成,模拟不同东西是如何相连的,与一个节点直接相连的多个节点被称为邻居,两个节点之间有箭头指向,被称为有向图,无箭头指向被称为无向图,编程时用字典模拟这种数据结构。
在用BFS算法实现最短距离(只要最短、最近的什么东西就行,不仅仅是距离)查找时,需要用队列这种数据结构来实现,队列时先进先出,栈是后进先出。
BFS查找最短路径的方法:
1. 将问题建模为图结构
2. 用数据结构实现图结构
3. 实现BFS算法(只有按数据的添加顺序去找,才能实现这种目的)
必须按照加入顺序去检查搜索列表中对象,否则找到的就不是最短路径,因此搜索列表必须是队列,对于检查过的对象,务必不要再去检查,否则可能导致无限循环。
7. 贪婪算法
当一个问题不可能完成时,或者没有快速算法时,这就是一个NP完全问题,我们要学会识别它,以免浪费时间去寻找快速算法,应学习近似算法,使用它们可以快速找到NP完全问题的近似解,常用的近似算法有贪婪算法。
贪婪算法简单易行,每一步都采取最优的做法,每一步都选择局部最优解,最终得到的就是全局最优解,但并不是在所有情况下都有效。
比较经典的问题有旅行商问题,集合覆盖问题。
在集合覆盖问题中,每一次选择一个广播台,它可以覆盖最多未覆盖的州,即使已经覆盖了一些重复的。一直重复,直到覆盖了所有的州。需要用集合set来实现。
旅行商问题中,随机选择出发的城市,然后每次选择要去的下一个城市时,都选择还没去的最近的城市,以此类推,这是个近似解。
如何判别NP完全问题?
1. 元素少,运行开,元素增多,运行非常慢,2 . 涉及所有组合,3. 不能将问题分成小问题,必须考虑各种情况,3. 问题中涉及序列(如旅行商中的城市序列)且难以解决,4, 问题中涉及集合(广播台集合)且难以解决,5,可转换为旅行商或者集合覆盖问题。
8.动态规划
动态规划就是将某个指标最大化,
可在有约束条件下找到最优解,
可以将问题拆分成彼此独立且离散的子问题,
每种动态规划解决方案都设计网格,
单元格中的值就是你要优化的值,每一个单元格都是一个子问题,因此应考虑如何将问题划分成子问题,有助于找到做坐标轴。
没有一个统一的动态规划解决方案的公式。
比较经典的使用动态规划的题目有:求最长公共子串(连续公共最长),最长公共子序列(非连续,一样即可)。