严奶奶说监视哨兵能让顺序查找时间减半! 真的吗?

       在严奶奶版的《数据结构》一书中, 严奶奶引用了别的书的观点: 在顺序查找时(设表长>=1000), 引入监视哨兵, 可以减少几乎一半的查询时间。

       理论上,引入监视哨兵, 的确可以优化时间。来测试一下, 看看引入监视哨兵的前后对比:

#include <iostream>
#include <ctime>
#include <windows.h>
#define N 100001
#define TIMES 1000
using namespace std;

int find_v1(int a[], int n, int k)
{
	int i = 1;
	for(; i < n && a[i] != k; i++);

	return (i == n ? 0 : i);
}

int find_v2(int a[], int n, int k)  // 带监视哨兵
{
	a[0] = k;
	int i = n - 1;
	for(; a[i] != k; i--);

	return i;
}

void init_array(int a[], int n)
{
	int i = 1;
	for(; i < n; i++)  // a[0]处不存元素,空出来
	{
		a[i] = i;
	}
}

int main()
{
	int j = 0;
	int a[N];
	init_array(a, N);
	clock_t start, finish;

	int k = -1; // 待查找的数, 这里定为-1, 就是假定找不到这个k

	// 不带哨兵
	{
		start = clock();
		for(j = 0; j < TIMES; j++) 
			find_v1(a, N, k);
		finish = clock();
		cout  << finish - start << endl;
	}

	// 带哨兵
	{
		start = clock();
		for(j = 0; j < TIMES; j++) 
			find_v2(a, N, k);
		finish = clock();
		cout  << finish - start << endl;
	}

    return 0;
}

        可以看到,引入监视哨兵, 每次循环少了边界判断(i < n), 实际运行了多次,  其中一次结果的数据是(单位是毫秒):

453
381

       多次反复测试, 均表明引入监视哨兵确实有好处, 但从我的测试来看, 远远达不到一半的优化。 当时, 看到严奶奶那个引用别人的论断时, 我就怀疑, 严奶奶应该没有实际测试过。

       在严奶奶的书中, 好几个地方都说“经验表明”, 呵呵。 要么给出证明, 要么给出大量的经验数据(包括各种测试条件的设置)。 想引用别人的书也可以, 但别人的书也得经验数据齐全啊, 否则这有点像多级指针, 指针指一指, 责任全抛开。

      若是仅仅一句“经验表明”, 就有点呵呵哒了。

       

      不多说。

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值