算法与数据结构的关系:算法的实现依赖于数据结构的设计,尽管在设计算法步骤时可以不考虑数据结构,但算法在计算机上与采用的数据结构密切相关。算法的效率与数据结构有一定的关系,但并不是数据结构越简单算法的效率就会越高。
1.算法的特性
有穷性:执行有穷步之后结束
确定性:每一条指令都必须有确切含义
有效性:每个步骤都能有效执行并能得到确定结果
输入>=0个,输出>=1个
2.算法设计目标
正确性:应满足具体问题的需求
可读性:便于阅读和交流
健壮性:输入数据非法时,能适当的做出反应或进行处理,不会产生莫名其妙的输出结果
效率与低存储需求:效率是指算法的执行时间,存储量需求是指算法执行过程中所需的最大存储空间
3.算法的复杂度
空间复杂度:算法在运行过程中临时占用存储空间大小的度量
时间复杂度:程序运行从开始到结束所需要的时间。
常见的对算法执行所需时间的度量:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)
O
(
1
)
<
O
(
l
o
g
2
n
)
<
O
(
n
)
<
O
(
n
l
o
g
2
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
2
n
)
O(1)是指时间复杂度为常数级的,单条语句
O(n)单层循环
O(n^2)双层循环
O(n^3)三层循环
O(log2 n)排序二叉树查找键值,n为结点数量,log2 n 为比较的次数
O(n log2 n)
4.常用经典算法
迭代法:用于求方程或方程组近似根的一种常用算法。
穷举搜索法:对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。
递推法:利用问题本身所具有的一种地推关系求问题的解。典型用法是整数的阶乘。
整数阶乘:
n!=(n−1)!×n
n
!
=
(
n
−
1
)
!
×
n
递归法:设法将问题分解成一些规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解方法和综合方法。递推阶段,把复杂问题的求解推到较简单的问题求解上;回归阶段:获得最简单情况的解后逐级返回,获得稍复杂问题的解。典型用法是菲波那切数列和背包问题。
菲波那切数列:
F0=0,F1=1,Fn=Fn−1+Fn−2
F
0
=
0
,
F
1
=
1
,
F
n
=
F
n
−
1
+
F
n
−
2
背包问题:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
分析:如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中
回溯法:也称为试探法。放弃当前候选解去寻找下一个候选解的过程称为回溯;扩大当前候选解的规模并继续试探过程称为向前试探。典型用法是n皇后问题。
n皇后问题:在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
贪心法:一种不追求最优解,只希望得到较为满意解的方法。典型用法是装箱问题、马踏棋盘问题。
装箱问题:有n和物品,每个物品体积v1, v2, v3……大小不一,但是都小于箱子体积大小V,现在将所有物品都打包装进箱子,要求装完这些物品之后打开的箱子数量尽量小,求打开的箱子数量是多少?
分析:将所有物品按照体积大小降序排列,按照箱子打开的顺序,每一次从头遍历箱子结点,看打开的箱子的剩余体积能不能放下当前物品,直到遍历完所有已经打开的箱子还是放不下,就打开一个新的箱子。
马踏棋盘问题:
分治法:把大问题的解分解成一些较小的问题,然后由小问题的解方便地构造出大问题的解。典型用法是Hanoi塔、比赛日程安排。
Hanoi塔:
比赛日程安排问题:
动态规划法:与分治法类似,将大问题分解成子问题,先求子问题,然后从这些子问题的解得到原问题的解,子问题往往不是独立的。
231

被折叠的 条评论
为什么被折叠?



