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