离散数学-算法(精品·公开课件).pptVIP

  • 2
  • 0
  • 约3.7千字
  • 约 35页
  • 2018-11-06 发布于广西
  • 举报
离散数学 黄晓宇 HuangSir@ 本讲内容 算法简介 算法例子 算法分析 递归算法 算法-一组有限的指令集合 算法示例-三数排序 跟踪 算法正确性证明 算法描述:在数列s1,..., sn 中找出最大的一个。 输入:s, n 输出:large(序列s 中的最大值) max (s, n){ large = s1 for i = 2 to n if (si large) large = si return large } 算法正确性证明(二) 循环不变式:在循环的每次迭代前后均为真的谓词 large=max{s1,..., sn } 算法正确性证明(三)-归纳 平凡情况(i = 1)large 是序列中的最大值。 假设large是子序列s1,..., si 中的最大值。 假如i n 成立,i 变成i + 1。 (1)si+1 large,赋值large =si+1; (2)si+1 ≤ large,算法不改变large 的值。 因此, large=max{s1,..., sn } 是一个循环不变量。 for 循环在i = n 时结束,算法正确。 文本搜索 假设给定一个文本t(例如一个文档),在t 中找出特定词组p 首次出现的位置。 插入排序 假设插入排序的输入是s1,..., sn,目标是按非递减顺序将数据排序。 在插入排序的第i 次迭代后,序列的前一部分s1,..., si会被重新安排使得它有序。插入排序接下来将s i + 1插入s1,..., si,使得s1,..., si, si+1 也是有序的。 时空分析 在插入排序算法中,for 循环执行n - 1 次,但是对于一个特定的i 值,while 循环执行的次数依赖于输入。 例如,如果输入的序列已经按非递减顺序排列,val sj总是false,while 的循环体永远不被执行,称这个时间为最好情形执行时间;另外,如果这个序列是按递减顺序排序的,val sj, 总是true,while 的循环体执行最大次数。(当第i 次迭代时for 循环中while 循环执行i - 1 次)。称这个时间为最坏情形执行时间。 随机算法 一个随机算法(randomized algorithm)并不要求每一步的执行中间结果被惟一决定且只依赖于输入和前面步骤的执行结果。 根据定义,当执行一个随机算法时,在某些点上,算法做出随机选择。 随机算法(二) rand (i, j):返回在整数i 和j 之间的(包含i 和j)一个随机整数。 算法的分析 一个计算机程序,即便是正确的,也可能是不可用的,因为执行这个程序需要的时间或者存储这个程序的数据、变量等需要的空间太大了。 例:列举一个N元集合的所有子集(编程实现) 确定一个计算机程序性能 数学定义 数学定义(二) 数学定义(三) 如果f (n) = O(g(n)),可得出结论除了对某些常量因子和有限数之外,f 的上界是g,所以g 至少和f 的增长一样快。例如,如果f (n) = n, g(n) = 2n,那么f (n) = O(g(n)),但是g 比f 增长快得多。另一方面,如果f (n) = ?(g(n)),可得出结论:除了对某些常量因子和有限数之外,f 的上下界是g,所以f 和g 的增长一样快。注意n = O(2n),但是n ≠ ?(2n)。 复杂度计算:夹逼法 f(n)=?(g(n)) iff f(n)=O(g(n)) and f(n)=? (g(n)) 例1:P163 例4.3.3 60n2+5n+1 = ?(n2) 例:给出语句x = x + 1 的执行次数关于n 的?表示 例:给出语句x = x + 1 的执行次数关于n 的?表示 Input: s1,s2,…,sn, n, key Output : index of key procedure linear_search(s,n,key) for i:= 1 to n do if key = si then return(i) return(0) end linear_serach 讨论 P174 -30 算法的思路 复杂度 P176-69 递归算法 一个递归函数(伪代码)是调用自身的函数。一个递归算法是包含递归函数的算法。 递归算法的基本思想:分而治之。 即将问题分解成与初始问题同类型的子问题来求解,每一个子问题又可以继续分解……依次类推,直到这个过程得到的子问题可以通过一个直接的办法求解。 最后,通过组合子问题的解就可以得到初始问题的解。 阶乘计算: n! n! = n(n - 1) (n - 2)?2·1 阶乘计算(二) N!?(N-1)! ? (N-2)! ?(

文档评论(0)

1亿VIP精品文档

相关文档