Autocomplete
Autocomplete 應該是許多大公司滿常見的前端面試考題,不僅考前端設計同時也會考到資料結構,Autocomplete 常見的應用是 Google 搜尋的輸入欄,搜尋引擎會給你取多建議的結果,這就是 Autocomplete 的功用。

確認需求
應付面試我們一定要先與面試官確認需求:
1. 資料形式
我們是要撈哪種資料?文字、圖片、文檔等等,先確定這個才能設計資料結構
我們這邊先假設文字
2. 結果呈現方式
結果的呈現方式可以有很多方式,文字、圖片等
我們這邊先假設文字
3. 呈現在哪種設備上
是 laptop, tablet, mobile 等,進而確定 RWD 的程度
我們這邊先假設 laptop
4. 需要 fuzzy search 嗎
我們這邊先假設不用
5. 需要 Cache 嗎
Cache 可以將上次搜尋的結果暫存起來
我們這邊先假設需要
架構設計
根據需求確認的結果,我們可以開始規劃架構:

步驟如下:
- 使用者輸入文字
Input UI
將Query
傳遞至Controller
Controller
拿著Query
去問Cache
- 若
Cache
裡有搜尋結果的緩存,將Results
回傳給Controller
Controller
將Results
回傳至Results UI
- 若
Cache
裡沒有搜尋結果的緩存,Controller
拿著Query
去問Server
,Server
將搜尋結果回傳給Controller
Controller
將Results
回傳至Results UI
資料結構設計
前提
我們確定兩個前提:
- 資料格式為文字
- 沒有 fuzzy search
預期結果
我們預期的結果應該會像:
{
"query": "高雄",
"results": [
"高雄天氣",
"高雄捷運",
"高雄景點",
...
]
}
每個字跟下一個字是有連結關係的,並且這連結關係是有多可能性的,e.x. 高
後面可能接 雄
、鐵
等...,因此腦海裡自然浮現一種資料結構,Trie。
Trie
trie的發明者Edward Fredkin把它讀作/ˈtriː/ "tree"。但是,其他作者把它讀作/ˈtraɪ/ "try"。
在電腦科學中,trie,又稱字首樹或字典樹,是一種有序樹,用於儲存關聯陣列,其中的鍵通常是字串。與二元搜尋樹不同,鍵不是直接儲存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的字首,也就是這個節點對應的字串,而根節點對應空字串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。
