簡體   English   中英

使此HashMap更有效的方法

[英]Way to make this HashMap more efficient

我有一個具有3個對象的class User (?),我不確定該用語。

  • (整數)ID碼
  • 創建用戶的日期(整數)
  • 和一個(字符串)名稱

我正在嘗試創建一種方法

  • 將用戶添加到我的數據結構(1)
  • 根據用戶的ID號返回用戶的名稱(2)
  • 返回按日期排序的所有用戶的完整列表(3)
  • 返回名稱中具有特定字符串的用戶列表,按日期排序(4)
  • 返回在特定日期之前加入的用戶列表(5)

我已根據加入的年份(2004-2014)制作了10個數組,然后再次按日期對數組中的元素進行排序(按月然后按日排序)

我是否認為這意味着方法(3)和(5)具有O(1)時間復雜度,但(1),(4)和(2)具有O(N)嗎?

還有其他數據結構/方法可用於所有方法的O(1)嗎? 我反復嘗試提出一種方法,但是方法(2)的包含使我感到困惑。

基於比較的排序始終為O(N * log N),添加到已排序的容器為O(log N)。 為了避免這種情況,您需要使用存儲桶,就像現在使用存儲桶一樣。 這用內存換取執行時間。

(1)僅在將事物添加到HashMap時才可以是O(1)。

如果您具有將ID映射到用戶的單獨的HashMap ,則(2)可以為O(1)。

(3)當然是O(N),因為您需要列出所有N個用戶,但是如果您有一個HashMap ,其中key是天,值是用戶列表,則只需要經過常數(10年* 365天) + 2)列出所有用戶的數組數。 因此(1)的O(N)仍為O(1)。 假設用戶一天之內未排序。

(4)基本實現與3相同,實現簡單,只需要較少的打印。 您也許可以使用trie之類的東西來加快最好的情況 ,但是它仍然是O(N),因為它將確定N的一定百分比會匹配。

(5)和(3)一樣,您可以早點爆發。

您必須做出妥協,並對最常見的操作做出明智的猜測。 最常見的操作很有可能是通過ID查找用戶。 因此,HashMap是理想的結構:它是O(1)以及插入到地圖中。

為了實現按日期排序的用戶列表以及給定日期之前的用戶列表,最好的數據結構是TreeSet。 TreeSet已經排序(因此您的第3個操作將是O(1),並且可以在O(log(n))時間內返回排序后的子集。

但是,與HashMap並行維護TreeSet既麻煩又容易出錯,並且會占用內存。 並且插入復雜度將變為O(log(N))。 如果這些不是常見的操作,則可以簡單地遍歷條目並對其進行過濾/排序。 絕對不用擔心10個數組。 這是無法維持的,並且TreeSet是一個更好,更輕松的解決方案,不限於10年。

無論您選擇哪種數據結構,按名稱包含給定字符串的用戶列表都是O(N)。

HashMap不會對任何內容進行排序; 它的主要目的/優點是提供近O(1)查找(您可以按ID用於查找)。 如果需要排序,則應該讓類實現Comparable ,將其添加到List中,然后使用Collections.sort對元素進行排序。

至於效率:

  1. O(1)
  2. O(1)
  3. O(n log n)
  4. O(n)(至少)
  5. O(n)(或更小,但我認為必須是O(n))

還有其他數據結構/方法可用於所有方法的O(1)嗎?

三個HashMap。 這不是數據庫,因此您必須手動維護“索引”。

暫無
暫無

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

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