183.17.228.* 2020-07-02 13:28:18 |
數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。常用的數據結構有:數組,棧,鏈表,隊列,樹,圖,堆,散列表等。而今天我們就再來了解一下,數據結構的常見類型與優缺點分析。
數據結構的常見類型與優缺點分析
1.列表(List)
元素有放入順序,元素可重復。
數組實現(Vector類)
同樣基于數組實現,會在內存中開辟一塊連續的空間來存儲。ArrayList是非線程安全的,效率高;Vector是基于線程安全的,但效率低,并且是方法級別的同步,不是**的線程安全。
初始容量10,每次數組擴展到原來容量的2倍(每次擴充的容量大小是可以設置的,而ArrayList類不支持設定)。
鏈表實現(LinkedList類)
每一個元素存儲本身數據的同時還存儲上、下兩個元素的地址(雙向鏈表)。
優點:
新項的插入和現有項的刪除平均開銷很小O(1)(假設變動項的位置已知),因此提供了addFirst和removeFirst,addLast和removeLast,getFirst和getLast等**添加、刪除和訪問兩端的項的方法;
可以在非連續的內存空間里面存儲一個集合的元素;
缺點:
根據索引的訪問時間復雜度為O(n);
存放相同多的數據,一般情況下,數組占用較小的內存,而鏈表還需要存放其前驅和后繼的空間。
2.棧(Stack)
棧,在計算機中運用廣泛,比如說JVM,它就是基于棧來執行指令的。棧是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫作棧頂,對棧的基本操作有push(進棧)和pop(出棧),前者相當于插入,后者相當于刪除后一個元素。棧有時又叫作LIFO(LastInFirstOut)表,即后進先出。
棧一般有兩種實現,所有操作時間復雜度O(1):
棧的鏈表實現:利用LinkedList類,通過表頂端的元素插入和刪除。
棧的數組實現:模仿ArrayList類,和棧相關的有兩個元素,arrayList數組和topOfStack索引,初始狀態topOfStack==-1,每次進棧一個元素x,topOfStack增1并令arrayList[topOfStack]=x;每次出棧一個元素,我們置返回值arrayList[topOfStack],并令topOfStack減1。
3.隊列(Queue)
對于隊列來說,元素只能從隊列尾插入,從隊列頭訪問和刪除。普通的隊列是一種先進先出(FirstInFirstOut,FIFO)的數據結構,而優先隊列中,元素被賦予優先級。當訪問元素的時候,具有高優先級的元素先被刪除。
隊列也是表,一般有兩種實現,所有操作時間復雜度O(1)(優先隊列是通過大頂堆或者小頂堆實現):
隊列的鏈表實現:利用LinkedList類,通過表尾端插入元素,前端刪除元素,并記錄隊列中元素個數currentSize。
隊列的數組實現:保留一個數組theArray以及位置front和back,代表隊列的兩端;同時還要記錄隊列中元素個數currentSize。要使一個元素x入隊,則currentSize和back增1,theArray[back]=x;要使一個元素出隊,我們置返回值theArray[front],且currentSize減1,、front增1。采用循環數組的方式,當front和back到達數組的尾端,他們又繞回開頭。
4.集合(Set)
元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是由該元素的HashCode決定的,其位置其實是固定的)
Set接口有兩個實現類:HashSet和LinkedHashSet
HashSet:(底層由HashMap實現),HashSet類按照哈希算法來存取集合中的對象,存取速度比較快,存入HashSet的對象必須定義hashCode()和equals()來確保對象的性。
LinkedHashSet:具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。于是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
SortedSet接口有一個實現類:TreeSet底層是通過TreeMap來實現的(如同HashSet底層是是通過HashMap來實現的一樣),因此二者的實現方式幾乎完全一樣。
數據結構類型的優缺點分析.針對各行業運營發展中面臨的業務挑戰,中琛魔方(www.zcmorefun.com)提供了豐富的行業應用數據分析方案,幫助企業提升企業資產效益,從而創造更多的商業價值。 |