数据结构存储整数范围,查询范围和修改范围

时间:2013-09-22 20:18:22

标签: algorithm search data-structures tree

我们需要维护mobileNumber及其在内存中的位置。 我们面临的挑战是拥有超过500万用户 并且存储每个用户的位置将类似于500万条记录的哈希映射。 要解决此问题,我们必须处理范围

我们会给出电话号码范围,例如

  • range1 start =“9899123446”end =“9912345678”location =“a”

  • range2 start =“9912345679”end =“9999999999”location =“b”

号码只能属于单一地点。

我们需要一个数据结构来将这些范围存储在内存中。

它必须支持两个功能

  1. findLocation(整数)它应该返回位置名称 哪个号码属于
  2. changeLocation(整数,字符串范围)。它将Number的位置从旧位置更改为新位置
  3. 这完全是在内存设计中。

    我计划使用树结构,每个节点包含(startofrange,endofrange,location)。 我将按节目顺序保留节点。我还没有完成任何事情。 主要问题是 - 当第二个改变位置的功能被称为9899123448位置到b

    range1节点应拆分为3个节点第1个节点(9899123446,9899123447,a)  第二个节点(9899123448,9899123448,b)第三个节点(9899123449,9912345678,a)

    请建议合适的方法 提前致谢

2 个答案:

答案 0 :(得分:8)

通常,您可以使用专门的数据结构来存储范围并实施查询,例如Interval Tree

但是,由于电话号码范围不重叠,您只需将范围存储在基于标准树的数据结构中Binary Search TreeAVL Tree,{{3} },Red-Black Tree,一切都有效)仅按[开始] 排序

对于findLocation(数字),使用相应的树搜索算法查找[begin]值小于该数字的第一个元素,检查其[end]值并验证该数字是否在该范围内。如果找到匹配项,则返回该位置,否则该数字不在任何范围内。

对于changeLocation()操作:

  1. 查找包含数字
  2. 的旧节点
  3. 如果在步骤1中找到现有节点,则删除它并插入新节点
  4. 如果未找到现有节点,请插入新节点并尝试将其与相邻节点合并。
  5. 我假设你使用相同的操作来简单地添加新节点。

    更实际的是,您可以将所有条目存储在数据库中,在[begin]上构建索引。

答案 1 :(得分:2)

首先range = [begin; end; location]

使用两种结构:

  • 对数组进行排序以存储range s begin s
  • 通过end s
  • 访问locationbegin的哈希表

应用以下算法:

  1. 使用二进制搜索查找“最接近”值ob begin
  2. 使用哈希表查找end的{​​{1}}和location