算法设计与分析.

Slides:



Advertisements
Similar presentations
1 安全乘坐电梯 与大型游乐设施 福建省特检院宁德分院党支部 王祖生 特种设备安全知识进校园.
Advertisements

口試準備及口語表達技巧 民國 98 年 2 月 26 日 12:00pm 國立三重高中 陸芳瑜老師 1.
高一年级组家长会. 一、考试成绩分析 二、存在的问题 三、给家长的建议 四、科任教师交流 表扬 1 、 年级组语数外成绩优异同学 ( 年级排名 ) 李 芮第 1 名 吕明洋第 2 名 王 越第 3 名 杨天宇第 4 名 张凯燕第 5 名 李 曦第 7 名 魏书静第 8 名 项春怡第 10 名 郑明明第.
沟通交流 活动有序 内容轻松 文明守纪 团结共进 1. 成立家长委员会, 通知 15 人明天下午 3-5 点五楼报告厅 “ 全面育人教育论坛 ” 2. 介绍附中、年级、班级的规范和要求 日常行为规范,高中学习特点,考试、作业要求 3. 开学以来年级、班级开展的工作及安排 开学以来年级、班级开展的工作及安排.
海洋教育:教科書、教師與教學 第七至十章導讀 宏仁國中 林珮瑜
1、毛将后代握手言欢泯恩怨 2、美国总统奥巴马访华.
大学生安全防范知识 城北派出所 陶燕雄.
远 方 宽厚肩膀,手指干净而修长。 笑声像大海,眼睛里有阳光。 我想象你,一定就是这样。 还没出现,就已对你爱恋;还没遇见,就先有了思念。
广州宜家选址分析 0连锁 李若谷 陈玉风 黄小飞 蓝柔盈.
情境导入: 诚信是金 同学们,这是一个非常经典的故事。请大家思考当小男孩真的遇到狼时,为什么没人去救他呢? 你从中得到了什么启示?狼来了.MP4.
第一章 十六世紀中葉以前的臺灣與原住民 第一節 考古發掘與史前文化.
藥物濫用 華德學校上午校 黃秀雯.
欢迎各位家长 同样的心情 一样的期待 初二(2)班家长会.
欢迎各位家长的到来! 沟通 交流 协作 初二 班家长会.
家校同心, 师生同行 ——八(五、六)班家长会.
“他的人生观真是一种‘单纯信仰’,这里面只有三个大字:一个是爱,一个是自由,一个是美。他梦想这三个理想的条件能够回合在一个人生里,这是他的‘单纯信仰’。他的一生的历史,只是他追求这个单纯信仰的实现的历史。” ——胡适《追悼志摩》
欢迎各位家长光临 初二(1)班家长会
量化vs質性研究分析 量化vs質性研究分析 報告人:王秀民.
学习情境七 领队业务 【学习目标】 了解领队工作职责; 掌握领队的工作程序; 掌握领队的服务要点。 【技能目标】
蒙古与苗族的特色建筑 项艺烽小组 最炫民族风.mp3.
大聲一點又如何? 打耳光、重擊或大聲音會使聲波以極大的力量快速撞擊鼓膜而傷害鼓膜。 事先知道要聽到很大的聲音要張開嘴巴。
唐宋傳奇、筆記小品和史書、論著中的寓言 中碩二 吳佳樺.
兒童期 7 青春期 兩性圓舞曲 乘客:七年級同學 司機:張立杰老師.
算法设计与分析 李清勇 教授 办公室:第九教学楼北201.
一分钟电话营销分享 刘瑾.
姓名:劉芷瑄 班級:J201 座號:39號 ISBN:957-33-1963-2
基督教的生命觀 國立東華大學資訊管理學系 許芳銘.
高中信息技术新课程探讨 算法与程序设计教学实践与探讨 江苏省新海高级中学  张丽.
星星知我心 談古話今….. ……..觀星望斗 主講人: 陽光青春美少男.
反垃圾掩埋場相關報告 組長:文煊 組員:鄭侃文 李浩暐 胡育睿 李瑞耘 朱祐賢 林承宇.
计算机与程序.
第4章 循环结构 程序设计2 本章主讲 赵家刚 计算机编程导论.
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
"性"不"性"由你 性別平等之探討 北屯國小 張文陵.
行政作用法 行政命令.
第十一章 真理与价值 主讲人:阎华荣.
組員: 洪暐翔、 賴峻毅 侯家豪、 賴琦穎 指導老師: 王惠鈴 老師
评价是为了促进 学生发展的评价。. 评价是为了促进 学生发展的评价。 语言有温度,字词知冷暖.
第七章 固 定 资 产.
學習共同體實施心得分享 新泰國中 報告者 張國振校長.
性別透視鏡 鳳鳴電台 高宜君老師.
運輸與空間的交互作用 運輸發展的階段 一、分散的港口 二、侵入路線 三、發展支線 四、初步相互連結 五、完全相互連結 六、高度優越的幹線
行政院國軍退除役官兵輔導委員會 嘉義榮民醫院.
社會學(一) 空中大學花蓮中心 鍾燕菁
台中市不動產經紀人職業工會 不動產經紀營業員 複訓班
快速排序法 (Quick Sort).
第9章 排序.
搜尋資料結構 Search Structures.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
第九章 查找 2018/12/9.
数据结构 -Maple Related- 牟克典 数学科学学院信息科学系 2012秋季 1/16/2019.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
產品語意 班級:夜四技產設三甲 學生:鄭舜鴻 學號:9A01C023 指導教師:唐蔚.
計數式重複敘述 for 迴圈 P
Chapter 5 Recursion.
公立學校教職員退休資遣撫卹條例重點說明 苗栗縣政府人事處編製 主講人:陳處長坤榮 107年5月2日.
鄧姚文 資料結構 第五章:遞迴 鄧姚文
注意:教程中给出的所有示例代码请勿直接拷贝使用!会引起不必要的错误!
数 据 结 构 与 算 法.
特定消耗品說明 (指碳粉匣、墨水匣) 國立清華大學 保管組製作.
Lucene 算法介绍 IR-Lab 胡晓光.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
谁在审判?谁能审判? ——网络舆论对司法判案的影响
本节内容 Lua基本语法.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
顺序查找与二分查找复习.
臺中市龍山國小 校園常見瓢蟲辨識   瓢蟲屬於鞘翅目瓢蟲科。目前世界上約有5000多種瓢蟲,台灣地區約有80種以上,其中能捕食有害生物的瓢蟲約七十種之多。瓢蟲因為捕食有害生物為主食,所以又稱為『活農藥』。
第七章 程序调试方法 异常 崩溃.
Presentation transcript:

算法设计与分析

查找问题 问题: 在一个列表中查找某个值. def search(x, nums): # nums为一数值列表, x是一个数 # 否则返回-1 2 2

查找问题 Python本身就提供有关的功能 判断: x in nums 求位置: nums.index(x) def search(x, nums) try: return num.index(x) #如何实现? except: return -1 3 3 3

策略一: 线性查找 逐个检查列表中的数据 def search(x, nums): for i in range(len(nums)): if nums[i] == x: return i return –1 4 4

策略一: 线性查找 特点: 适合无序数据列表 不适合大数据量 使列表有序后, 线性查找算法可略加改进 (How?) 5 5 5

策略二: 二分查找 猜数游戏: 可取的策略? 二分查找: 每次查看有序列表的中点数据, 根据情况接着查找较大一半或较小一半 def search(x, nums): low, high = 0, len(nums) - 1 while low <= high: mid = (low + high) / 2 if x == nums[mid]: return mid elif x < nums[mid]: high = mid - 1 else: low = mid + 1 return -1 6 6 6

算法的优劣比较 经验分析 抽象分析 根据电脑上的运行时间比较 环境变化会影响结果 分析算法解题所耗“步数”(时间) 步数越少越好 步数又与 问题难度/规模 相关 查找问题中, 问题难度用数据量n衡量

查找算法的比较 策略一 策略二 猜数游戏中: 若数的范围是1~1000000,则 步数与n成正比 称为线性时间算法 步数与log2 n成正比(如:16个元素的列表) 称为对数时间算法 猜数游戏中: 若数的范围是1~1000000,则 策略一: 平均要猜50万次才能猜对 最坏1百万次, 最好1次 策略二: 最坏也只需猜20次 8 8 8

查找算法的比较 策略一 策略二 步数与n成正比 称为线性时间算法 步数与log2 n成正比(如:16个元素的列表) 称为对数时间算法 List Size Halvings 1 2 4 8 3 16 9 9 9

递归定义 二分查找算法的另一表述: 大问题的子问题仍是同样形式的问题,故仍用解决大问题的算法来解决子问题 算法binarySearch:在nums[low]~nums[high]中查找x mid = (low + high) / 2 if low > high x 不在nums中 elif x < nums[mid] 在nums[low]~nums[mid-1]中查找x else 在nums[mid+1]~nums[high]中查找x 大问题的子问题仍是同样形式的问题,故仍用解决大问题的算法来解决子问题 10

递归定义的特征 递归定义完全是合法的,数学里有很多递归定义的对象. 如阶乘: 这不是循环定义,有”出口” 当n = 0; n != 1 , 当n = 0; n != n * (n – 1) ! , 否则 11

递归定义的特征 递归定义的特征 有奠基情形, 这种情形无需递归 每次递归都是针对较小情形 递归链最后终止于奠基情形 12

Python递归函数 例如: 计算阶乘的递归函数 def fact(n): if n == 0: return 1 else: return n * fact(n-1) 13

递归查找算法 二分查找的递归版本: def recBinSearch(x, nums, low, high): if low > high: return -1 mid = (low + high) / 2 if x == nums[mid] return mid elif x < nums[mid]: return recBinSearch(x, nums, low, mid-1) else: return recBinSearch(x, nums, mid+1, high) def search(x, nums): return recBinSearch(x, nums, 0, len(nums)-1) 14

递归 vs 迭代 递归算法 设计容易 易读 效率略低 迭代算法: 用循环 设计困难 有的问题没有直观的迭代算法 效率高

排序问题 给定数据列表, 将其数据重新排列, 形成一个有序的(递增)列表 回顾:Python列表类型提供了方法 <list>.sort() 我们要学的是如何实现这个方法

朴素策略: 选择排序 每次从剩下的数据中选择最小值输出 求列表中最小值的算法: 参考前面的max算法 大数据量时效率低 def selSort(nums): n = len(nums) for bottom in range(n-1): # 求nums[bottom]..nums[n-1]间的最小值 mp = bottom # 初始bottom为迄今最小 for i in range(bottom+1,n): # 考虑其他值 if nums[i] < nums[mp]: mp = i # 新的迄今最小值 nums[bottom], nums[mp] = nums[mp], nums[bottom] 大数据量时效率低

分而治之: 归并排序 数据分成两组或更多组 分别对各组排序 再把已有序的各组归并(merge)成完整有序列表

分而治之: 归并排序 归并: 比较两组各自的第一个数据, 小者输出, 由该组的下一个数据顶上来继续比较 当某组没有数据,则将另一组整个输出. def merge(lst1, lst2, lst3): while 当lst1和lst2两组都有数据: 输出两组第一个数据的较小者至lst3 更新该组的第一个数据 while 某组没有数据了: 将另一组剩余数据输出至lst3

分而治之: 归并排序(续) 问题: 如何对各组排序? 似乎可以利用递归: 对每一组再次应用分而治之的归并排序 因为满足递归的前提条件: 奠基情形:组中只有一个数据时无需递归; 每次分组都使列表变小, 最终会到达奠基情形

分而治之: 归并排序(续) 利用递归 def mergeSort(nums): n = len(nums) if n > 1: m = n / 2 nums1, nums2 = nums[:m], nums[m:] mergeSort(nums1) mergeSort(nums2) merge(nums1, nums2, nums)

排序算法的比较 难度和列表大小n有关 选择排序 每次循环: 从剩余数据中选择最小值, 所需步数为剩余数据的个数 总的步数: n+(n-1)+...+1 = n(n+1)/2 称为n2算法

排序算法的比较 难度和列表大小n有关 选择排序 (n2算法) 归并排序 作分组归并图示, 可知 每层归并都涉及n步(拷贝n个数据) 共有log2n层 故需nlog2n步, 称为nlogn算法

排序算法的比较 难度和列表大小n有关 选择排序 (n2算法) 归并排序 (nlogn算法)

可计算性与计算复杂性 问题可划分为: 可计算的: 存在确定的机械过程, 一步一步地解决问题 不可计算的: 不存在明确的机械过程来求解该问题 可计算, 而且能有效解决 可计算, 但难度太大, 不能有效解决 不可计算的: 不存在明确的机械过程来求解该问题 不可解, 不可判定

Hanoi塔问题 体现递归威力的经典问题! 三条规则 def moveTower(n, source, dest, temp): if n == 1: print "Move disk from", source, "to", dest+"." else: moveTower(n-1, source, temp, dest) moveTower(1, source, dest, temp) moveTower(n-1, temp, dest, source)

Hanoi塔问题 难度:需要2n − 1步! 称为指数时间算法 属于难解(intractable)问题. Number of Disks Steps in Solution 1 2 3 7 4 15 5 31

停机问题 能否编一个终止性判定程序HALT? 是不可解(unsolvable)问题! def HALT(prog,data) 若prog(data)终止, 则输出True; 否则输出False. 是不可解(unsolvable)问题!

停机问题 若有HALT, 则歌德巴赫猜想可以迎刃而解: def gc(): n = 2 while True: if 2*n 不是两个素数的和, 则返回False n = n + 1 然后运行HALT(gc)即可 哥德巴赫猜想主張每個大於等於4的偶數都是哥德巴赫數-可表示成兩個質數之和的數

停机问题(续) 说HALT不存在只能通过严格证明: 假设存在HALT(prog,data). 则编程序 def strange(p): result = HALT(p,p) if result == False: #即p(p)不终止 return else: while True: n = 1 运行strange(strange), 结果如何?

End 31