![](/img/trans.png)
[英]Is there a more efficient way to make HashMap with a counter from an ArrayList?
[英]Way to make this HashMap more efficient
我有一個具有3個對象的class User
(?),我不確定該用語。
我正在嘗試創建一種方法
我已根據加入的年份(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對元素進行排序。
至於效率:
還有其他數據結構/方法可用於所有方法的O(1)嗎?
三個HashMap。 這不是數據庫,因此您必須手動維護“索引”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.