数据结构是算法的基础,算法的操作对象是数据结构。
数据结构关注的是数据的存储方式,确定求解问题中的数据是按照链式结构,还是顺序结构来存储,以及数据的逻辑结构和基本操作。
算法设计就是在选定的数据结构上设计出一个好的解决问题的算法。
算法是编程思想,数据结构是是这些思想的的逻辑基础。
算法的复杂性是算法效率的度量,一个算法的复杂性的高低,就体现在运行该算法的计算机所需要的资源的多少。
时间复杂性的三个记号:上确界O,下确界,。
算法思想:穷举法,分治,贪心,回溯,动态规划,分支限界
分治法
将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同;对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止;将求出的小规模的问题的解合并为一个更大规模的问题的解
实例:快排,二路归并排序
贪心法
对问题求解时,总是做出在当前看来是最好的选择,然后再对当前选择之后的子问题进行贪心求解
贪心法求解的问题,问题本身具有性质
贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
最优子结构性质:如果问题的最优解所包含的子问题的解也是最优的。
动态规划
分治的过程中出现的子问题有重复的部分。
实质是:分治思想,解决冗余 。 存储子问题的解而避免计算重复的子问题
问题具有的性质
有最优性原理、无后效性和有重叠子问题
无后效性:某阶段状态一旦确定,就不受这个状态以后决策的影响
自底向上的计算出最优解:列表
分治法与动态规划的异同
相同点是:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
不同点是:适合于用动态规划法求解的问题,各个子问题往往不是互相独立的。而用分治法求解的问题,各个子问题往往是互相独立的
贪心法与动态规划
贪心法:当前状态下,局部最优选择,然后求解做出此选择之后的子问题。贪心选择依赖于以往做出的选择,但不受将来所作选择的约束。
动态规划法:每步所作的选择依赖于相关子问题的解,只有在解出相关子问题以后,才能做出选择。
回溯法
回溯法是按深度优先策略搜索问题的解空间树算法。从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
求解问题的步骤:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
分支限界
在问题的解空间树上以广度优先或最小耗费(最大效益)优先方式搜索问题的满足约束条件的一个解或最优解
实现:1、队列FIFO分支限界法 2、 优先队列式分支限界法
搜索策略
在搜索解空间树时,每一个活结点只有一次机会成为扩展结点。扩展结点一次性产生其所有儿子结点。在这些儿子结点中,
导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中按一定的策略取下一结点成为当前扩展结点,并重复上述结点扩展过程。