数据结构-查找-线性索引查找(对于无序顺序存储,建立索引快速查找)

1、索引

我们前面提到的几种高效查找方法都是基于有序的基础上的,但是实际上,很多数据集可能增长非常快。例如空间动态信息等,对于这样的查找表,我们若是保证记录全部按照当中某个关键字有序,其维护的时间代价非常高,所以这种数据通常是按照先后顺序存储。

数据结构的最终目的就是提高数据的处理速度,索引是为了加快查找速度而设计的一种数据结构。索引就是把一个关键字与他对应的记录相关联的过程。

一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。

索引技术是组织大型数据库以及磁盘文件的一种重要技术。

索引按照结构可以分为线性索引,树形索引和多级索引。

所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。

2、稠密索引

稠密索引文件的每个记录都有一个索引项,记录在数据区存放是任意的,但索引是按序的,这种索引称为稠密索引。

稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项。

稠密索引是因为索引项和数据集的记录个数相同,所以空间代价很大。

3、分块索引

我们可以对数据集进行分块,使其分块有序,然后再对每一块建立一个索引项(类似于图书馆的分块)。

分块有序是把数据集的记录分成了若干块,并且这些块需要满足两个条件:

(1)块内无序

每一块内的记录不要求有序

(2)块间有序

比如要求第二块所以记录的关键字均要大于第一块中所有记录的关键字,第三块要大于第二块。

只有块间有序才有可能在查找时带来效率。

对于分块有序的数据集,将每块对应一个索引项,这种索引方法叫做分块索引。

分块索引的索引项结构分为三个数据项:

a: 最大关键码--存储每一块中的最大关键字。

b: 存储每一块中记录的个数以便于循环时使用。

c: 用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历。

在分块索引表中查找,可以分为两步:

a: 在分块索引表中查找要查的关键字所在块。

由于分块索引表是块间有序的,因此很容易利用折半插值等算法得到结果。

b:根据块首指针找到相应的块,并在块中顺序查找关键码。

因为块中可以是无序的,因此只能顺序查找。

4、倒排索引

通过关键字的记录号表查找,其中记录号表存储具有相同次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字)。这种索引方法就是倒排索引。

原文地址:https://www.cnblogs.com/lemonzhang/p/12395054.html

时间: 2024-10-27 13:33:42

数据结构-查找-线性索引查找(对于无序顺序存储,建立索引快速查找)的相关文章

数据结构之 线性表---有序链表的建立

mxjj130304杨少鹏(13110581086)        注销 数据结构实验之链表六:有序链表的建立 数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS    Memory limit: 65536K 题目描述 输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表. 输入 第一行输入整数个数N: 第二行输入N个无序的整数. 输出 依次输出有序链表的结点值. 示例输入 6 33 6 22 9 44 5 示例输出 5 6 9 22 3

C 数据结构1——线性表分析(顺序存储、链式存储)

之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug也不懂怎么修改,那个时候,电脑一直被我弄蓝屏,这个寒假,重新学习一遍数据结构,获益良多,整理一下,发布出来,求拍砖,共同进步. 线性表(List),0个或者多个数据元素的有限序列 线性表的顺序存储,即线性表通过数组的方式实现,指用一段地址连续的存储单元一次存储线性表的数据元素.如图: A1 A2 -

数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)

一,线性表顺序存储 #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSI

数据结构之线性表:顺序存储

SeqList.h 1 #define ListSize 100 2 3 typedef int DataType; 4 typedef struct { 5 DataType list[ListSize]; 6 int length; 7 }SeqList; 8 9 void InitList(SeqList *L) 10 /* 将线性表初始化为空的线性表只需要把线性表的长度length置为0 */ 11 { 12 L->length=0; 13 } 14 15 int ListEmpty(S

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

基础算法-查找:线性索引查找

前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集的可能有竟然的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数据通常都是按先后顺序存储的. 那么如何能够快速的查找到需要的数据呢?办法就是--索引. 索引就是把一个关键字与它对应的记录相关联的过程.一个索引有若干个索引项构成,每个索引项至少应包括关键字和对应的记录在存储器中的位置等信息. 索引按照结构可以分为线性索引.树形索引和多级索引.所谓的线性索引就是将

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

大话数据结构—顺序表、有序表、线性索引查找

查找 根据给定的某个值,在查找表中确定一个其关键字(唯一的标识一个记录)等于给定值的数据元素或数据记录. 静态查找:只查找,不修改元素[线性表.顺序查找.二分查找] 动态查找:查找时,插入或者删除元素[二叉排序树] 顺序表查找 顺序查找(针对静态查找表),也叫线性查找O(n),从头开始遍历,直到最后一个记录. 优化:添加哨兵 //有哨兵的顺序查找 int foo(int *a,int n,int key) { int i; a[0]=key;//哨兵 i=n; while(a[i]!=key)

数据结构例程——线性表顺序存储的应用

本文是数据结构基础系列网络课程(2):线性表中第6课时线性表顺序存储的应用中所讲的例程. 例:删除元素 问题:已知长度为n的线性表A采用顺序存储结构,设计算法,删除线性表中所有值为x的数据元素. 要求:时间复杂度为O(n).空间复杂度为O(1)的算法 解法0:用基本运算实现,不满足复杂度要求 (注:本文中所需要的list.h和list.cpp见点击参照-) #include "list.h" #include <stdio.h> void delnode1(SqList *