带2个键的二进制搜索树

时间:2017-05-03 23:27:49

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

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

insertdeleteusername),searchusername),print(打印所有用户信息,排序依据他们的id

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

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

有没有办法在username时间idO(log n)访问元素的方式比我解释的方式更好?

2 个答案:

答案 0 :(得分:3)

  

我解决问题的想法是必须要有2个BST,其中一个是id和。{   另一个是username。因此,我们可以通过usernameid来访问元素   O(log n)时间O(2 log n) O(log n)。但这会使内存空间和时间翻倍   操作

您的建议确实会使数据结构的内存和时间要求翻倍。 (只有插入和删除才需要两倍的时间。其他操作不会花费额外的时间)。但是,请注意O(n)通常与2 log n的处理方式相同,远小于n。作为一个例子,我已经绘制了n2。请注意,4log nn时,它们相同。与username相比,O(log n)基本上是一条扁平线。 enter image description here

我建议你使用平衡的BST(或根本不是这样)做得比这更好。由于您需要在username时间内根据id进行搜索,因此O(n)必须是树的关键字。但是,您还需要在O(n log n)时间内检索按id排序的用户。这基本上禁止您在检索它们之后对它们进行排序,因为您无法比id更快地对它们进行排序。因此,它们必须已按flatMap排序。因此,service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } 必须是树的关键。因此,你需要两棵树。

答案 1 :(得分:2)

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

然而 ,如果ID是连续的非负整数,维护一个简单的数组会更高效,其中position i包含对象ID为i。现在您可以通过遍历数组进行打印。哈希表值可以是ID,因为它们“指向”数组中的相应对象。