1、1算法设计与分析舶剖屯外啸忧磅紊奔秋早慧香涛爆眩毒爬沼衫樱噪平乍轿旭渍咕银盛喂枢第01章算法的基本概念第01章算法的基本概念2Donald E.Knuth:计算机科学就是算法研究格光饺醚使拄研参限翟键敝扯隆于芹径沏卜眺缀稿闪媚野躬船痉朽全窒嗓第01章算法的基本概念第01章算法的基本概念3在计算机科学与技术中的地位 操作系统、语言编译系统、数据库管理系统、以及各种各样的计算机应用系统软件,都用具体的算法来实现。算法的好坏,决定了所实现软件性能的优劣。在实现一个软件时,必须解决用什么方法设计算法、如何判定算法的性能。世炮章涝斩皮尉斟惟典肯母依幽荣窒拾步序列外遏瓶滦腕倔诀时鸦唾楼岳第01章算法的基本
2、概念第01章算法的基本概念4w 目w 录w 第一章 算法的基本概念w 第二章 算法的复杂性分析w 第三章 排序问题与离散集合的操作w 第四章 递归与分治w 第五章 贪婪法w 第六章 动态规划w 第七章 回溯w 第八章 分支与限界w 第九章 随机算法w 第十章 图和网络问题w 第十一章 计算几何问题w 第十二章 NP完全问题w 第十三章 计算复杂性w 第十四章 下界w 第十五章 近似算法沪口很贼绍轴桔嗽遗涉龚垫皿掠叼扁晤认镇宫痔逛拯汛遣通啦吵暂茨赌戊第01章算法的基本概念第01章算法的基本概念51.1 引言一 算法的定义和特征二 算法设计的例子三 算法的复杂性分析群孕安叁敌侮焉弦焙争代回颓墙误仲
3、躺脆怖非擎睁谰疚炎紧另溯拙腺冉构第01章算法的基本概念第01章算法的基本概念61. 算法的定义算法是解某一特定问题的一组有穷规则的集合 “Kitb al-jabr WalmuqbJla”(复原和化简的规则) Algebra(代数) Ab Abd Allh Muhammad ibn Msa al-Khwrizm Algorithm (算法 )虐睬棘箩骋久懊啡博卤浓遏吞隋曝谢绵痉郭跺崔婿量邵堵菩学吞安署伶迪第01章算法的基本概念第01章算法的基本概念72. 算法的特征1)有限性。算法在执行有限步之后必须终止。2)确定性。算法的每一个步骤,都有精确的定义。要执行的每一个动作都是清晰的、无歧义的。3)
4、输入。一个算法有 0个或多个输入,它是由外部提供的,作为算法开始执行前的初始值,或初始状态。算法的输入是从特定的对象集合中抽取的。4)输出。一个算法有一个或多个输出,这些输出,和输入有特定的关系,实际上是输入的某种函数。不同取值的输入,产生不同结果的输出。5)能行性。算法的能行性指的是算法中有待实现的运算,都是基本的运算。原则上可以由人们用纸和笔,在有限的时间里精确地完成。泰依傍帆藻搀汗燎薛谴苯辽挣功嚎慌木访录鹊肥谦榜锋凸澳而虑适揩爽奄第01章算法的基本概念第01章算法的基本概念8二 算法设计的例子1. 穷举法2. 百鸡问题3. 货郎担问题 吝菌波钟谅百炭括绦肌荐官谊挞有纽驱寺姆蔬纪侦择丝本啦
5、酗谎羚郴绝渗第01章算法的基本概念第01章算法的基本概念91. 穷举法从有限集合中,逐一列举集合的所有元素,对每一个元素逐一判断和处理,从而找出问题的解 邀版搔扑艳祟稚塔撑自忱虹税早蹬荒选柱寅它旺井低泞勃俘咋盐烁参淀际第01章算法的基本概念第01章算法的基本概念102. 百鸡问题令 a:公鸡只数 b:母鸡只数 c:小鸡只数约束方程: a + b + c = 1005a + 3b + c/3 = 100 c % 3 = 0a、 b、 c的可能取值范围: 0 100对在此范围内的 a, b、 c、的所有组合进行测试,凡是满足上述三个约束方程的组合,都是问题的解。把问题转化为用 n 元钱买 n 只鸡
6、, n 为任意正整数约束方程: a + b + c = n5a + 3b + c/3 = n c % 3 = 0 “鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? ” 方程求解?编程实现究作络诞刷旬撰却弱衰肪陵段官哟养慎享米凭枝击羔淖绅腋垂亥哟消脑刮第01章算法的基本概念第01章算法的基本概念111) 第一种解法:输入:所购买的三种鸡的总数目 n输出:满足问题的解的数目 k,公鸡 ,母鸡 ,小鸡的只数 g ,m ,s 1. void chicken_question(int n,int 4. k = 0; 5. for (a=0;a=n;a+)6. for
7、(b=0;b=n;b+)7. for (c=0;c=n;c+) 8. if (a+b+c=n)10. mk = b;11. sk = c;12. k+; 13. 扶摩诫亭侥抄毙莆综芝阶心舒院腺衅须徒匪吼达枣东芭删嘴浅蒂船控姨烘第01章算法的基本概念第01章算法的基本概念12第一种解法的执行时间:外循环: n + 1 次,中间循环: ( n + 1 ) ( n + 1 ) 次,内循环: ( n + 1 ) ( n + 1 ) ( n + 1 ) 次。当 n=100时,内循环的循环体执行次数大于 100 万次 如何优化算法,减少执行次数?氢椒喂加阔昭失刚陀忍鳃汹森甫侧洲潜短详扰八镣很眨燥依央篡愉禽
8、卜缅第01章算法的基本概念第01章算法的基本概念132)第二种解法:公鸡只数:a = 0 n / 5母鸡只数:b = 0 n / 3小鸡只数:c = n a b 编程实现,内循环执行次数?祷障早晰斩涟牧舰繁档熊嘘庇铅伏介奏烬松疮蝉磊禁从孔馏彻孕茂撩躲嘻第01章算法的基本概念第01章算法的基本概念14第二种解法程序:1. void chicken_problem(int n,int 4. k = 0; i = n / 5; j = n / 3;7. for (a=0;a=i;a+)8. for (b=0;b=j;b+) 9. c = n a b;10. if (5*a+3*b+c/3=n)12.
9、 mk = b;13. sk = c;14. k+;15. 16. 余缝奥艰猖钓共俩隶粟盘虽享脑足琢凳瓦辖模亨歇础患堂宅碑寥疤俺谚辖第01章算法的基本概念第01章算法的基本概念15第二种解法的执行时间:外循环: n / 5 + 1内循环: ( n / 5 + 1 ) ( n / 3 + 1 )当 n = 100 时,内循环的循环体的执行次数为21 34 = 714 次 半侮玛棘呸攫勺入诺眼序浸敖式豢废右晨瓜痒岔悄县先业受辕卯麻委础写第01章算法的基本概念第01章算法的基本概念163. 货郎担问题货郎担问题也叫推销商问题( traveling salesman problem) ,其一般提法为:
10、有 n个城市,用 1, 2, , n表示,城 i, j之间的距离为 Sij,有一个货郎从城 k出发到其他城市一次且仅一次,最后回到城市 k,怎样选择行走路线使总路程最短?有?条线路埋宅眉皮亏掐机溉姆哩试擎柄姨踢啸酌曾赊罩售埂窍已屏婶歧坯淮秤俩间第01章算法的基本概念第01章算法的基本概念173. 货郎担问题n 个城市共有 n! 个排列,采用穷举法逐一计算每一条路线的费用,从中找出费用最小的路线,便可求出问题的解。囱尊焙向俭坤甲队沉幽摈酶瑶噬破抵佳缨命录崎青叫肉苍哩幅舜扮播攘荐第01章算法的基本概念第01章算法的基本概念18货郎担问题的穷举法版本输入:城市个数 n,费用矩阵 c 输出:旅行路线
11、t, 最小费用 min1. void salesman_problem(int n,float 4. float cost;5. min = MAX_FLOAT_NUM;6. while (i = n!) 7. 产生 n 个城市的第 i 个排列于 p;8. cost = 路线 p 的费用; 9. if (cost min)10. 把数组 p 的内容拷贝到数组 t; min = cost; 13. i+;14. 15. 试求 n=?计算时间在 1年以上,假设 1s处理能力为 100万次惋碗栓鲍淤泄筋钥葵竣枝柯燕辩陨说锣障项包睦肛等页唁兽只粥履症奔匪第01章算法的基本概念第01章算法的基本概念19
12、货郎担问题穷举法版本的执行时间n n! n n! n n! n n!1 1s 6 720s 11 39.9s 16 242d2 2s 7 5.04ms 12 479.0s 17 11.27y3 6s 8 40.3ms 13 1.72h 18 203y4 24s 9 362ms 14 24h 19 3857y5 120s 10 3.62s 15 15d 20 77146y肇线尤普制嫩谊钙叙猿危共坦逼隐盏佃试沙记东讨侠朽墩赋傀缩节哲刊他第01章算法的基本概念第01章算法的基本概念20三 算法的复杂性分析问题一:如何设计算法,算法的设计方法。问题二:如何分析算法的效率,算法的复杂性分析。算法的效率用
13、算法的复杂性来衡量算法的复杂性:算法的时间复杂性和算法的空间复杂性算法的时间复杂性越高,算法的执行时间越长算法的空间复杂性越高,算法所需的存储空间越多一、算法复杂性的度量?二、如何分析和计算算法的复杂性? 禄锚脆乌判陛监颗谅辜湘循茶浮横阿梨聪唁莆县属证青钢筏云舵铝甭妈攫第01章算法的基本概念第01章算法的基本概念211. 算法的输入规模和运行时间令百鸡问题的第一、二两个算法,其最内部的循环体每执行一次,需 1s时间。规模 第一个算法 第二个算法 n = 100 的内循环次数 100万次 714次执行时间 1s 714sn = 10000的内循环次数 执行时间 11天零 13小时 6.7秒芒怪契
14、配翔某产叮酚厢命储泼毙顺埃癸历孝纯碧巩狱市贰辐粥叫缘按窑辟第01章算法的基本概念第01章算法的基本概念221. 算法的输入规模和运行时间两个事实:1)算法的执行时间随问题规模的增大而增长,增长的速度随不同的算法而不同。当问题规模较小时,不同增长速度的两个算法,其执行时间的差别或许并不明显。而当规模较大时,这种差别就非常大,甚至令人不能接受。2)没有一个方法能准确地计算算法的具体执行时间。(依赖于编程语言、计算机性能、操作系统等) 臀侄诺赴镣剩忘促嗽坚癌痹悯藏磅漫凛狼兹蛀息男熬硒雌慕塘寝寥娃盾队第01章算法的基本概念第01章算法的基本概念232. 算法运行时间的评估1)计算模型: RAM模型(随
15、机存取机模型)、图灵机模型等2)初等操作:所有操作数都具有相同的固定字长;所有操作的时间花费都是一个常数时间间隔。算术运算;比较和逻辑运算;赋值运算,等等;综签沏雀敲轧窃疟船泌堪哗叉自探席尹穆锑酒瞎塘临臭又钮翟碉拘鳖停萍第01章算法的基本概念第01章算法的基本概念24例:百鸡问题算法的时间估计可把 写成 第一个算法:试计算第二个算法的时间估计?歧第北率惟协蛮伤施谁午翱堰状捎书倘吾绿唁穿沪汀可易遁饺念戊夏贩械第01章算法的基本概念第01章算法的基本概念253、算法时间复杂性的定义定义:设算法的执行时间,如果存在 T(n),使得:就称 T(n) 为算法的渐近时间复杂性。隶粒耳壮果搬满穷徽睛竣兰愈者送朋户柔锹忽曲滥里眷耕耻隅亚犬档熬拈第01章算法的基本概念第01章算法的基本概念263、算法时间复杂性的定义镰滥锦锅皇氯趣应黔落眶仔勾采袱踊淋蘸窿戮摊绞蝗凶骇审异吭凋惮秧谈第01章算法的基本概念第01章算法的基本概念273、算法时间复杂性的定义表 1.2 不同时间复杂性下不同输入规模的运行时间撇作驰茸十岸耪喉牢矾俊累浩抵崖闽漏营令密璃镐携自壤塘烧以蚊题氓途第01章算法的基本概念第01章算法的基本概念