contributed by <Quexint
>
給定 N 筆字串,然後給定 Q 筆搜索,求搜索時間最短。
對於每種版本,記錄執行 100 次實驗的時間。
每次實驗 N 為 349990,Q 為 3499。
Trie
的建構時間是 Linked-List
的 5 倍左右。Trie
的搜索時間是 Linked-List
的 12000 倍左右。(27.397376:0.002337, )v1.0
Structure Compression根據影片中的提示,先對 structure 做瘦身。
發現沒比較好,而且 append
因為 malloc
兩次變慢了。
結論:因為沒有做到多次的資料搬移,所以用指標取代的效益沒有出現。
v1.1
append
加速對 append
做瘦身:一次 malloc
好所需的大小再切割為兩塊。
結論:append
的速度跟之前差不多了。
v2a
Memory Comparison想法:將 char 的 16 次比較降為 int 的 4次比較。
避免 '\0'
之後的雜訊,再 mallc
前,先清空記憶體。
考慮到 branch prediction,放棄使用if(a[0]==b[0] && a[1]==b[1]...)
,而改用memcmp
。
結論:沒差。
v2b
Trie先重構 main.c,phonebook_orig.{h,c}
將 initial, free 寫成函式.
將 Key (lastName) 建構一顆 Trie,而 Value 則是 Sturct content。
結論:建構超慢(0.29xxx),搜索超快(0.0000),重構測試加多單一測試時的搜索次
數。
append
的時間。結論:測的出 Trie 的效益,但單一測試的 orig 會跑很久。
單一測試下,Linked-List / Trie 的搜索時間複雜度為:
Linked-List: O(L) * O(N)
Trie: O(L)