查找算法整理之索引查找

《浙大MOOC 数据结构习题集》题解索引 浙大MOOC 数据结构习题集 题解索引 阅读详情

索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。

索引查找的过程是:

1)       首先根据给定的索引值K1,在索引表上查找出索引值等于KI的索引项,以确定对应予表在主表中的开始位置和长度,

2)       然后再根据给定的关键字K2,茬对应的子表中查找出关键字等于K2的元素(结点)。对索引表或子表进行查找时,若表是顺序存储的有序表,则既可进行顺序查找,也可进行二分查找,否则只能进行顺序查找。

 

一提到“索引”,估计大家第一反应就是“数据库索引”,对的,其实主键建立“索引”,就是方便我们在海量数据中查找。

 

实现索引查找时常使用的三个术语:

1)       主表:这个很简单,要查找的对象。

2)       索引项:一般我们会用函数将一个主表划分成几个子表,每个子表建立一个索引,这个索引叫做索引项。

3)       索引表:索引项的集合也就是索引表。

 

一般“索引项”包含三种内容:indexstartlength

第一: index,也就是索引指向主表的关键字。

第二:start,也就是index在主表中的位置。

第三:length, 也就是子表的区间长度。

 

代码实现:

 

public class IndexSearch {

	// 主表
	static int[] students = { 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 201, 202,
			203, 204, 0, 0, 0, 0, 0, 0, 301, 302, 303, 0, 0, 0, 0, 0, 0, 0 };
	// 索引表
	static IndexItem[] indexItem = { new IndexItem(1, 0, 5),
			new IndexItem(2, 10, 4), new IndexItem(3, 20, 3), };

	// 查找数据
	public static int indexSearch(int key) {
		IndexItem item = null;

		// 建立索引规则
		int index = key / 100;

		// 首先去索引找
		for (int i = 0; i < indexItem.length; i++) {
			if (indexItem[i].index == index) {
				item = new IndexItem(index, indexItem[i].start,
						indexItem[i].length);
				break;
			}
		}

		// 如果item为null,则说明在索引中查找失败
		if (item == null)
			return -1;

		for (int i = item.start; i < item.start + item.length; i++) {
			if (students[i] == key) {
				return i;
			}
		}
		return -1;
	}

	// / 插入数据
	public static int insert(int key) {
		IndexItem item = null;
		// 建立索引规则
		int index = key / 100;
		int i = 0;
		for (i = 0; i < indexItem.length; i++) {
			// 获取到了索引
			if (indexItem[i].index == index) {
				item = new IndexItem(index, indexItem[i].start,
						indexItem[i].length);
				break;
			}
		}
		if (item == null)
			return -1;
		// 更新主表
		students[item.start + item.length] = key;
		// 更新索引表
		indexItem[i].length++;
		return 1;
	}

	public static void main(String[] args) {
		int value = 205;
		// 将205插入集合中,过索引
		int index = insert(value);
		insert(308);

		// 如果插入成功,获取205元素所在的位置
		if (index == 1) {
			System.out.println("\n插入后数据:" + Arrays.toString(students));
			System.out.println("\n数据元素:205在数组中的位置为 " + indexSearch(205) + "位");
		}

	}

}

// 索引项实体
class IndexItem {
	// 对应主表的值
	public int index;
	// 主表记录区间段的开始位置
	public int start;
	// 主表记录区间段的长度
	public int length;

	public IndexItem() {
	}

	public IndexItem(int index, int start, int length) {
		this.index = index;
		this.start = start;
		this.length = length;
	}
}

运行结果:
原数据为:[101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 201, 202, 203, 204, 0, 0, 0, 0, 0, 0, 301, 302, 303, 0, 0, 0, 0, 0, 0, 0]

插入后数据:[101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 201, 202, 203, 204, 205, 0, 0, 0, 0, 0, 301, 302, 303, 308, 0, 0, 0, 0, 0, 0]

数据元素:205在数组中的位置为 14位


 

数据结构(查找算法) 由于对数据进行了分块,引入了索引查找效率大大提高,对于上述的100万个数据来说,假设以各个大小写字母开头的字符串概率相等,那么相当于将整体数据分成了52块,整体效率平局提升52倍,这个性能的提升的相当显著的,所付出的代价是:需要额外的内存空间存储索引表index,这是以空间换时间的经典思路。既然数据是有序的,那么如果将待查找的节点跟中间节点对比,就可以以排除掉一半的数据,接着再在剩余的数据的中间开始找,又可以很快排除掉剩下的一半的数据,这种一半一半筛查数据的办法,就是所谓的二分法。 阅读详情

相关推荐

重要题型整理:数据结构与算法——索引

重要题型整理:数据结构与算法——索引 索引 索引基本概念 (数据结构与算法MOOC)假定一个计算机系统有4 096字节的磁盘块,每个磁盘的磁盘号可以用一个四字节的整数表示。要存储的每一条记录中4个字节是关键码,64个字节是数据字段。记录已经排序,顺序地存储在磁盘文件中。我们建立一个稠密索引,该线性索引的结构为:(每个文件磁盘块的最小关键码,该块磁盘的磁盘号),通过线性索引访问磁盘文件中的记录。 ...

weixin_44548848的博客 2310

经典算法学习之-----索引查找

本专栏为《手撕算法》栏目的子专栏:《经典算法》,会讲述一些经典算法,并进行分析。在此之前我们要先了解什么是算法,能够解决什么样的问题。以下为经典教材《Introduction.to.Algorithms》开篇中的内容。可以看到,任何被明确定义的计算过程都可以称作算法,它将某个值或一组值作为输入,并产生某个值或一组值作为输出。所以算法可以被称作将输入转为输出的一系列的计算步骤。这样的概括是比较标准和抽象的,其实说白了就是步骤明确的解决问题的方法。......

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1984

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 314

一文彻底搞懂数据结构中索引查找(分块查找)到底是什么?

数据太多,杂乱无章,查找困难!但是,在数据库中利用索引能过很容易的就查找到我们所需要的数据。 索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法,索引查找的基本思想是:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。 在实现索引查找算法前需要弄清楚以下三个术语。 (1)主表:即要查找的序列。 (2)查找表:一般我们会将主表分成几个块,每个块中的元素...

写写平时的技术与感想 1万+

java数据结构和算法------索引查找

1 package iYou.neugle.search; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Index_search { 7 class IndexItem { 8 public int inde...

antianchong3013的博客 348

经典算法索引查找

经典算法索引查找

weixin_68153081的博客 1305

数据结构基础24:索引查找和二分查找

一、查找技术的分类 图片转自网络二、顺序查找(无序表) 顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。 时间复杂度是O(n) 三、二分查找(有序表) 前提就是有序表,二分查找的基本思想是: 在有序表中,取中间记录作...

何哥的博客 2246

七大查找常见算法(下)_对应关系有什么算法吗,啃完999页Linux运维面试高频宝典

B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。它的基本思想为:二叉查找树是先对待查找的数据生成其对应的树,其中树的左分支的值小于右分支的值,然后在所查数据和每个节点的父节点比较大小,查找最适合的范围。(1)对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key有效,有节点也是一个2-3节点,所有的值比key要大。数据存放的更加紧密,具有更好的空间局部性。

2401_83620927的博客 616

程序员刷力扣算法的正确打开方式,学会解题思路,领会其中思想,刷完涨薪20k

前言 上周去朋友去某公司面试,结果在被面试官问到算法时,直接给整不会了,于是我到处找资料,整理出来一套高效刷题方法,刷了一星期的力扣算法题,突然发现好想算法也没那么难,主要是多理解就好 文章目录前言反转链表统计N以内的素数寻找数组的中心索引删除排序数组中的重复项x的平方根三个数的最大乘积两数之和斐波那契数列环形链表排列硬币合并两个有序数组子数组最大平均数二叉树的最小深度最长连续递增序列柠檬水找零三角形的最大周长省份数量香槟塔Dota2参议院优势洗牌 反转链表 反转一个单链表。 解法1:迭代,重复某一过程,每

weixin_51702416的博客 9694

向下取整 平方根X 卡罗尔序列

输入正整数N,求N的立方根。向下取整后输出,输出最小列宽为3列。输入正整数N,求N的平方根X。如果N不是一个完美的平方,输出floor(X)。不考虑不合理的输入等特殊情况卡罗尔数是其值满足4n-2(n+1)-1的整数(n为正整数)。由卡罗尔数组成的序列叫卡罗尔序列:-1,1,3,5,7..输入正整数N,编写函数,输出第N个卡罗尔数。

m0_62574889的博客 768

不愧是阿里P8的行业标杆,总结的这份LeetCode算法刷题笔记太猛了,刚看完第一节我就跪了

前言 提起数据结构与算法,大家可能第一时间想到的就是蓝桥杯这种算法竞赛,并不会太过于在意它在面试中的占比。因为在若干年前,你去面试这种互联网公司或者大的IT公司,面试官并不会过于考察你的算法能力,甚至说你会简单的写一些框架,搭一些数据库,就能找到一份不错的工作 但是直至今日,大家会发现面试的门槛越来越高,甚至来说去到一些大公司去面试算法与数据结构的题目已经成为必问了,算法的在面试的占比已经越来越高,在此我整理了一下近几年面试中问的比较频繁的算法题,大家感兴趣的可以看看,看自己能答出来多少。 全部的算法刷题

m0_60614141的博客 288

python银行家算法例题详解_攒人品之作-能考408大题的知识点整理(有两个知识点的补充)...

本帖最后由 wudi971 于 2014-1-5 17:47 编辑::98::明年出题那么综合,我对不起大家。。。::116::经过陈123同学的提醒,补充两个知识点:组成原理的微指令的设计以及操作系统的文件管理的混合索引方式。个人认为第二个更加重要。::99::之前看到有不少同学说不知道408的大题怎么下手,也因为快要到考试了,我也要开始攒攒人品,就给大家整理一下,毕竟我应该比大多数人都能判断哪...

weixin_39963287的博客 725

索引查找索引查找、分块查找) C语言实现

1、基本概念 索引查找又称分级查找索引存储的基本思想是:首先把一个集合或线性表(他们对应为主表)按照一定的函数关系或条件划分成若干个逻辑上的子表,为每个子表分别建立一个索引项,由所有 这些索引项构成主表的一个索引表,然后,可采用顺序或链接的方式来存储索引表和每个子表。 索引表的类型可定义如下: struct IndexItem {     IndexKeyType ind

WTF 1万+

索引查找

索引查找是在索引表和主表上进行的查找,主表是线性表。先按照给定的哈希算法(比如value%100)对每一个value做哈希运算,将value映射到不同的数据段中(以模100为单位),这样每隔100个数段的区间就被一个哈希值做的索引映射到,以这种方式创建主表,同时创建一个索引表,记录每个100个数区间的索引编号、起始位置、有效数据长度。在查找数据的时候,只要以同样的哈希算法先计算哈希值,直接按该值跳到

liberalman的专栏 2251

算法查找算法---二分查找/索引查找/哈希表查找

在一个数据序列中,查找某个数据是否存在或存在的位置,在实际开发过程中使用的频率非常高,例如对数据常见的操作有增、删、改、查,增加数据时需要查询新增加的数据是否重复,删除数据时需要先查询到数据所在位置再删除,修改数据时也需要先查询到被修改的数据在什么位置,查找算法在编程中重要性排列在第一位。

weixin_65029285的博客 1092

算法索引查找

/ 它比直接查询数据的主表的跳转速度要快,如果使用stu[i]查找,i每加1,要跳转过sizeof(Student)个字节数,如果使用索引表indexs[i]查询,i每加1,则只需要跳转sizeof(Index)个字节数,比主表跳转字节数要少。// 注意:建立索引表后,后面使用索引查找的是索引表,再通过找到的索引表中记录的主表元素的位置信息,来最终找到待查找的数据元素。索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找,但需要先建立索引表,索引表就类似图书的目录,能大提高查找效率。

zzt_is_me的博客 500

经典算法:顺序查找

经典算法:顺序查找

m0_62649396的博客 263

数组——基于索引查找

什么是数组 数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型。我们可以把数组理解为一种容器,它可以用来存放若干个相同类型的数据元素。 例如: 存放的数据是整数型的数组,称作整型数组; 存放的数据是字符型的数组,则称作字符数组; 另外还有一类数组比较特殊,它是数组的数组,也可以叫作二维数组。 如果用数学的方式来看,我们可以把普通的数组看成是一个向量,那么二维数组就是一个矩阵。不过,二维数组对数据的处理方式并没有太多特别之处。 数组可以把这些具有相同类型的元素,以一种不规

weixin_38933749的博客 1673

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。版本如何关闭模块复用后铜皮自动从动态变成静态操作指导。如何关闭这个功能,具体操作如下。

weixin_54787054的博客 1235

燃料电池混合动力汽车的仿真模型.zip电动汽车Simulink模型开发资料下载

燃料电池混合动力汽车的仿真模型.zip电动汽车Simulink模型开发资料下载燃料电池混合动力汽车的仿真模型.zip电动汽车Simulink模型开发资料下载燃料电池混合动力汽车的仿真模型.zip电动汽车Simulink模型开发资料下载燃料电池混合动力汽车的仿真模型.zip电动汽车Simulink模型开发资料下载1.合个人学习技术做项目参考合个人学习技术做项目参考2.适合学生做毕业设计项目参考适合学生做毕业设计项目技术参考 3.适合小团队开发项目技术参考适合小团队开发项目技术参考

上一篇: 查找算法之哈希查找
下一篇: 配置secondarynamenode
xiaoping8411
博客等级 码龄19年 147粉丝 203原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值