C接口与实现---之三

这本书有种相见恨晚,如果在学习数据结构之前看的话,代码的可阅读性肯定会有很大的提升,一直在想一个问题,类似的书为啥国外版的就要好很多,这里并不是一味地的说外国的东西好, 看看这些书的练习体你就知道了,国外的是在教你怎样去思考一个问题,一个问题之后有更多的问题让你思考,而国内C语言相关书的练习题都是抄来抄去。基本还停留在打印一个星星之类。

第三章就是教你怎样写一个更好的hashtable, 针对hash碰撞问题在习题3.1中给出的一方案叫你去验证比较,之后又给了一些可供参考的hash算法。好的一本书就当如此,在不断的叫你思考。
下面来看看书中例子的分散图:
图片描述

其中横坐标表示0-2048的入口,纵坐标表示数组每个入口里面被hash的string,可以看到我们的分布式极不均匀的。理论上10000个string应该是均匀的分布到2048上的,也就是每个入口上有5个左右的字符串。再来看看其对应的直方图:
图片描述

可以看到一半左右的入口是空的。

下面来看看buckets为2039并使用如下的hash函数优化后的效果:

 for (h = 0, i = 0; i < len; i++) {
    h = (h << 1) + scatter[(unsigned char)str[i]];
  }
  h &= 0x7fffffff;
  h %= NELEMS(buckets);

分散图:
图片描述

对应的直方图:
图片描述

可以看到其符合二项分布的规律,相对于之前的函数分布的要均匀很多。

-END-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值