数据结构课件第五章数组和广义表幻灯片.ppt

数据结构课件第五章数组和广义表幻灯片.ppt

  1. 1、本文档共107页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯法求解的算法一般形式: void B(int i, int n) { // 假设已求得满足约束条件的部分解(x1,..., xi-1),本函 //数从 xi 起继续搜索,直到求得整个解(x1, x2, … xn)。 if (in) else while ( ! Empty(Si)) { 从 Si 中取 xi 的一个值 vi?Si; if (x1, x2, …, xi) 满足约束条件 B( i+1, n); // 继续求下一个部分解 从 Si 中删除值 vi; } } // B 综合几点: 1. 对于含有递归特性的问题,最好设计递归形式的算法。但也不要单纯追求形式,应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。 2. 实现递归函数,目前必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数;反之,一个用栈实现的非递归函数可以改写为递归函数。需要注意的是递归函数递归层次的深度决定所需存储量的大小。 3. 分析递归算法的工具是递归树,从递归树上可以得到递归函数的各种相关信息。例如:递归树的深度即为递归函数的递归深度;递归树上的结点数目恰为函数中的主要操作重复进行的次数;若递归树蜕化为单支树或者递归树中含有很多相同的结点,则表明该递归函数不适用。 例如: n=3的梵塔算法中主要操作move的执行次数可以利用下列递归树进行分析: move(3, a, b, c) move(2, a, c, b) move(2, b, a, c) move(1, a, b, c) move(1, c, a, b) move(1, b, c, a) move(1, a, b, c) 上图递归树的中序序列即为圆盘的移动操作序列。 又如: 求n!的递归函数的递归树已退化为一个单枝树;而计算斐波那契递归函数的递归树中有很多重复出现的结点。 n n-1 1 0 。。。 F5 F4 F3 F3 F2 F2 F1 F1 F0 F1 F0 。。。 4. 递归函数中的尾递归容易消除。 例如:先序遍历二叉树可以改写为: void PreOrderTraverse( BiTree T) { While (T) { Visit(T-data); PreOrderTraverse(T-lchild); T = T-rchild; } } // PreOrderTraverse void delete(LinkList L, ElemType x) { // L为无头结点的单链表的头指针 if (L) { if (L-data=x) { p=L; L=L-next; free(p); delete(L, x); } else delete(L-next, x); } } 又如: void delete(LinkList L, ElemType x) { // L为带头结点的单链表的头指针 p=L-next; pre=L; while (p) { if (p-data=x) { pre-next=p-next; free(p); p=pre-next; } else { pre=p; p=p-next; } } } 可改写为 5. 可以用递归方程来表述递归函数的 时间性能。 例如: 假设解n个圆盘的梵塔的执行 时间为T(n) 则递归方程为: T(n) = 2T(n-1) + C, 初始条件为: T(0) = 0 1. 了解数组的两种存储表示方法,并掌握数组在以行为主的存储结构中的地址计算方法。 2. 掌握对特殊矩阵进行压缩存储时的下标变换公式。 3. 了解稀疏矩阵的两类压缩存储方法的特点和适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算采用的处理方法。 4. 掌握广义表的结构特点及其存储表示方法,读者可根据自己的习惯熟练掌握任意一种结构的链表,学会对非空广义表进行分解的两种分析方法:即可将一个非空广义表分解为表头和表尾两部分或者分解为n个子表。 5. 学习利用

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档