【问题标题】:Key lookup from a data structure based on range基于范围的数据结构中的键查找
【发布时间】:2011-07-27 23:05:03
【问题描述】:

例如,如果我有以下场景

  1. 如果键的范围是 1-4,则选择 A。
  2. 如果键的范围是 5-6,则选择 B。

如果请求获取 key=2 的值,那么我应该返回 A,对于 5,返回 B 等等。保持这种关联的良好数据结构是什么?我可以通过存储 1-A、2-A、3-A、4-A、5-B 和 6-B 来创建哈希图,但想检查是否有更好的方法来实现这一点。

【问题讨论】:

  • 值可以重叠吗?即 (1-4,A),(4-6,B) 是数据结构的合法值吗?
  • 如果数据不是动态的,是否可以考虑使用静态方法,然后使用 switch 语句。即案例 1:案例 2:.. return A 等如果数据是固定的,那么很容易阅读更新。
  • @Amit:如果你问同一个范围是否可以应用于多个值,答案是否定的。

标签: data-structures


【解决方案1】:

对范围内的每个项目使用哈希映射似乎过于广泛,如果范围是 (1-2^20) 怎么办?如果它是双倍的怎么办?存放这些东西太贵了。

您可以使用普通的跳过列表/树,其中将包括每个范围的下限和上限。请注意,在二叉树中搜索值时,如果它不存在,则搜索将在搜索之前/之后处于下一个值时结束,例如:如果您有范围键 1,4,并且您搜索 3 ,当您到达 1 或 4 时,搜索将结束。因此我们可以将范围的上限/下限存储在树中。

现在,我们还需要为其中的每一个存储真实范围(因此,如果我们有 1-4,8-​​9 并且我们搜索 7,当我们到达 4/8 时我们会知道它是无效的)。所以如果key在合法范围内,我们会在搜索时到达它的上限/下限!

所以总而言之,只要加上上下界,当你在搜索时,搜索键,看看边界是否匹配。

ops 应该是这样的(伪代码):

add (lower,upper,value):
   tree.add(lower/*key*/,(lower,upper,value))
   tree.add(upper/*key*/,(lower,upper,value))
search (key):
   node = tree.search(key)
   if node.lower <= key <= node.upper: 
      return node.value
   return KEY_NOT_IN_TREE_ERROR
del(lower,upper):
  tree.del(lower)
  tree.del (upper)

这些操作中的每一个都是 O(logn),比散列慢,但它会消耗更少的空间。

【讨论】:

    【解决方案2】:

    您可以创建一对&lt;interval,associated value&gt; 并构建segment tree。它适用于重叠间隔。

    如果区间从不重叠,它仍然可以,因为段树比基于散列的解决方案需要更少的内存。如果范围很宽,任何简单的结构都需要大量内存。

    编辑:我意识到通常的向量比散列更适合您的目的,以防间隔彼此靠近。

    【讨论】:

      【解决方案3】:

      阿米特是正确的。对于不重叠的范围,一个简单的有序数据结构就足够了。更清楚一点:

      按照范围的最小范围对范围进行排序。搜索时,快速检查树,看看你是否在你遍历的每个节点的范围内。

      【讨论】:

        【解决方案4】:

        最好使用类的对象作为hashmap的key来存储。

        在类中,您可以将字段定义为上限、下限,并且应该覆盖 equals 和 hashCode 方法。

        在 equals 中,您可以编写逻辑来比较关键对象的上限和下限在 this.upperbound 和 this.lower 之间。

        要获取值,请创建具有相同上界 = 下界 = key_val 的键对象;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-27
          相关资源
          最近更新 更多