算法设计与分析主讲教师林海办公室参考书目算法设计与分析王晓东编著清华大学出版社年月第版评分标准平时成绩出勤作业考察引言计算机科学与算法什么是计算机科学什么是计算机科学计算机科学关注一个问题能否用计算机解决对于一个能用计算机解决的问题至少需要用多少资源时间空间才能解决该问题一个问题能否用计算机解决一个问题能否用计算机解决人们已经证明了有些问题用计算机是不能解决的例如停机问题设计一个程序该程序可以以任意一个程序为输入要求程序能正确判断程序在给定的输入下是否终止是否会陷入死循环事实上有很多问题都不能用
算法设计与分析 主讲教师:林海 办公室:211 email: jlu_linhai@ 参考书目: 1. 《算法设计与分析》,王晓东编著,清华大学出版社,2008年11月第3版 2. Algorithm Design, Jon Kleinberg and Eva Tardos, 2005. 3. Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein, 2009. 评分标准: 平时成绩50%(出勤、作业),考察50%。 1. 引言 --- 计算机科学与算法 什么是计算机科学? 什么是计算机科学? 计算机科学关注: 一个问题能否用计算机解决? 对于一个能用计算机解决的问题,至少需要用多少资源(时间、空间)才能解决该问题? 一个问题能否用计算机解决? 一个问题能否用计算机解决? 人们已经证明了有些问题用计算机是不能解决的。例如, (停机问题)设计一个程序A,该程序可以以任意一个程序B为输入,要求程序A能正确判断程序B在给定的输入w下是否终止(是否会陷入死循环)。 事实上,有很多问题都不能用计算机解决。 我们把能用计算机解决的问题叫做可判定问题,把不能用计算机解决的问题叫做不可判定问题。 计算机本身固有的缺陷 计算机本身固有的缺陷 所有程序的数量为“可数无穷多”,而所有问题的数量为“不可数无穷多”。 所以,在集合论的意义上,所有问题的数量多于所有程序的数量。故,必然存在某些问题不可能用计算机程序得到解决。 计算机本身固有的缺陷 问题 程序 所有问题的分类 什么是计算机科学? 计算机科学关注: 一个问题能否用计算机解决? 对于一个能用计算机解决的问题,至少需要用多少资源(时间、空间)才能解决该问题? 一方面,我们希望计算机能尽量高效地解决问题。 另一方面,问题本身有难易之分。例如,排序问题比查找问题难。 所有问题的分类 如何确定一个问题的难易程度 如何确定一个问题的难易程度 一个问题的难易程度是由解决该问题方法的难易程度决定的。一个简单的问题一定存在一个简单、高效的解决方法。 如何确定一个问题的难易程度 一个问题的难易程度是由解决该问题方法的难易程度决定的。一个简单的问题一定存在一个简单、高效的解决方法。 我们可以定义一个问题的时间复杂度为能正确解决该问题的程序所需要的最短时间。 我们希望找到解决问题的最有效的方法。直观地: 代表一个问题的复杂程度, 代表解决该问题程序的复杂程度。 《算法设计与分析》这门课的内容 我们希望找到解决问题的最有效的方法。直观地: 代表一个问题的复杂程度, 代表解决该问题程序的复杂程度。 例子1 --- 排序 (问题描述) 输入:A[1 .. n] 输出:A[1 .. n] s.t. for all 1 ≤ i < j ≤ n, A[i] ≤ A[j] (复杂度) 直观上:A[1 .. n]中元素两两比较,C2n=O(n2) 实际上:O(n*log2n) 例子2 --- 大整数的乘法 (问题描述) 输入:X, Y(X,Y是位数为n的大整数) 输出:X*Y (复杂度) 直观上:O(n2) 实际上:O(n1.59) 例子2 --- 大整数的乘法 两个n位数的乘法包含n2个彼此独立的乘法运算,例如: 8 5 3 7 6 2 -------------- 1 7 0 6 5 1 1 8 5 9 7 1 ------------------- 6 4 9 9 8 6 例子3 --- 最短路径 问题描述(例子) 例子3 --- 最短路径 Dijkstra给出了一种求最短路径的高效方法,其特点是: 目标:求s到t的最短路径。 实际上:求s到T(t∈T)中每一个节点的最短路径。 例子4 --- 找零钱问题 人民币的面值为:1元、5元、10元、20元、50元、100元。假设需要找n元钱的零钱,怎样才能保证所用的人民币张数最少? 贪婪方法(优先选面值最大的人民币): 77 = 50 + 20 + 5 + 1 + 1 (5张人民币) 例子4 --- 找零钱问题 贪婪方法是否