第2讲分治算法和二分搜索算法.pptVIP

  • 27
  • 0
  • 约3.7千字
  • 约 12页
  • 2019-02-05 发布于湖北
  • 举报
第2讲分治算法和二分搜索算法

分治法的基本思想 * * * Fibonacci数列: 1, 1, 2, 3, 5, 8, 13… 迭代法求Fibonacci数列的前20项 #include stdio.h void main( ) { int i , f1=1 , f2=1 , f3; printf(%8d%8d, f1 , f2); for ( i=3 ; i=20 ; i++ ) { f3=f1+f2; f1=f2; f2=f3; printf(%8d, f3); if ( i%4==0) putchar(\n); } } 迭代法在已知数列前2项的基础上, 从第3项开始, 依次向后计算, 得出数列的每一项 思考:怎样用递归的方法求解? 2-1 递归法求Fibonacci数列 定义Fibonacci数列的递归数学模型: 递归法求Fibonacci数列 1 n=0,1 F(n-1)+F(n-2) n1 F(n)= 递归的终止条件 递归公式 int Fib(int n) { if (n0) { printf(error!); exit(0); } else if (n = 1) return 1; else return Fib(n-1)+Fib(n-2); } 2-1 递归法求Fibonacci数列 用递归法求Fibonacci数列 Fib(4) return + Fib(3) Fib(2) return + Fib(2) Fib(1) return + Fib(1) Fib(0) return + Fib(1) Fib(0) return 1 return 1 return 1 return 1 return 1 n=4时,递归法进行了多少次函数调用? 1 1 2 1 1 1 3 2 5 n=20时, 要进行21891次递归调用 讨论: 求Fibonacci数列的迭代法和递归法谁好? 2-1 递归法求Fibonacci数列 第2讲 分治法和二分搜索算法 本讲内容: (1) 分治法的基本思想 (2) 二分搜索技术 分治法的思想: 分而治之。将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,(如果子问题的规模仍然不够小,则再划分为k个子问题), 然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。 原问题(规模为n) 子问题1 子问题2 子问题k … 子问题1 子问题2 子问题k … 相同 类型 合并解 子问题1 子问题2 子问题k … 子问题1 子问题2 子问题k … 分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决 该问题可以分解为若干个规模较小的相同问题 该问题所分解出的各个子问题是相互独立的 利用分解出的子问题的解可以合并为该问题的解 分治法的基本思想 前提条件:有一组数已经按从小到大(或从大到小)排序 目标:输入一个数x,在这组数查找是否有x 二分搜索的步骤: 1、确定三个关键下标的初值:bott=0, top=8, mid=(bott+top)/2; 2、判断要找的数x是否等于a[mid] ① x==a[mid] 找到,结束 xa[mid] 在a[bott]—a[mid-1]之间继续查找x top=mid-1; mid=(bott+top)/2; ③ xa[mid] 在a[mid+1]—a[top]之间继续查找x bott=mid+1; mid=(bott+top)/2; -6 101 82 54 23 9 7 0 -15 mid bott top a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 2-2 二分搜索算法 二分搜索实例:设在数组a中顺序放了以下9个元素: 检索x=9, 9==a[4], 一次比较就成功, 最好情况 101 82 54 23 9 7 0 -6 -

文档评论(0)

1亿VIP精品文档

相关文档