當我們鍵入命令或名稱的一半,然後按Tab鍵,它立即找到剩餘部分。什麼數據結構/算法用於實現這種效率?什麼數據結構或算法用於自動完成?
回答
您可以將您的一組字符串存儲在Directed Acyclic Graph中。
圖的每個節點對應於可能的前綴,並且鏈接到所述前綴的可能的單字母擴展名。圖的根部帶有空白前綴。葉子是可能的完整條目。
在Python中有一個叫做DAWG的模塊來處理這些。
這更常被稱爲[trie](http://en.wikipedia.org/wiki/Trie)。儘管我認爲將它描述爲一棵**樹,而不是一個DAG,它更簡單。 – Dukeling
@Dukeling號DAWG(或更確切地說,[確定性非循環有限狀態自動機](https://en.wikipedia.org/wiki/Deterministic_acyclic_finite_state_automaton))*不是樹,它共享後綴,所以它實際上是一個正確的DAG,如果這是最小的這種自動機準確接受字典字符串,它顯然節省了同一字典上的壓縮字體樹的空間,如果至少有兩個字共用一個後綴 –
A trie是一個很好的數據結構來解決這個問題。
這是一棵樹,其中每個邊代表下一個可能的字符,該字符將附加到由當前根路徑定義的字符串。
所以,如果你要輸入in
,你會沿着root -i-> i -n-> in
旅遊,探索子樹找到inn
。
您可以在每個節點上包含一個標誌,以指示它是否包含有效的單詞(對於非葉子,因爲葉子只有在包含有效單詞時纔會創建)。
可以使用的更常見(但不太專業化)的數據結構是binary search tree (BST)。
二叉查找樹(BST)...是基於節點的二進制樹的數據結構,其中每個節點具有可比密鑰(和相關聯的值),且滿足限制,在任何節點的關鍵字大而不是該節點左子樹中所有節點中的密鑰,並且小於該節點右子樹中所有節點中的密鑰。
根據BST實施,就應該把能夠:
調用一個
range
函數來獲得兩個值之間的所有元素,特別是字符串之間的「增量'。例如,如果給出abc
,那麼'遞增'字符串將是abd
。如果給出abz
,'遞增'字符串將是aca
(假設我們在BST中只允許a-z
,否則您可以在z
字符集之後挑選字符,例如ASCII碼爲{
)。調用
ceiling
-類型函數以獲取大於或等於給定字符串的最小元素,然後重複獲取有序的後繼,直到gotten元素不再以給定字符串開始。
- 1. 什麼是最好的自動完成/建議算法,數據結構[C++/C]
- 2. 自動完成算法的數據結構
- 3. 什麼是文本自動完成的最佳數據結構?
- 4. 自動完成結構化數據
- 5. Ctypes結構自動完成
- 6. 自動完成算法?
- 7. 自動完成算法
- 8. 算法或此數據結構
- 9. 關於使用什麼方法/數據結構/算法的建議
- 10. 基於模式自動完成或預測的自動完成
- 11. 加速自動完成:使用什麼數據結構將數據存儲在高速緩存中
- 12. 在這個算法中使用什麼數據結構?
- 13. 類型的結構自動完成
- 14. 搜索結構自動完成
- 15. 算法和數據結構的動畫?
- 16. 如何通過語法結構生成自動完成?
- 17. 算法和數據結構
- 18. 數據結構算法
- 19. 什麼語法用於描述ZooKeeper中的Kafka數據結構?
- 20. jQuery自動完成數據
- 21. 基於數據包結構自動生成代碼
- 22. Dijkstra算法實現的最佳數據結構是什麼? C#
- 23. 什麼數據結構應該用於分層數據?
- 24. 用於表格的自動完成計數結果的php或javascript代碼
- 25. 什麼類型的API或算法用於生成會話ID?
- 26. 正確完成用戶活動的數據庫結構?
- 27. 什麼使東西成爲動態數據結構?
- 28. Vim中的自動完成方法結構
- 29. 用於搜索自動完成的Gem(用於數據庫中的數據)
- 30. 自動完成JSON數據使用jQuery
此問題與此http://stackoverflow.com/questions/5570795/how-does-bash-tab-completion-work有關。我建議你看一下readline庫的源代碼以獲得肯定的答案。你可以在這裏找到這個庫http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html – lego
@lego我不同意。這個問題專門針對解決問題的算法,鏈接問題和文檔都沒有談到這個問題 –