首页 新闻 搜索 专区 学院

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

0
悬赏园豆:60 [待解决问题]

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

例如:
<<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函数能设计出来吗?

Alexia(minmin)的主页 Alexia(minmin) | 初学一级 | 园豆:4
提问于:2014-06-23 13:44
< >
分享
所有回答(2)
0

不太可能,因为你的范围同给定值只有大小关系,没有算术关系。

Launcher | 园豆:45045 (高人七级) | 2014-06-23 17:49

恩,我也觉得是,哎,死心吧

支持(0) 反对(0) Alexia(minmin) | 园豆:4 (初学一级) | 2014-06-23 20:35

@Alexia(minmin): 我感觉应该没这么简单,你可否把你的需求讲下,或许你的思路不对呢?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-24 08:02

@Launcher: 需求就是上面的啊,其实范围对数不是很多(不超过20个),然后范围取值也不是很大(不超过1000吧),然后要求不能用数组下标做,就是这样,速度很关键但就是准备用数组下标

支持(0) 反对(0) Alexia(minmin) | 园豆:4 (初学一级) | 2014-06-24 17:27

@Alexia(minmin): 那一组范围的上下限是确定的吗?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-06-24 17:30

@Launcher: 额,那只是举例,范围上下限是通过别的算法计算出来的,如果是确定的,我就可以编译前做成模板了

支持(0) 反对(0) Alexia(minmin) | 园豆:4 (初学一级) | 2014-06-25 12:32
0

完全没有搞明白,为什么不能用数组。数组的速度相当的快啊。

在我看来二维数组可以搞定,用二分法查key,第一例,值取用第二列。

这里优势明显,key是顺序的,二分法查询速度非常快。

按照我的看法,直接组成这样的二维数组就行了。

[1][65]

[2][65]

[3][75]

[37][75]

[44][-1]

[45][12]

等等,跳过的部分用特殊标识例如-1。这样二分查第一列,取第二列,我觉得应该很快。

另外由于数据之间不知道有没有规律所以,hash函数给我的感觉很难做出来。

yhdino | 园豆:701 (小虾三级) | 2014-06-26 09:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册