簡體   English   中英

Java中的哪個數據結構可以在恆定時間添加鍵/值對並保持按值排序?

[英]which data structure in java can add key/value pair at constant time and maintain sorted by value?

基本上我正在尋找java中最好的數據結構,我可以存儲對並通過值檢索前N個元素。 我想在O(n)時間執行此操作,其中n是數據結構中的整數個數。

輸入示例是

<"john", 32>
<"dave", 3>
<"brian", 15>
<"jenna", 23>
<"rachael", 41>

如果N = 3,如果我想要降序,我應該能夠返回rachael,john,jenna。

如果我使用某種hashMap,則插入速度很快,但是按順序檢索它們會變得很昂貴。 如果我使用某種可以使事物保持有序的數據結構,那么插入會變得很昂貴,而檢索會更便宜。 我無法找到可以很好且非常快地完成的最佳數據結構。

任何輸入表示贊賞。 謝謝。

[更新]

讓我以其他方式提出這個問題,是否更清楚。 我知道我可以在固定時間O(1)插入hashMap。 現在,我該如何在O(n)時間中按值按排序順序檢索元素,其中n =數據結構中的整體數? 希望有道理。

如果要排序,則必須放棄恆定的O(1)時間。

那是因為與插入未排序的鍵/值對不同,排序將最低限度地要求您將新條目與某事物進行比較,而幾率則與許多事物相對。 一旦有了一個算法,它將需要更多的時間和更多的條目(由於進行了更多的比較),因此您已經超出了“恆定”時間。

如果您能做得更好,那么一定要這樣做! 如果沒有菲爾茲獎章,就有迪克斯特拉獎正在等待着您。

別灰心,您仍然可以將關鍵部分作為HashMap進行,將排序部分與類似Tree的實現一起使用,這將為您提供O(log n)。 TreeMap可能就是您想要的。

---更新以匹配您的更新---

不可以,您不能在O(n)時間內遍歷哈希映射。 這樣做將假定您有一個列表; 但是,該列表必須已經排序。 使用原始的HashMap,您將不得不在整個地圖中搜索下一個“較低”的值。 搜索部分地圖不會這樣做,因為您未檢查的一個元素可能是正確的值。

現在,有些數據結構會帶來很多折衷,這可能會使您更加接近。 如果您要自己滾動,也許自定義的Fibonacci堆可以使您的攤提性能接近您希望的水平,但不能保證最壞情況下的性能。 無論如何,某些操作(如extract-min)仍然需要O(log n)性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM