【问题标题】:Binary Search Tree with 2 keys具有 2 个键的二叉搜索树
【发布时间】:2017-10-01 23:08:58
【问题描述】:

我有一个包含用户名和 ID 的用户数据库。这些是程序将处理的操作:

insert, delete (by username), search (by username), print (打印所有用户信息,按id排序)

前 3 个操作的时间复杂度不应超过 O(log n),对于打印,它应为 O(n)。应该使用平衡的 BST 来实施解决方案。

我解决问题的想法是必须有 2 个 BST,其中一个的关键是 id,另一个是 username。所以我们可以在 O(log n) 时间内通过它们的名称或 id 访问一个元素。但这会使内存空间和操作时间加倍。

有没有比我解释的更好的方式在O(log n) 时间内通过usernameid 访问元素?

【问题讨论】:

    标签: algorithm data-structures binary-search-tree red-black-tree


    【解决方案1】:

    虽然 2 棵树很好,但您也可以使用哈希表进行查找和删除,以及使用排序索引进行打印。红黑树适合排序索引。

    然而,如果 ID 是连续的非负整数,那么维护一个简单的数组会更加高效,其中位置 i 包含具有i 的 ID。现在您可以通过遍历数组来打印。并且哈希表值可以是 ID,因为这些“指向”数组中的相应对象。

    【讨论】:

    • 在需要删除用户时使用简单数组会失败,因为生成的移位操作是O(n) > O(log n)
    • 如果你做对了,那就不是真的。不要移动阵列。将空闲列表中与已删除条目对应的插槽链接起来,并将它们(连同关联的 ID)重用于新的插入。当内存比现在更昂贵时,这是一种非常常见的技术。由于节点、标志、8 字节指针(而不是 4 字节数组索引)等的开销,我的方案所需的空间很容易比两个单独的红黑树少 4 倍。
    • 如果你能保证会是这种情况,并且记得跳过尚未填充的已删除条目,那么这确实是一个非常好的解决方案......
    • 是的,主要缺点是打印将是 O(n),其中 n 是数据库曾经的最大大小。但即使删除了 3/4 或更多的条目,遍历连续数组也可能比遍历树更快。
    【解决方案2】:

    我解决问题的想法是必须要2 bst,键的一个是id和 另一个是username。所以我们可以通过他们的usernameid in O(log n) time。但这加倍的记忆空间和时间 操作。

    您建议的内容确实将对数据结构的内存和时间要求进行两倍。 (只插入和删除只需要两倍。其他操作将不额外时间)。但是,请召回O(2 log n)通常对待与O(log n)并且远低于987654330 @。作为一个插图,我在2 log nn。请注意,当n 987654334 @或4时,它们等于它们。 log nn,基本上是一个扁平线。

    我建议您不能使用平衡的bsts(或者对于这件物质)来做比这更好。由于您需要基于O(log n) 987654339 @ time,username必须是树的键。但是,您还需要在O(n) time中检索在id的用户排序的用户。基本上禁止您在检索它们后对它们进行排序,因为您将无法比O(n log n)更快地对它们进行排序。因此,他们必须已经在id中排序。因此,id必须是树的键。因此,你需要两棵树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2023-03-08
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多