最近在看資料結構,從書中所知。
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...