[TAOCP第三卷6.1节]顺序搜索

TAOCP第三卷搜索算法中最先讲的就是顺序搜索。
顺序搜索的优点是足够的简单,在数据量足够小的时候速度最快。
而且在无序数据集的时候顺序搜索是唯一可行的方法。

首先是6.1节的程序S

int search(int array[],int count, int n) {
int i = 0;
for(; i < count; i++) {
if(array[i] == n) {
return i;
}
}
return -1;
}

非常简单,但是每个循环需要比较两次。
通过在尾部追加一个哨兵值,可以把比较次数降为一次。
这就是6.1节的算法Q:

int search(int array[],int count, int n) {
int i = 0;
int t = array[count]; //假设这里有空间,先保存现场
array[count] = n;
for(; array[i] != n; i++) {
}
array[count] = t; //还原现场
if(i < count) {
return i;
else {
return -1;
}
}

当n比较大的时候会比算法S快一些。但是要求在array的尾部有多余的空间,
内存分配的时候需要注意一点。

算法Q有个一个优化版Q'

int search(int array[],int count, int n) {
int i = 0;
int t = array[count];
array[count] = n;
while(1) {
if(array[i] == n) {
break;
}
if(array[i+1] == n) {
i++;
break;
}
i += 2
}
array[count] = t;
if(i < count) {
return i;
else {
return -1;
}
}

一次步进2,算是一种手工的循环展开吧。
不过gcc使用-O3参数时会自动进行循环展开,
这种工作还是留给编译器吧。

如果数据是有序的,则可以使用算法T:

int search(int array[],int count, int n) {
int i = 0;
int t = array[count];
array[count] = INT_MAX; //设置一个大于array中所有值的值
for(; array[i] < n; i++) {
}

array[count] = t;

//array[i] >= n
if(i < count && array[i] == n) { //多了一个判断条件
return i;
else {
return -1;
}
}

在查找成功的时候算法T和算法Q一样快,
但是失败的时候T比Q大约两倍。

对于有序数据可以使用更快的二分查找,
但是并不是所有的时候二分查找都跟快。
在数据总数N比较小的时候,算法T更快,而且T更简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值