这是一个接近3年前问我的面试问题,我一直在思考这个问题。支持类队列操作和模式查找的数据结构
设计一个支持以下操作的数据结构: insert_back(),remove_front()和find_mode()。最佳复杂度 需要。
我能想到的最佳解决方案是插入和删除的O(logn)和模式的O(1)。这就是我解决它的方法:保留一个队列DS来处理插入和删除哪个元素。 还保留一个数组,这是最大的堆排序和哈希表。 哈希表包含一个整数键和一个索引到该元素的堆数组位置。堆数组包含有序对(count,element),并在count属性上进行排序。
插入:插入元素到队列中。从散列表中查找堆阵列索引的位置。如果不存在,则将该元素添加到堆并向上堆积。然后将最终位置添加到散列表中。增加该位置的计数并根据需要向上或向下堆积以恢复堆属性。
删除:从队列头部删除元素。在哈希表中,在堆数组索引中找到一个位置。减少堆中的计数并根据需要向上或向下重新上移以恢复堆属性。
查找模式:数组堆的头部的元素(getMax())会给我们模式。
有人可以提出更好的建议。我能想到的唯一优化是使用Fibonacci堆,但我不确定这是否适合这个问题。
你所描述的是一个'Deque',它非常标准。 – MoonKnight
但是,deque(我认为这是一个双端队列)如何跟踪数组中发生最大次数的元素?任何链接将有所帮助。感谢您的及时答复 –
啊,我很抱歉。我忽略了需求的'Find_Mode'方面。我应该说你描述的结构是['Deque'](http://en.wikipedia.org/wiki/Double-ended_queue#Complexity)。您可以看到,基本实现中的所有操作都是O(1) - 但是,find不是其中之一......很遗憾,您可以在这里浪费时间。 – MoonKnight