数据结构第九章

这篇具有很好参考价值的文章主要介绍了数据结构第九章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、静态查找表

(1)顺序表的查找

         1)顺序表查找的结构
typedef struct{
ElemType * elem; //存储空间基址
int length;      //表长
}SSTable;

顺序查找的过程:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较。(也就是说,在查找到时候从最后一个元素开始查找,在这个表中位置为0的位置空着,留给你要查找的元素)

在顺序表的查找中,需要有一个“哨兵”负责担任监视哨的任务。

ST.elem[0].key = key;
//判断查找的元素(也就是位置0放的位置)是不是和值相等
2)查找的性能分析

查找的操作其实很简单,就是将你要找的值与表中元素一一比较,若不符合,则向前查找,直到找到或者表空为止。

因此顺序查找表的长度为:

                                         数据结构第九章,数据结构【其中i = 1】

可以看做是:

                                        数据结构第九章,数据结构

(2)有序表的查找

有序表的查找,可以从小到大,或者从大到小。我们一般默认是从小到大查找。

1)折半查找

折半查找,查找方式有三个指针:low,high和mid。其中mid指示区间的中间位置,即mid=[(high+low)/2]

1.若key与中间元素相等,则查找成功,返回该元素的存储位置,即mid;
2.若key与中间元素不相等,则所需查找的元素只能在中间元素以外的前半部分或后半部分。(至     于是前半部分还是后半部分要看key与mid所指向元素的大小关系)
   a.在查找表升序排列的情况下,若给定值key大于中间元素则所查找的元素只可能在后半部分。       此时让low=mid+1;
   b.若给定值key小于中间元素则所查找的元素只可能在前半部分。此时让high=mid-1;

数据结构第九章,数据结构

//折半查找
int Search Bin(SSTable L,ElemType key){
	low = 1,high = ST.length;
	while(low <= high){
		mid=(low+high)/2;		//取中间位置
		if(L.elem[mid]==key)	
			return mid;			//查找成功返回所在的位置
		else if(L.elem[mid]>key){	//从前部分查找
			high=mid-1;
		}
		else
			low=mid+1;		//从后部分查找
	}
	return 0;				//失败返回0
}

二、索引顺序表的查找

索引顺序表也就是分块查找,许多情况下可能遇到这样的表:整个表中未必有序,但若划分成若干块后,每一块中的所有元素均大于或小于其后面的所有元素,称这种特性为分块有序,因此可以为该顺序表建立一个索引表,索引表中为每一块设置设置一索引项,每一索引项包括两部分:该块的起始地址和该块中最大(或最小)关键字的值(或是所限定的最大(小)关键字)。将这些索引项按顺序排列成一有序表,即为索引表。

数据结构第九章,数据结构

三、二叉排序树和平衡二叉树

二叉树定义:

二叉排序树(又名二叉查找树)或者是一棵空树;或者是具有以下性质的二叉树:
1)若它的左子树不为空,则左子树上所有结点的值均小于它根节点的值
2)若它的右子树不为空,则右子树上所有结点的值均大于它根节点的值
3)它的左右子树也分别为二叉排序树

简单来说就是:左比根小,右比根大

1)二叉排序树的构造过程

首先我们使用画图的方式来描绘一下二叉排序树的插入过程,如图,我们要在一棵空的二叉排序树中插入一个数组6,2,7,4,0,3,1,5,如图所示:

数据结构第九章,数据结构

  首先我们插入第一个元素6,此时二叉排序树中还没有任何一个节点,因此我们应该新建一个节点,并将6存储进去,并将6认定为根节点,如图所示:

数据结构第九章,数据结构

  之后我们插入第二个元素2,此时二叉排序树已经不是一个空树了,因此我们需要首先找到适合它的位置,我们将2和6进行对比,判断谁大谁小,我们发现2更小,因此2应该被插入在6的左子树中,之后我们将2和根节点6的左子树进行对比,发现6的左子树是空的,因此这时我们将2存放在6的左子树根节点位置,如图所示:

数据结构第九章,数据结构

  之后是元素7,7显然大于6,因此我们要将7放在6的右子树中,经过探寻我们发现6的右子树根节点也是空的,因此我们需要将7放在右子树的根节点上,如图所示:

数据结构第九章,数据结构

  之后是元素4,我们首先将4和6对比,发现4是小于6的,因此4应该位于6的左子树上,之后我们将4和6的左子树根节点进行对比,发现4是大于2的,因此4应该被放在2的右子树上,而2的右子树为空,因此4直接被放置在2的右子树根节点上,如图所示:

数据结构第九章,数据结构

  之后是元素0,首先我们将0和元素6进行对比,发现0是小于元素6的,因此应该被放置在6的左子树上,之后我们将0和6的左子树根节点进行对比,发现其小于2,因此0应该被放置在2的左子树上,这时我们发现0是小于2的,因此0应该被放置在2的左子树上,同时我们发现2的左子树为空,因此我们将0放置在2的左子树根节点上,如图所示:

数据结构第九章,数据结构

  之后是元素3,我们发现元素3是小于6的,因此3应该被放置在6的左子树上,而这时我们就开始研究6的左子树,3大于2,因此3应该被放置在2的右子树上,这时我们开始研究2的右子树,而3是小于2的右子树根节点4的,因此3应该放置在4的左子树上,我们发现4的左子树为空,因此我们将3放置在4的左子树根节点上,如图所示:

数据结构第九章,数据结构

  之后是元素1,首先我们将1和6进行对比,发现1是小于6的,因此1应该被放置在6的左子树上,而1又小于2,因此应该被放置在2的左子树上,而1又大于0,因此应该被放置在0的右子树上,0的右子树为空,因此1应该被放置在0的右子树根节点上,如图所示:

数据结构第九章,数据结构

  之后我们研究最后一个元素5,5小于根节点6,因此我们应该将5放置在6的左子树上,而5大于2,因此我们应该将5放置在2的右子树上,5大于4,因此5应该被放置在4的右子树上,4的右子树为空,因此我们将5放置在4的右子树根节点上,如图所示:

数据结构第九章,数据结构

整个的过程都是从中序这个节点前驱替代

2)平衡二叉树
定义:

左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1

方法:

从一组数中选三个,由小到大排序,取中间为新根,小的放左边,大的放右边

调之前:有左边,将左调到右

              有右边,将右调到左

比如:

数据结构第九章,数据结构

将它调整一下:

数据结构第九章,数据结构

四、哈希表

不想比较,直接用函数。

根据关键码值(Key Value)直接进行访问的数据结构。

哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。

哈希表的关键思想是使用哈希函数,将键 key 映射到对应表的某个区块中。我们可以将算法思想分为两个部分:

1.向哈希表中插入一个关键码值:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。

2.在哈希表中搜索一个关键码值:使用相同的哈希函数从哈希表中查找对应的区块,并在特定的区块搜索该关键字对应的值。

构造方法

直接定址法

除留余数法

数字分析法

平方取中法

折叠法

处理冲突方法

开放定址法:

先开n个房间,利用线性放入,如果找x在下面写上比较次数

比如:依次插入9   11   23   19   54

用数字除以表长取余数即可

数据结构第九章,数据结构文章来源地址https://www.toymoban.com/news/detail-813079.html

到了这里,关于数据结构第九章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【夜深人静学数据结构与算法 | 第九篇】栈与队列

    目录 ​前言: 栈: 栈的实际应用:  队列: 队列的实际应用: 总结:         栈与队列是我们学习的两个经典的数据结构,这两个数据结构应用广泛,在计算机内有很多底层应用,而很多算法也是依靠栈和队列来实现的,因此我们要想学好数据结构与算法,就要学好栈与

    2024年02月15日
    浏览(45)
  • 【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)

    前面几篇文章介绍的是排序算法,现在让我们开始排序算法的专项练习。 1.希尔排序是稳定的算法。(错) 解析:稳定性是指如果两个元素在排序前后的相对顺序保持不变,那么这个排序算法就是稳定的。对于具有相同的元素,排序后它们的相对位置应该保持不变。

    2024年02月03日
    浏览(50)
  • MATLAB第九章_数据图形可视化

    目录 数据图形可视化 MATLAB图形窗口 函数绘制 一元函数绘制  二元函数绘图 数据图形绘制简介 离散数据可视化 连续函数可视化 二维绘图函数 基本绘图 快速方程式画图 特殊二维图形  三维绘图函数 绘制三维曲面 生成栅格数据 网格曲线绘制 隐藏线的显示和关闭        

    2024年02月08日
    浏览(43)
  • ChatGPT技术原理 第九章:数据集和训练技巧

    目录 9.1 对话数据集 9.2 数据预处理 9.3 预训练技巧 9.4 微调技巧

    2024年02月02日
    浏览(44)
  • WPF入门到跪下 第九章 MVVM-基本数据处理

    MVVM是Model-View-ViewModel的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI展现出来,ViewModel是一个同步View和Model的对象。 在MVVM架构下,View和Model之间没有直接的联系,它们通过Vie

    2024年01月21日
    浏览(48)
  • 计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.5

    9.5美国的汽油需求函数是否稳定?使用数据集gasoline.dta,估计美国1953-2004年的汽油需求函数: 其中,被解释变量lgasq为人均汽油消费量的对数,解释变量lincome为人均收入对数,lgasp为汽油价格指数的对数,lpnc为新车价格指数的对数,lpuc为二手车价格指数的对数。 (1)将lgas

    2024年02月06日
    浏览(184)
  • 计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.4

    9.4使用数据集Growth.dta考察贸易与增长的关系。该数据集的被解释变量为65个国家1960-1995年的平均增长率(growth),而主要解释变量为1960-1995年的平均贸易开放度(tradeshare) (1)将growth与tradeshare的散点图与线性拟合图画在一起,二者看上去是否有关系? (2)有一个国家马耳

    2024年02月04日
    浏览(102)
  • Windows下的Spark环境配置(含IDEA创建工程--《Spark大数据技术与应用》第九章-菜品推荐项目)

    本文适用于《Spark大数据技术与应用》第九章-菜品推荐项目环境配置:` 跟着做就行… 资源都在网盘里面,纯粹的无脑配置… 提示:以下是本篇文章正文内容,所用资源版本过低,用于课本实验 ,且已有Java环境 scala:2.12.8 spark:1.6.2 hadoop:2.6.4 hadoop启动文件exe JAVA 如果按照

    2024年02月09日
    浏览(56)
  • 《Linux操作系统编程》第九章 数据查找和筛选工具 : 了解流编辑器sed和报表生成器awk的简单使用

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月12日
    浏览(54)
  • 第九章:Java常用类

    目录 9.1:字符串相关的类:String         9.1.1:String用法         9.1.2:String方法         9.1.3:String与char[]、byte[]之间的转换         9.1.4:StringBuffer和StringBuilder的使用 9.2:JDK 8之前的日期时间API 9.3:JDK 8中新日期时间API         9.3.1:LocalDate、LocalTime、LocalDateTime的使

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包