很久以前,我觀看了Princeton Coursera MOOC的視頻講座:算法介紹,可以找到here。它解釋了在添加或刪除元素時調整類似結構的大小的成本。事實證明,如果我們想爲我們的數據結構提供調整大小,我們將從O(n)
到amortized O(n)
爲add
和remove
操作。爲什麼Java ArrayLists不會自動縮小
我幾年來一直在使用Java ArrayList
。我一直確定它們會自動增長和縮小。直到最近,令我非常吃驚的是,我在this post中被證明是錯誤的。 Java ArrayList
不會自動縮小(儘管它們當然會增長)。
這裏是我的問題:
在我看來在提供小號
ArrayList
萎縮不作任何傷害的表現已經是amortized O(n)
。爲什麼Java創作者沒有在設計中包含此功能?我知道像
HashMap
這樣的其他數據結構也不會自動縮小。 Java中是否有任何其他數據結構構建在支持自動收縮的數組之上?其他語言的趨勢是什麼?在Python/C#中的列表,字典,地圖,集合等情況下,自動縮小是如何進行的?如果它們與Java所做的相反,那麼我的問題是:爲什麼?
讓容器縮小的缺點是,如果添加更多元素,您將不得不再次增長容器。只是因爲你從列表中刪除了元素,圖書館不能認爲你仍然不需要這個空間。我不知道像ArrayList這樣的數組封裝器會自動縮小,我很驚訝地發現有一個這樣做。如果您作爲'ArrayList'用戶知道您的列表容量現在可以減少,那麼可以使用['trimToSize()'](https://docs.oracle.com/javase/7/docs/api/java/util /ArrayList.html#trimToSize())。 – khelwood
我知道還有更多工作要做,但用'O'的術語來說,如果您提供自動縮小功能(如視頻中介紹的那樣),就會失去「無」。 'add'和'remove'的複雜性仍然是'攤銷O(n)' – GA1
btw,如果有人給出'-1',我很樂意閱讀一個建設性的反饋。 – GA1