所谓“查找”记为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据,即在给定信息集上寻找特定信息元素的过程。
为了便于讨论,必须给出这个“特定的”词的确切含义。首先,引入一个“关键字”的概念;
关键字(Key) 是数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录);
查找(Serching)根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找成功,此时查找的结果为给出整个记录的信息,或只是该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个“空”记录或“空”指针。
查找方法有顺序查找、折半查找、分块查找、Hash表查找等。查找算法的优劣将影响到计算机的使用效率,应根据应用场合选择相应的查找算法。评价一个算法的好坏,一是时间复杂度(T(n)),n 为问题的体积,此时为表长;二是空间复杂度(D(n));三是算法的结构等其他特性;
对查找算法,主要分析其T(n)。查找过程是key的比较过程,时间主要耗费在各记录的key与给定k值的比较上,比较次数越多,算法效率越差(即T(n)量级越高),故用“比较次数”刻画算法的T(n)。另外,不能以查找某个记录的时间来作为T(n),一般以“平均查找长度”来衡量 T(n)。
一、顺序表的查找
所谓顺序表(Sequential Table),是将表中记录(R1 、R2。。。Rn)按其序号存储于一维数组空间,其特点是相邻记录的物理位置也是相邻的。
记录Ri的类型描述如下:
typedef int key_t;
typedef struct {
key_t key; //记录key值
/* value ... */
} record_t;
<span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"></span>
顺序表类型描述如下:
#define N 1024 /* max length of list = n */
/*