静态查找表
查找的相关概念
查找,就是根据给定的某个值在一组记录集合中确定某个"特定的"数据元素(记录)或者找到属性值符合特定条件的某些记录。
查找表是由同一类型的数据元素(或记录)构成的集合。
关键字:是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。
主关键字:可以识别唯一的一个记录的关键字。
次关键字:可以识别若干记录的关键字。
对查找表常进行的操作:
静态查找表:
(1)查询某个"特定的"数据元素是否在查找表中
(2)检索某个"特定的"数据元素的各个属性
动态查找表:
(3)在查找表中插入一个数据元素
(4)从查找表中删除某个数据元素
查找的方法取决于查找表的结构。
比较式查找:
(1)基于线性表的查找
顺序查找,折半查找,分块查找
(2)基于树的查找
二叉排序树,B树,AVL树
顺序查找
顺序查找表的数据类型描述为:
#define MAXSIZE 1000 //顺序查找表记录数目
typedef int KeyType; //假设关键字类型为整型
typedef struct
{
KeyType key; //关键字项
OtherType other_data; //其他数据项
}RecordType; //记录类型
typedef struct
{
RecordType r[MAXSIZE+1];
int length; //序列长度,即实际记录个数
}SeqRList; //记录序列类型,即顺序表类型
SeqRList L; //L为一个顺序表
顺序查找的算法实现如下:
int SeqSearch(RecordList l,KeyType k)
{
int i;
i = l.length;
while(i>=1&&l.r[i].key!=k)
i--;
if(i>=1)
return i;
else
return 0;
}
顺序表查找优化:
int SeqSearch(RecordList l,KeyType k)
{
int i;
l.r[0].key = k; //标识边界(哨兵)
i = l.length;
while(l.r[i].key!=k)
i--;
return i;
}
折半查找(有序表的查找)
思路:
-
设定查找范围的下限low,上限high,由此确定查找范围的中间位置mid;
-
中间位置的值等于待查的值,查找成功。
中间位置的值小于待查的值,low=mid+1
中间位置的值大于待查的值,high=mid-1
知道low>high,查找失败。
折半查找的算法实现如下:
int BinSrch(RecordList l,KeyType k)
{
int low = 1,high = l.length,mid;
while(low<=high)
{
mid = (low + mid)/2;
if(k==l.r[mid].key)
return mid;
else if(k<l.r[mid].key)
high = mid - 1;
else
low = mid + 1;
}
return 0;
}