“算法设计手册”一书中的消息3-7说:
假设您可以访问平衡字典数据结构,该结构支持O(log n)时间内的每个操作搜索,插入,删除,最小,最大,后继和前任。解释如何修改插入和删除操作,使它们仍然采用O(log n),但现在最小和最大需要O(1)时间。 (提示:考虑使用抽象字典操作,而不是使用指针等等。)
如果没有提示,我认为这个问题相当容易。
这是我的解决方案:
对于树,我只是保持指针min总是指向最小值,另一个指针max总是指向最大值。
插入x时,我只需将min.key与x.key,if min.key > x.key, then min = x;
进行比较,如果需要,也可以将此值设为最大值。
删除x时,if min==x, then min = successor(x); if max==x, then max = predecessor(x);
但暗示说我不能捣乱指针之类的东西。我的解决方案是否与指针混淆?
如果我们不能使用加分,我怎样才能得到O(1)的最小值和最大值?
由于
答案 0 :(得分:1)
您可以使用Min-Max Heaps
获得更新/删除的日志(N)时间和获取最小/最大值的固定时间答案 1 :(得分:1)
你的答案与我给出的答案相同 - 你没有弄乱指针,你只是存储最小/最大值。
所以,请更加自信:)。
答案 2 :(得分:0)
我认为你不能得到最高和最低的O(1)。
无论如何,这本书希望你自己发现binary heaps。如果你想自己做,不要看链接。只考虑这个提示:“树的根总是包含最小值”(如果你想要“最大”为O(1),则为最大值)。
答案 3 :(得分:0)
我会使用两个二进制堆:最小和最大堆。在每一个中你存储了一半的元素,这样你就可以在O(1)时间内访问max和min。最小堆将包含具有最小元素的一半,最大堆包含具有较大元素的一半。插入/删除操作仍然是O(log n)。插入新元素时,只需检查它应该去哪个堆。
答案 4 :(得分:0)
存储两个值,最大值和最小值。需要检查这些内容并在每次删除时进行更新。如果要删除最小值,请调用后继者,更新最小值并删除旧项目。在插入时,将新项目与min / max进行比较,如果它替换任何一项,则相应地更新最小/最大值