假如有一群范围对格式为:<范围表示,该范围对应的结果值>,设计一个最快查找算法,使得给定一个值,输出该值所对应的范围对的结果值。
注意:范围对之间不会存在交集,也不是严格相邻,即两个区间可能不是相邻的。
例如:
<<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): 我感觉应该没这么简单,你可否把你的需求讲下,或许你的思路不对呢?
@Launcher: 需求就是上面的啊,其实范围对数不是很多(不超过20个),然后范围取值也不是很大(不超过1000吧),然后要求不能用数组下标做,就是这样,速度很关键但就是准备用数组下标
@Alexia(minmin): 那一组范围的上下限是确定的吗?
@Launcher: 额,那只是举例,范围上下限是通过别的算法计算出来的,如果是确定的,我就可以编译前做成模板了
完全没有搞明白,为什么不能用数组。数组的速度相当的快啊。
在我看来二维数组可以搞定,用二分法查key,第一例,值取用第二列。
这里优势明显,key是顺序的,二分法查询速度非常快。
按照我的看法,直接组成这样的二维数组就行了。
[1][65]
[2][65]
[3][75]
[37][75]
[44][-1]
[45][12]
等等,跳过的部分用特殊标识例如-1。这样二分查第一列,取第二列,我觉得应该很快。
另外由于数据之间不知道有没有规律所以,hash函数给我的感觉很难做出来。