第3章 伸展树与跳表.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 伸展树与跳表

第3章 伸展树与跳表 字典:词条的集合,一种数据结构,主要包括搜索、插入和删除等基本运算。 伸展树和跳表:是表示字典的高级数据结构。 3.1 伸展树 3.1.1 二叉搜索树 根的左子树的所有节点的值都小于根节点,右子树的所有节点的值都大于根节点 子树也是二叉搜索树 用于表示动态集 实现动态集上定义的基本运算 搜索操作 ResultCode Search(K key,T x) const 在集合中搜索关键字为key的元素,若存在,将其值赋值给x,函数返回Success,否则返回NotPresent。 插入操作 ResultCode Insert(T x) 在集合中搜索关键字为x.key的元素,若存在返回Duplicate。否则,若集合已满,返回Overflow,若未满,插入x,返回Success。 删除操作 ResultCode Remove(K key) 在集合中搜索关键字值为key的元素,若存删除并返回Success,否则,返回NotPresent。 二叉平衡树 每次插入或删除后,重新平衡树形,使之始终保持平衡。 能保证性能,但增加了实现难度。 伸展树 自调节搜索树。 在伸展树上,执行一个m次运算(搜索、插入、删除),总的时间为O(mlogn) 具有良好的平均分摊代价。 是平衡搜索树的很好替代结构。 3.1.2 自调节树和伸展树 伸展树: 一颗二叉搜索树,要求每访问一个元素后,将最新访问的元素移至二叉搜索树的根部,以保证经常被访问的元素靠近根节点. 将一个元素移至根部的操作称为一次伸展. 一般情况下,一个元素被访问后,下一次还要访问它的机会比较大. 是自调整搜索树 3.1.3 伸展操作 一棵伸展树是一棵二叉搜索树,其搜索,插入等操作与二叉搜索树相同,只是每次操作后都紧跟一次伸展操作 伸展操作的目的是将节点x移至根节点,被移动的节点为伸展节点. 3.1.3 伸展操作 伸展节点的确定 1.搜索成功的节点 2.新插入的节点 3.被删除节点的双亲 4.若上述运算失败,则搜索过程中遇到的最后一个节点为伸展节点. 3.1.3 伸展操作 一次伸展操作由一组旋转动作组成 单一旋转 3.1.3 伸展操作 单一旋转(zig右旋转)规则 伸展节点的右子树作为其父节点的左子树 伸展节点与其父节点交换位置 左旋转(zag)规则 伸展节点的左子树作为其父节点的右子树 伸展节点与其父节点交换位置 3.1.3 伸展操作 一次伸展操作由一组旋转动作组成 双重旋转 双重旋转 1. zigzig旋转 双重旋转 2. zigzag旋转 伸展操作既可以自底向上,也可以自顶向下进行. 作业: 描述下列伸展过程 3.1.4 伸展树类 伸展树类 旋转的实现 插入的实现 分摊分析(略) 复习: 类的定义 class Stack { public: Stack(int s); //构造函数 virtual ~Stack(); //析构函数 int pop(int num); //函数原型,函数的声明 int push(int num); private: int *data; //栈数据存储 int memNum; //栈元素个数 int size; //栈大小 }; 类中成员函数的实现 类的使用--定义对象 Stack oneStack; Stack arrayOfStack[10]; Stack *pStack; //指针 Stack s=oneStack; //引用-为变量指定别名 注意: 声明一个类就是声明了一种数据类型,它并不接收和存储具体的值,只能作为生产具体对象的样板,定义对象后才能为对象并且只能为对象分配存储空间。 类的定义与实现一般分别放在.h和.cpp文件中。 对象的引用格式 对象名.数据成员名 对象名.成员函数名 --必须是公有属性 几点注意: 类的数据成员在类定义中声明,但不能在类中赋值。数据成员的初始化只能在构造函数中进行,或通过成员函数进行读写。 创建对象时自动调用构造函数。 析构函数用来释放对象所占用的存储空间。在撤销对象时自动调用。 new --分配存储空间 delete --释放空间 例:在定义了类Stack之后 Stack one; Stack array[10]; Stack *ptr=one; Stack s=one; Stack *pone,*pten; pone=new Stack; pten=new Stack[10]; 构造

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档