处理以下用例要求的数据结构

时间:2012-02-08 01:31:59

标签: database algorithm

数据库中的所有记录都保存在(键,值)对格式中。记录总是可以通过指定键值来检索。需要开发数据结构来处理以下场景

  1. 以线性方式访问所有记录(数组或链表是此方案在O(N)时间内访问的最佳数据结构)
  2. 通过提供密钥来检索记录(可以实现哈希表以O(1)复杂度对其进行索引)
  3. 检索键中特定字节值的记录集。例如:密钥中第二个数字(10个位置)应为5的所有记录的列表,如果密钥为256,1452,362,874,则应返回密钥记录,256和1452

5 个答案:

答案 0 :(得分:3)

我假设您的密钥长度最多为d位(十进制)。

普通散列表和附加10 * d二维数组(让我们称之为A)的集合怎么样? A [i] [j]是在第j个位置具有数字i的键组。如果将它们自己实现为哈希表,则这些集可以支持O(1)插入/删除。

答案 1 :(得分:2)

对于1和2,我认为Linked Hash Map是一个不错的选择。

对于第3点,附加的哈希映射(数字,位置)元组作为键和值的指针列表。

两个数据结构都可以包含在一个数据结构中,当然两者都指向相同的数据。

答案 2 :(得分:2)

将密钥存储在trie中。对于示例中的数字(假设4位数字),它看起来像这样:

*root*
 |
 0 -- 2 - 5 - 6
 | |
 | +- 3 - 6 - 2
 | |
 | +- 8 - 7 - 4
 |
 1 - 4 - 5 - 2

可以以返回(1)或(3)的方式遍历此数据结构。对于(3)来说,维持每个数字的索引的速度不会那么快,所以我想这是一个关于空间或查找时间是否是主要问题的问题。对于(2),它已经是O(log n),但是如果你需要O(1),你可以将密钥存储在trie和哈希表中。

答案 3 :(得分:0)

首先想到的是在每条记录中嵌入一对节点。其中一个节点是按记录索引排序的树的一部分,另一个节点是按记录键排序的树的一部分。然后,您可以使用这些树通过索引或键快速访问记录。有了这个,您还可以快速访问顺序索引或键顺序中的记录。这涵盖了第一和第二个要求。

您可以为十位数值包含5的记录树添加另一个节点。这涵盖了第三个要求。

额外好处:在所有情况下都将使用相同的树处理代码。

答案 4 :(得分:0)

字典(哈希映射等)可以轻松处理这些要求,尽管您的第三个要求是O(N)操作。您只需迭代键并选择符合条件的键。你没有说出你希望的表现是什么。

但O(N)可能足够快。您的数据集中有多少项,以及您执行第三项功能的频率是多少?