【发布时间】:2013-10-03 22:15:07
【问题描述】:
这是大约 3 年前问我的一个面试问题,我在不久前就在思考这个问题。
设计一个支持以下操作的数据结构: insert_back()、remove_front() 和 find_mode()。最佳复杂度 必填。
我能想到的最佳解决方案是 O(logn) 用于插入和删除,O(1) 用于模式。这就是我解决它的方法:保留一个队列 DS 来处理插入和删除的元素。 还要保留一个最大堆排序的数组和一个哈希表。 哈希表包含一个整数键和指向该元素的堆数组位置的索引。堆数组包含一个有序对 (count,element),并在 count 属性上排序。
插入:将元素插入队列。从哈希表中找到堆数组索引的位置。如果不存在,则将元素添加到堆中并向上堆。然后将最终位置添加到哈希表中。增加该位置的计数并根据需要向上或向下堆化以恢复堆属性。
删除:从队列头部删除元素。从哈希表中,找到堆数组索引中的位置。减少堆中的计数并根据需要向上或向下重新堆以恢复堆属性。
查找模式:数组堆头部的元素 (getMax()) 将为我们提供模式。
有人可以提出更好的建议吗?我能想到的唯一优化是使用斐波那契堆,但我不确定这是否适合这个问题。
【问题讨论】:
-
您描述的是
Deque,它非常标准。 -
但是双端队列(我认为是双端队列)如何跟踪数组中出现次数最多的元素?任何链接都会有所帮助。感谢您的及时回答
-
啊,我道歉。我忽略了要求的
Find_Mode方面。我应该说你描述的结构是Deque。您可以看到基本实现中的所有操作都是 O(1) - 但是,find 不是其中之一......抱歉在这里浪费您的时间。 -
再读一遍,我会实现一个基本的
Deque类,这里所有的核心操作(PushFront/Back,PopFront/Back和扩展数组大小都是O(1)。然后到这个类(正如我认为你在上面所说的那样)我会实现一个Find,它只是循环遍历Deque的条目,这将是O(n)。如果你想要更快,你可能不得不考虑使用Red-Black Tree某种...
标签: algorithm data-structures heap hashtable