首页  >  问答  >  正文

c++ - 针对区间范围设计一个高效hash函数,使得一个区间里的数对应一个hash值

假如有一群范围对格式为:<范围表示,该范围对应的结果值>,设计一个最快查找算法,使得给定一个值,输出该值所对应的范围对的结果值。
注意:范围对之间不会存在交集,也不是严格相邻,即两个区间可能不是相邻的。

例如:
<<1, 2>, 65>
<<3, 37>, 75>
<<45, 157>, 12>
<<160, 200>, 23>
<<210, 255>, 121>
……
如果给定一个数78,则输出12,因为78属于范围对<45, 159>

要求:不要用数组存储下标求值,因为范围对可能非常大。

针对这个问题,我目前的解法是利用二分查找,针对范围对的高效查找算法设计(不准用数组)

但还是不够快,我现在有个新的思路,就是:
能不能设计利用这些范围对设计一个hash函数,使得一个区间对应一个hash值,举个例子:
上面的第一对范围<1, 2>里的所有数即1和2都对应hash值1,<3, 37>里的所有值3~37都对应hash值2,以此类推……

这样类似的hash函数能设计出来吗?

ringa_leeringa_lee2715 天前754

全部回复(2)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:28:04

    你可能需要Geohash??跟你的想法很类似,也是二分确定区间给定hash。
    http://en.wikipedia.org/wiki/Geohash
    http://www.cnblogs.com/LBSer/p/3310455.html

    回复
    0
  • 怪我咯

    怪我咯2017-04-17 11:28:04

    这种hash函数叫做perfect hash.
    linux有一个工具专门干这个事:
    http://www.gnu.org/software/gperf/

    补充:
    上面这个思路有问题。

    这个问题应该和路由器中的路由表查找问题是一个问题,
    大型路由器为了速度,貌似对这种查找的速度做过大量优化,用的比较多的,貌似是trie。
    或许可以直接利用已有成果?

    回复
    0
  • 取消回复