數據結構的對比


數組和鏈表的優缺點,: 數組的內存空間是連續的,鏈表的內存結構是不連續的內存空間
    數組:
        優點:數組支持隨機訪問,根據下標隨機訪問的時間複雜度爲O(1),
        缺點:
        1)插入、刪除的時間複雜度是O(n)
        2)若申請內存空間很大,比如100M,但若內存空間沒有100M的連續空間時,則會申請失敗,儘管內存可用空間超過100M。
        3)大小固定,若存儲空間不足,需進行擴容,一旦擴容就要進行數據複製,而這時非常費時的。
    鏈表:
        優點:鏈表適合插入、 刪除,時間複雜度O(1)    
        缺點:
            1)隨機訪問的時間複雜端是O(n)
            2)內存空間消耗更大,因爲需要額外的空間存儲指針信息。
            3)對鏈表進行頻繁的插入和刪除操作,會導致頻繁的內存申請和釋放,容易造成內存碎片,如果是Java語言,還可能會造成頻繁的GC(自動垃圾回收器)操作。

ArrayList的優勢:
    將很多數組操作的細節封裝起來。 比如前面提到的數組插入、 刪除數據時需要搬移其他數據等。
    支持動態擴容。
    arraylist裏可以同時存放不同類型的對象(自己加的)
ArrayList的劣勢:
    1.Java ArrayList無法存儲基本類型, 如int、 long, 需要封裝爲Integer、 Long類, ⽽Autoboxing、 Unboxing則有一定的性能消耗, 所以如果特別關注性能, 或者希望使用基本類型, 就可以選用數組。
    2.如果數據大小事先已知, 並且對數據的操作非常簡單, 用不到ArrayList提供的大部分方法, 也可以直接使用數組。
    3.當要表示多維數組時, 用數組往往會更加直觀。 如Object[][] array;而用容器的話則需要這樣定義: ArrayList<ArrayList > array。

隊列和棧的實現:都可以用數組和鏈表實現。
    棧:棧儘量使用ArrayDeque:Deque接口及其實現提供了LIFO堆棧操作的完整:Deque<Integer> stack=new ArrayDeque<Integer>();
    隊列:java中雖然有Queue接口,單java並沒有給出具體的隊列實現類,而Java中讓LinkedList類實現了Queue接口,所以使用隊列的時候,一般採用LinkedList。因爲LinkedList是雙向鏈表,可以很方便的實現隊列的所有功能。


散列表:
    優點:插入刪除查找都是O(1), 是最常用的,
    缺點:不能順序遍歷以及擴容縮容的性能損耗。(散列表中的數據是無序存儲的,如果要輸出有序的數據,需要先進行排序。)    

跳錶:
    優點:插入刪除查找都是O(logn), 並且能順序遍歷。
    缺點:空間複雜度O(n)。適用於不那麼在意內存空間的,其順序遍歷和區間查找非常方便。

紅黑樹(平衡二叉查找樹):
    優點:插入刪除查找都是O(logn), 中序遍歷即是順序遍歷,穩定。
    缺點:難以實現,去查找不方便。其實跳錶更佳,但紅黑樹已經用於很多地方了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章