在严奶奶版的《数据结构》一书中, 严奶奶引用了别的书的观点: 在顺序查找时(设表长>=1000), 引入监视哨兵, 可以减少几乎一半的查询时间。
理论上,引入监视哨兵, 的确可以优化时间。来测试一下, 看看引入监视哨兵的前后对比:
#include<stdio.h>
#include<time.h>
#define TIMES 10000
#define N 10001void fillArray(int *arr, int c)
{
int i = 0;
for(i = 0;i < c ;i++)
{
arr[i] = i;
}
}int func_v1(int *arr, int c, int k)
{
int i = 1;
for(; i < c && arr[i] != k; i++);
return (i == c) ? 0:i;
}int func_v2(int *arr, int c, int k)
{
int i = c-1;
arr[0] = k;
for(; arr[i] != k; i--);
return i;
}int main()
{
int arr[N] = {0};
int k = -1;
int j = 0;
int start = 0,end = 0;
fillArray(arr, N);
start = clock();
for(j=0; j < TIMES; j++)
{
func_v1(arr, N, k); //不带哨兵
}
end = clock();
printf("func_v1 time:%d\n", end - start);
start = clock();
for(j=0; j < TIMES; j++)
{
func_v2(arr, N, k); //带哨兵
}
end = clock();
printf("func_v2 time:%d\n", end - start);
}
运行结果:
func_v1 time:317277
func_v2 time:262358
多次反复测试, 均表明引入监视哨兵确实有好处, 但从我的测试来看, 远远达不到一半的优化。