- 论坛徽章:
- 93
|
回复 21# cao627
@ouiki
@cao627
cao627 发表于 2013-04-10 16:26 ![]()
一本没有索引的书,有1000页,每一页是你要的不同内容,设翻到任意页的时间为1t,所以你要查看任意一页内容,平均花费时间为500t.
将这本书家加上索引,索引占满一页,这时得到任意页你要的内容的时间为2t.
现在是:将原书每一页的内容拆成十页,原书变成10000页,索引变成10页,得到任意内容的时间变为6t,5t得到索引的平均时间,加1t根据索引值翻到相应页的时间。
那本没索引的1000页的书,用两分法翻的话10次之内一定能翻到任意要的内容,2的10次方等于1024。
所以平均5t就能翻到要的内容
有点疑问。
你这个类比相当于是把 IP 的比较类比为页码的比较,根据 IP 得到地址信息类比为翻页。
假设 hash 和二分的方法都已经把数据读入内存(当然实际也是这么做的),那么根据 IP 得到地址的信息即是根据key取值,可以认为速度很快,且只需要一次操作,这个时间忽略。
那么实际的时间都是花费在比较“页码”的操作上,即 IP 地址的比较。
“一本没有索引的书,有1000页,每一页是你要的不同内容,设翻到任意页的时间为1t,所以你要查看任意一页内容,平均花费时间为500t.”
从这一句来看,这个类比其实说的是顺序查找法。这个 t 是一个页码的比较,结论没问题。
“将这本书家加上索引,索引占满一页,这时得到任意页你要的内容的时间为2t.”
这一句指的是将 IP 范围展开,所有 IP 都做成 key 的 hash 表,结论没问题。
“现在是:将原书每一页的内容拆成十页,原书变成10000页,索引变成10页,得到任意内容的时间变为6t,5t得到索引的平均时间,加1t根据索引值翻到相应页的时间。”
这一句和 lz 的设定不符,实际上没有“十页”,只有四页“索引”,每一页索引是要比较的,所以是4t,并且“翻页”时间是不计的,所以以最大比较次数来算,是 4t。
另外算法上做优化,比如有一些 IP 没有四页,所以结果要 < 4t。
“那本没索引的1000页的书,用两分法翻的话10次之内一定能翻到任意要的内容,2的10次方等于1024。所以平均5t就能翻到要的内容”
这个计算我就不在行了,以你的为准 5t。
那么结果是使用 hash 的方法略优于二分法。 |
|