将范围映射到单个值的数据结构是什么?例如。 a
的值为1-1000,b
的值为1001-20000,这是回答“11234的关键是什么?”这一问题的有效方法。 (回答:b
)。最直接的方法是查看所有键并检查范围是否包含搜索值,但似乎每个新键的性能会变差。
在我的特定情况下,我更喜欢node.js解决方案,但我想它应该没关系。
答案 0 :(得分:1)
你可以使用任何平衡的树。按下限排序范围,但在节点中保留有关上限的信息,当然也包括映射值。
1001 (20000, a)
/
1 (1000, b)
然后当您查找密钥x
时,请始终返回不超过x
的最大密钥。它是标准的二叉树查找O(log n)。在节点中,您可以获得有关范围的信息,以便检查x
是否在范围内。
当您查找11234时,您将获得节点1001 (20000 b)
。 11234在1001-20000之内,因此您的值为b
。如果你找0,你会得到null / none,所以你的密钥没有映射。如果您寻找1000,5,您将获得1 (1000 a)
。 1000,5超出了该范围,因此您的密钥未映射。
当然你的范围不能重叠