线性表差找

1、顺序差找:一次按照顺序,将表中数据与给定数据相比较,若相等,则差找成功。若结束后仍然未找到相等值,则差找失败。

优点:简单适用范围广

缺点:n值很大时,差找效率很低,o(n)

扩展:前哨站顺序差找算法

将a[n]=k设置成哨站,从前到后差找,最终会差找到a[n]。可避免每一次比较元素后都需要判断下标是否越界。减少比较次数。

int SeqSearch_gai(Sqlist s,KeyType k){
int n,i=0;
n=s.length;
s.r[n].key=k;
while(s.r[i].key!=k)
  i++;
if(i==n)
  return(-1);
else 
  return(i);
}

 

2、有序表差找(折半差找):有序表指的是用数组存储且结点按关键字有序的线性表。对于有序表,我们可以采用顺序差找的方法来差找指定的关键字,但一般为提高效率,会采用折半差找(二分差找)来实现。

基本思想:设表中的结点按关键字递增有序,首先将待查值k和表中间位置上的结点关键字进行比较,若二者相等,则查找成功;否则,若k值小,则在表前半部分继续利用折半法查找,若k值大,则在表后半部分继续利用折半法查找。

优点:差找效率高,o(log(n))

缺点:需要事先对表中的关键字进行排序,排序需要花费时间。

 

3、分块差找(索引差找):要求建立一个索引表。建立过程如下:将表划分为若干块,块内的关键字不一定有序,但前一块的最大关键字一定小于后一块的最小关键字,即所谓的分块有序。再从原表的每一块中选取最大关键字和该块在表中的起始位置构建一个索引表,要求从第i块中选取的最大关键字和该块在表中的起始位置应存放到索引表的下标为i的单元处,显然由此构建的索引表是一个递增有序表。

基本思想:首先在索引表中差找以确定待查关键字所在块,然后再确定的块中顺序差找。

优点:时间效率优于顺序差找O(n1/2

缺点:增加了空间存储,劣于折半差找