這是一個接近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