【发布时间】:2012-02-21 00:36:25
【问题描述】:
我知道我可以散列奇异值作为 dict 中的键。例如,我可以将5 散列为dict 中的键之一。
我目前面临一个问题,需要我对一系列值进行散列。
基本上,我需要一种更快的方法来做到这一点:
if 0 <= x <= 0.1:
# f(A)
elif 0.1 <= x <= 0.2:
# f(B)
elif 0.2 <= x <= 0.3:
# f(C)
elif 0.3 <= x <= 0.4:
# f(D)
elif 0.4 <= x <= 0.5:
# f(E)
elif 0.5 <= x <= 0.6:
# f(F)
其中x 是一些任意精度的float 参数。
我能想到的最快的方法是散列,但问题是:我可以使用 (0.1, 0.2) 作为键,但这仍然会花费我 O(n) 的运行时间,并且最终不会比elifs(我必须遍历键并检查是否有 key[0] <= x <= key[1])。
有没有办法对一系列值进行散列,以便我可以检查0.15 的散列表并仍然得到#execute B?
如果这样的散列是不可能的,我还能如何改进它的运行时间?我正在处理足够大的数据集,线性运行时间不够快。
编辑:为了回应奇恩的回答,我必须注意不能假定间隔是规则的。事实上,我几乎可以保证他们不是
为了响应 cmets 中的请求,我应该提到我这样做是为了尝试实现 fitness-based selection in a genetic algorithm。算法本身是做功课的,但具体实现只是为了提高生成实验数据的运行时间。
【问题讨论】:
-
请注意,在第一个
if之后的0.n <=部分后一个elifs 在逻辑上是多余的。这将使代码更快。 -
你有大量的区间吗?
-
您能否详细解释一下您在做什么以及为什么?我很难相信这里的分支速度占主导地位,除非 A 到 F 几乎什么都不做,在这种情况下我会有一组不同的建议。
-
所有范围放在一起时是否保证是连续的,或者可以是
.1 < x < .2,然后跳到.3 < x < .4,.2 < x < .3什么都没有? -
如果你真的关心速度,我会考虑用 c 或汇编编写那部分代码,然后用 python 引用它
标签: python hash universal-hashing