在静态查找表中,我们只允许下面两件事:
1.在查找表中查找某个记录是否在表中
2.查找表中记录的各个属性
在动态查找表中,我们允许四件事:
1.在查找表中查找某个记录是否在表中
2.查找表中记录的各个属性
3.将一个表中不存在的记录插入到表中
4.删除表中一个记录
顺序查找是一个最简单的查找方法,具体实现方法没有什么好说的,一个循环暴力解决。
时间复杂度:O(n)
二分查找只适用于一个有序的表(升序/降序)。
时间复杂度:O( )
对于二分查找,我们这样定义:
首先我们有三个指针:low、mid、high。
其中low指向查找区域的下界,mid指向查找区域的中间位置,high指向查找区域的上界。
其次,我们假设我们查找的值为key,表中的值为num
1.首先确定初始查找的范围:
low = 1,high = n
2.令mid = 【(low + high) / 2】->(取整)
3.比较:
(1)若key = num,则代表查找成功
(2)若key>num,说明key值在num的右边区域,也就是整个查找表中mid的右边区域。
此时需要修改下界值,令low = mid + 1
(3)若key
此时需要修改上界值,令high = mid - 1
4.重复步骤2和3,直到key=num查找成功,或者low>high代表表中没有这个key值,查找失败。
例如,我们有下面这一个有序表:
(5,12,19,23,34,56,62,75,80,87,98)
我们想要查找key = 23在表中的位置。
二分查找步骤为:
1.初始化指针:
low = 1,high = 11,mid = 6
2.随后进行比较:
最后返回位置4。
#include
#define MAX_NUM 100
typedef int KeyType;
typedef struct{
KeyType key;
}ElemType;
typedef struct{
ElemType elem[MAX_NUM];
int length;
}SSTable;
void CreateSSTable(SSTable *st,KeyType *Sample_Data)
{
int i;
st->length = 11;
for(i=0;ilength;i++){
st->elem[i].key = Sample_Data[i];
}
printf("顺序表建立成功.\n");
}
int Binary_Search(SSTable *st,KeyType n)
{
int i;
int low = 0,high = st->length - 1,mid;
while(low<=high){
mid = (low + high) / 2;
if(st->elem[mid].key == n)
return mid;
else if(n < st->elem[mid].key)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
int main()
{
KeyType Sample_Data[11]={5,12,19,23,34,56,62,75,80,87,98};
SSTable st;
CreateSSTable(&st,Sample_Data);
int res = Binary_Search(&st,23);
if(res != -1){
printf("23的位置在表中的下标索引值为:{%d}\n",res);
}
else{
printf("错误,表中不存在该值.\n");
}
return 0;
}
值得注意的是,上图的代码编写中,为了方便起见,我让起始位置下界为0,上界为表长度减一。
分块查找也叫索引顺序查找,是顺序查找的一种改进。
存储结构仍是基本顺序表,但是需要另外建立一个新的索引表。
该索引表,指示表中各个位置,例如将基本表分成三张小表,则索引表指示这三个小表。
并且小表与小表之间是有顺序的,但是小表内的数据可以是无序的。
例如,第一张小表内的所有数据都小于第二张小表内的所有数据,第二张小表内的所有数据都小于
第三张小表的所有数据。
时间复杂度:介于二分查找和顺序查找之间。
如下图所示: