如何在O(1)时间内在稀疏python列表(或dict)中找到最近的*键?

如何在O(1)时间内在稀疏python列表(或dict)中找到最近的*键?,python,algorithm,search,Python,Algorithm,Search,我有一些代码,其中我有一些dict,看起来像这样: d = {63:1, 96:2, 128:3, 192:4, 256:6, 384:9, 480:12, 511:14} example = {2:12, 4:17, 7:21, 8:50} 它们与另一个查找键一起使用以执行阈值检查:我们希望找到与最近的dict键关联的值,该值高于查找键。因此,对于上面的dict,搜索任何k63&&k你应该首先问自己:这里是否存在O(1)解?这种解决方案存在的唯一方法是,您可以通过算术或位运算从“查找”键

我有一些代码,其中我有一些dict,看起来像这样:

d = {63:1, 96:2, 128:3, 192:4, 256:6, 384:9, 480:12, 511:14}
example = {2:12, 4:17, 7:21, 8:50} 

它们与另一个查找键一起使用以执行阈值检查:我们希望找到与最近的dict键关联的值,该值高于查找键。因此,对于上面的dict,搜索任何
k63&&k你应该首先问自己:这里是否存在O(1)解?这种解决方案存在的唯一方法是,您可以通过算术或位运算从“查找”键中计算“最近的”键。看起来您的所有键都是以下模式之一:
2^n-1
2^n+2^(n-1)
,对于
n
的某些值,
2^n
。这组公式是否详尽地列出了您所有的真实密钥?如果没有,还有什么其他模式?您可以利用这两种模式的强大功能来计算
O(1)
中所需的值。如果您认为某个参数的值相同,可以在二进制搜索之前使用
functools.memoize
。这将为您提供缓存命中的O(1)性能。如果我必须在优化万亿次检查与在内存中缓存O(1)查找解决方案之间进行选择,我肯定会选择后者。O(logn)足够好吗?在O(logn)时间内,你可以在一个平衡的二叉搜索树中找到最小的大于或最大的小于?这种解决方案存在的唯一方法是,您可以通过算术或位运算从“查找”键中计算“最近的”键。看起来您的所有键都是以下模式之一:
2^n-1
2^n+2^(n-1)
,对于
n
的某些值,
2^n
。这组公式是否详尽地列出了您所有的真实密钥?如果没有,还有什么其他模式?您可以利用这两种模式的强大功能来计算
O(1)
中所需的值。如果您认为某个参数的值相同,可以在二进制搜索之前使用
functools.memoize
。这将为您提供缓存命中的O(1)性能。如果我必须在优化万亿次检查与在内存中缓存O(1)查找解决方案之间进行选择,我肯定会选择后者。O(logn)足够好吗?在O(logn)时间内,您可以在平衡二叉搜索树中找到大于或小于的最小值。
example = {2:12, 4:17, 7:21, 8:50} 
        Idx =   0   1   2   3   4   5   6   7   8
directTable = [12, 12, 12, 17, 17, 21, 21, 21, 50]