如何将范围映射到单个值?

How to make a map of range to a single value?

将范围映射到单个值时选择的数据结构是什么?例如。 a 的值为 1-1000,b 的值为 1001-20000,这是回答问题 "what is the key of 11234?"(答案:b)的有效方法。最直接的方法是查看所有键并检查范围是否包含搜索值,但似乎每个新键的性能都会变差。

在我的特殊情况下,我更喜欢 node.js 解决方案,但我认为这无关紧要。

您可以使用任何平衡树。按下限对范围进行排序,但在节点中还保留有关上限的信息,当然还有您的映射值。

   1001 (20000, a)
  /
1 (1000, b)

然后当您查找键 x 时,总是 return 不大于 x 的最大键。这是一个标准的二叉树查找 O(log n)。在节点中,您有关于范围的信息,因此您可以检查 x 是否在范围内。

当您查找 11234 时,您将获得节点 1001 (20000 b)。 11234 在 1001-20000 内,所以你的值为 b。如果您查找 0,您将得到 null/none,因此您的密钥未映射。如果您查找 1000,5,您将得到 1 (1000 a)。 1000,5 超出了该范围,因此您的密钥未映射。

当然你的范围不能重叠