我有一个用户数据库及其用户名和ID。这些是程序将处理的操作:
insert
,delete
(username
),search
(username
),print
(打印所有用户信息,排序依据他们的id
)
前3个操作的时间复杂度不应超过O(log n)
,对于打印,它应为O(n)
。解决方案应该采用均衡的BST来实施。
我解决问题的想法是必须有2个BST,其中一个是id
,另一个是username
。因此,我们可以在O(log n)时间内按名称或ID访问元素。但这会使内存空间和操作时间翻倍。
有没有办法在username
时间id
和O(log n)
访问元素的方式比我解释的方式更好?
答案 0 :(得分:3)
我解决问题的想法是必须要有2个BST,其中一个是
id
和。{ 另一个是username
。因此,我们可以通过username
或id
来访问元素O(log n)
时间O(2 log n)
O(log n)
。但这会使内存空间和时间翻倍 操作
您的建议确实会使数据结构的内存和时间要求翻倍。 (只有插入和删除才需要两倍的时间。其他操作不会花费额外的时间)。但是,请注意O(n)
通常与2 log n
的处理方式相同,远小于n
。作为一个例子,我已经绘制了n
和2
。请注意,4
为log n
或n
时,它们相同。与username
相比,O(log n)
基本上是一条扁平线。
我建议你使用平衡的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,因为它们“指向”数组中的相应对象。