首页 > 编程语言 >数据结构与算法-静态查找表

数据结构与算法-静态查找表

时间:2023-02-09 12:32:21浏览次数:42  
标签:二分 顺序 mid 索引 算法 查找 key 数据结构


1. 顺序查找

顺序表的结构定义如下:

// 静态表的表长
const int Maxsize = 20;

typedef struct {
// 关键字
KeyType key;
}TableElm;

typedef struct {
TableElm elm[Maxsize +1];
// 最后一个元素的下标
int n;
}SqTable

静态查找表中数组的第0个单元,用于设置“岗哨”,以便简化查找运算的实现,数据存放在数组的第1到第n个单元中,第n+1到最后一个单元为备用区。

数据结构与算法-静态查找表_数据结构

顺序查找算法描述如下:

int SearchSqTable(SqTable T, KeyType key){
T.elem[0].key = key;
int i = T.n;
while (T[i].key != key){
i--;
};
return i;
}

本算法的精炒之处在于在查找之前对T.elem[0]赋以待查的key,这样,算法中免去了每次查找表都要检测表是否查找完毕,并保证while循环一定会终止,elem[0]起到了岗哨的作用,因此,不必将i>0写入循环条件,从而简化循环条件。

顺序查找的优点是简单,对表无要求,缺点是比较次数多。

顺序查找成功时平均查找长度 ASL = (n+1)/2,查找失败时ASL = n +1。

2. 二分查找

如果顺序表中的数据元素是按照键值大小的顺序排列的,查找运算可以用效率更高的二分查找实现。

二分查找的查找过程为每次用给定值与处在表中间位置的数据元素的键值进行比较,确定给定值的所在区间,然后逐步缩小查找区间,重复这个过程直到找到或确认找不到该元素为止。

用给定值key与处在中间位置的数据元素T.elm[mid]的键值T.elm[mid].key进行比较,可根据三种比较结果区分三种情况:

1. key = T.elm[mid].key ,查找成功,T.elm[mid]即为待查元素。

2. key < T.elm[mid].key,说明若待查元素在表中,则一定排在T.elm[mid]之前。

3. key > T.elm[mid].key,说明若待查元素在表中,则一定排在T.elm[mid]之后。

二分查找示意图:

数据结构与算法-静态查找表_算法_02

二分查找的算法如下:

int SearchBin(SqTable T,KeyType key){
int low, high;
low = 1, high = T.n;
while(low<=high){
int mid = (low+high)/2;
if(key == T.elm[mid].key){
return mid;
}else if(key <T.elm[mid].key){
high = mid -1;
}else{
low = mid +1;
}
}
}

二分查找算法每进行一次键值与给定值的比较,查找区间的长度至少减少为原来的二分之一,由此我们可以得出以下结论:

数据结构与算法-静态查找表_二分查找_03

二分查找的时间性能比顺序查找好,但是相比顺序查找,二分查找要求表元素是排好序的,当采用的存储结构不是顺序表,或者顺序表中的元素未按键值的次序递增或递减排列时,则不能进行二分查找。

3. 索引顺序查找

索引顺序表是结合了顺序查找和二分查找的优点构造的一种带索引的存储结构,索引顺序表由两部分组成:一个索引表和一个顺序表。其中顺序表的组织形式与普通的顺序表完全相同,而索引表在组织形式上本身也是一个顺序表。

索引表通过索引将顺序表分割为若干块,让顺序表呈现出“按块有序”的性质,所谓“按块有序”是指顺序表中的数据元素被划分为一些子表,并且对其中任意两个相邻的子表来说,排在后面的子表中的任一数据元素的键值大于排在前面子表中的所有数据元素的键值。

数据结构与算法-静态查找表_二分查找_04

查找步骤:

1. 先建立最大或最小关键字表。


将每块中最大或最小关键字及指示块首记录在表中位置的指针依次存入一张表中,此表称为索引表,将索引表按键值进行排序。



2. 查找索引表,以确定所查元素所在的块号。


将查找关键字k与索引表中每一元素(即各块中最大关键字)进行比较,以确定所查元素所在块号。




3. 在相应块中按顺序查找关键字为k的记录。





数据结构与算法-静态查找表_顺序查找_05


算法分析



数据结构与算法-静态查找表_顺序查找_06


4. 总结

静态查找表的上述三种不同实现各有优缺点。其中,顺序查找效率最低但限制最少;二分查找效率最高,但限制最强;而分块查找则介于上述二者之间,在实际应用中应根据需要加以选择。


标签:二分,顺序,mid,索引,算法,查找,key,数据结构
From: https://blog.51cto.com/u_15959833/6046809

相关文章

  • 数据结构与算法-查找
    查找就是从大量的数据元素中找出指定的数据元素。在学习查找之前,我们必须先知道一些相关的概念。1.查找表由同一类型的数据元素(或记录)构成的集合。2.关键字(键)用来标识数据......
  • 数据结构与算法-二叉排序树
    一棵二叉排序树(BinarySortTree)(又称二叉查找树)或者是一棵空二叉树,或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值;2.若......
  • 数据结构与算法-拓扑排序
    在工程实践中,一个工程往往由若干个子项目组成,这些子项目中往往有两种关系。1.先后关系,即必须在一个子项目完成后,才能开始实施另一个子项目。2.子项目间无关系,即两个子项目......
  • 数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。1.......
  • PHP strpos() 函数查找字符串在另一字符串中第一次出现的位置
    定义和用法strpos()函数查找字符串在另一字符串中第一次出现的位置。注释:strpos()函数对大小写敏感。注释:该函数是二进制安全的。if(strpos('2020Q4','Q')!==false){e......
  • MySQL的数据结构
    阅读目录MySQL数据结构用b+tree做的为什么不用红黑树叉树呢?什么是B-Tree(B-树)?什么是B+Tree?B+Tree相对于B-Tree的几点不同MySQL数据结构用b+tree......
  • 图形学数据结构 half-edge
    这个东西,看了之后只有一个感觉WC你看了之后,很可能会感觉 俺也一样这是​​https://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml​​介绍是用来精细化......
  • 第02天-python线性数据结构
    1、数值处理1.1、内建常用数据类型1.1.1、分类数值型int、float、complex、bool序列sequence字符串str、字节序列bytes、bytearray列表list、元组t......
  • 二分查找 Leetcode704
    1.二分查找(Leetcode704)题目:给定一个n(n在[1,10000]之间)个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否......
  • 在排序数组中查找元素的第一个和最后一个位置(Leetcode34)
    3.在排序数组中查找元素的第一个和最后一个位置(Leetcode34)给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。如......