第13章算法设计技术.pptVIP

  • 3
  • 0
  • 约7.27千字
  • 约 41页
  • 2017-07-17 发布于四川
  • 举报
Mar.2007 wangweidong,school of computer science, Xidian University 第13章 算法设计技术 引言 1984年的图灵奖得主Niklaus Wirth “Programs = Algorithm + Data Structures” 算法是对特定问题求解步骤的一种描述。其基本特性为: 有穷性 确定性 可行性 输入 输出 一个好的算法应当具备以下特点: 正确性 可读性 健壮性 效率与低存储量需求 引言 当我们遇到一个问题时,首先需要设计算法,但是算法的设计并非一件容易的事情,它需要具备各方面的知识,同时还需要一些灵感。好在现实生活中并非每件事情的解决都要我们去传造出新的方法,很多事情前人们已经遇到,而且已经给出了很好的解决,因此首先掌握一些经典的算法思想不仅可以帮助我们解决现有的问题,而且也有助于我们在此基础上进行创造性的劳动。在学习的过程中我们应当仔细体会这些思想的奥妙。 引言 经常采用的算法设计技术主要有: 迭代法 穷举法 递归法 回溯法 分枝限界法 分治法 动态规划法 贪心法 迭代法 意大利数学家Fibonacci曾提出过一个有趣的问题: “设有一对新生兔子,从第三个月开始它们每月都生一对兔子。按照这个规律,并假设兔子没有死亡的,求一年后有多少对兔子。” 思路:首先我们根据已知条件来找规律 迭代法 迭代法 对于以上问题我们可以描述为 Fib(n)=Fib(n-1)+Fib(n-2) Fib(1)=Fib(2)=1 特点: 1)存在初值。 2)存在一个表达式。 3)求值的过程从初值开始,通过表达式不断的计算得出新值,新值是不断的通过旧值计算出来的。 我们称以上过程即为迭代过程。其思想就是由一个初值开始使用一个迭代表达式进行反复迭代,从而不断求出新值,直到求得需要的值。 迭代法 迭代过程的实现比较简单,常常使用循环结构生成效率极高的过程。 int fun(int n) { int i, fib, fib1, fib2; fib1=fib2=1; //初值 for (i=3; i=n; i++) //迭代条件:3 = i = n { fib = fib2 + fib1; fib2 = fib1; fib1 = fib; } return fib; } 穷举法 顾名思义就是将所有的情况全部列举出来的意思。 对于我们来说,穷举法似乎是一种“较笨”的算法,而且如果情况比较复杂,可能根本无法办到。 为什么还要提这种方法呢? 思路简单 很多情况下规律的寻找并不容易,有时可能无法找到。 穷举虽然对于人很麻烦易错,但是对于高速运算的计算机而言,实在是不在话下,而且重复机械计算正是计算机的特长。 穷举法 因此作为一种算法思想,加上计算机这种强大的计算工具,穷举也成为一种被人们经常使用的解决问题的方法。 举例 下棋程序中很多时候就是运用了穷举法则,每一步可能的走法及对应招数都被存储在海量存储器中,每下一步棋,电脑便依靠强大的计算速度查询海量存储器寻找对应的解决办法,然后猜测可能的结果,最终选定一步最好的走法。 求排列、组合问题 递归与分治 递归 定义:直接或间接地调用自身的过程称为递归过程。 递归与分治 递归的工作原理 递归与分治 递归三要素 1)问题形式:需要哪些输入参数?返回结果是什么? 2)递归规则:问题如何进行分解? 3)终结条件:什么情况下可以无须分解而直接求解? 递归与分治 分治 思想:将一个难以直接解决的大问题,分割成一些与原问题同类型的、规模小于原问题的子问题,然后各个击破,分而治之,最后再合并子问题的解从而得到原问题的解。 递归与分治 图例: 递归与分治 分治和递归的关系 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 递归与分治 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 递归与分治 分治法举例 Hanoi塔问题 问题描述:设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a

文档评论(0)

1亿VIP精品文档

相关文档