linkList和arrayList增刪效能比較

2021-10-16 23:01:13 字數 2602 閱讀 1426

最近在看資料結構,從書中所知。

1.順序表在邏輯上是連續的,在物理記憶體上也是連續的。

2.鍊錶在邏輯上是連續的,在物理記憶體上不一定是連續的。

想起來自己專案中的**幾乎都是用的順序表list來進行增刪改查的,那麼豈不是會慢好多(還有很大的優化空間)。經同事提醒決定還是先做一下資料測試再決定優不優化。下面開始測試過程。

那麼可知對於

(1)順序表而言:

get(index) 根據下標查詢,順序儲存知道首個元素的位址,其他的位置很快就能確定,時間複雜度為o(1)

不知道下標時在查詢資料時的平均時間複雜度是o(n)。

順序儲存刪除指定元素,後面元素要向前移動,時間複雜度o(n)

根據下標獲取/修改元素:時間複雜度o(1)

增:陣列是位址連續儲存的,所以對陣列進行增操作,只要在陣列尾部增加即可,一步到位,所以增操作的時間複雜度是 o(1).

(2)鍊錶而言:

鏈式儲存,從首個元素開始查詢,直到查詢到第 i個位置,時間複雜度為o(n)

add(e) 直接尾部新增,時間複雜度o(1)。

鏈式儲存,直接 指標操作(找到前驅節點,再刪除),時間複雜度o(1)

下面開始試驗:

public

static

void

main

(string[

] args)

datetime after = dateutil.

date()

; system.out.

println

("list新增資料時間="

+(dateutil.

betweenms

(after,begian)))

; system.out.

println

("after="

+ after)

; list.

remove(10

);datetime remove = dateutil.

date()

; system.out.

println

("list刪除資料時間="

+(dateutil.

betweenms

(remove,after)))

; list.

get(11)

; datetime get = dateutil.

date()

; system.out.

println

("list查詢資料時間="

+(dateutil.

betweenms

(get,remove)))

; linkedlist linklist=

newlinkedlist()

; datetime begian1 = dateutil.

date()

;for

(int i =

0; i <

1000000

; i++

) datetime afterone = dateutil.

date()

; system.out.

println

("linklist新增資料時間="

+dateutil.

betweenms

(afterone,begian1));

linklist.

remove

(100);

datetime removeone = dateutil.

date()

; system.out.

println

("linklist刪除資料時間="

+dateutil.

betweenms

(removeone,afterone));

datetime getone = dateutil.

date()

; linklist.

get(

105)

; system.out.

println

("linklist查詢資料時間="

+dateutil.

betweenms

(getone,removeone));

}

執行結果:

list新增資料時間=

65after=

2021-01

-2111:

15:03list刪除資料時間=

51list查詢資料時間=

1linklist新增資料時間=

175linklist刪除資料時間=

0linklist查詢資料時間=

0

從上述結果可知在一百萬的資料量的情況下,簡單的資料型別其實相差不大,只有幾倍的差別,還沒到數量級的差距。(一千萬的資料量也是一樣的)但是順序表在新增資料時會比煉表快1~3倍,刪除元素時順序表會比煉表慢幾倍到幾十倍。查詢元素時兩者差不多。

結論:在資料量不大的情況下沒必要優化。

ArrayList 和 LinkList 的區別

linkedlist查詢用的遍歷,ayyaylist查詢用的是陣列下標,所以對於查詢arraylist效能高於linkedlist 新增在末尾或者中間就是arraylist比linkedlist快,如果在最前面就是linkedlist比arraylist快 public static void ma...

ArrayList 和 LinkList 的區別

優點 get 和 set 呼叫花費常數時間,也就是查詢的速度快 缺點 新項的插入和現有項的刪除代價昂貴,也就是新增刪除的速度慢優點 新項的插入和和現有項的刪除開銷很小,即新增和刪除的速度快 缺點 對 get 和 set 的呼叫花費昂貴,不適合做查詢 1.是否保證執行緒安全 arraylist 和 l...

LinkList鍊錶操作

以下的c 類linklist實現了線性鍊錶的一般操作。可以直接在其他的程式中直接建立它的物件,其中線性表中的資料在此為整型,具體應用的時候可以適當的修改,並可以在此基礎上繼續封裝特定的功能。標頭檔案 linklist.h typedef struct lnode lnode,plinklist cl...