2011-11-02 281 views
4

背景:
我的CSS360組正嘗試創建一個包含自動完成搜索功能的Android應用程序。我們要搜索的數據包含大約7000個條目,並且將存儲在手機本身的SQLite數據庫中。最明顯的方法是在用戶輸入每個字符後對數據庫進行線性搜索,然後返回可能是用戶查詢字母擴展名的建議列表。但是,這看起來效率很低,我們一直在尋找更好的替代方案。在今天的另一個課程中,我的導師簡要地討論了trie數據結構,並提到它經常用於存儲整個字典。可以在對數時間內(與常規舊數組的線性時間相反)檢索條目,因此這對我們來說似乎是一個很好的工具!不幸的是,我們已經對這個項目感到厭倦了,而且我們沒有人真正知道如何做到這一點。我們所有人都編碼到目前爲止是基本的控制檯應用程序,教我們編程基礎知識。我們都試圖通過觀看YouTube視頻來學習Android平臺,並將數據庫內容與我們團隊中具有任何SQL體驗的人員區分開來。我們可以認真使用一些指針!預先填充的Trie

問題:

  • 當創建一個線索,是有可能對整個結構預先填充? IE:爲每個使用的節點生成一行代碼,以便在程序啓動時整個結構已經存在於內存中?我的想法是,這將節省我們每次程序啓動時必須從數據庫重新生成整個特里結構的開銷。如果是這樣,是否有一種簡單的方法將這幾千行代碼加入到我們的程序中? IE:某種腳本可以將數據庫文件轉換爲可以複製並粘貼到Eclipse的java命令的巨大文本文件?
  • 如果我們直接搜索數據庫而不是使用某種內部列表或數據結構,是否會有相當多的開銷?我們是否應該從數據庫中複製名稱並在程序中搜索它們以實現自動完成功能?
  • 如果這對我們來說在技術上證明過於困難,而且我們不得不求助於常規線性搜索,那麼性能是否會受到明顯影響?
  • 我們目前的計劃是每次用戶輸入一個字符時運行自動完成功能,然後等待該功能返回,然後再繼續輸入。迄今爲止我們中唯一編寫的程序是同步運行的。我們需要知道什麼才能使這個函數異步?考慮到我們的新手能力以及我們已經必須滿足的要求,這對我們來說技術上太具有挑戰性了嗎?

回答

0

sqlite應該能夠很好地提供這種自動完成功能。我建議使用他們的內部索引重新執行輪子。如果你需要做後者,那麼在完成這些工作之後,sqlite可能不會幫助你。

如果你想要子串搜索,那麼full text search可能是你最好的選擇。

如果你只想完成單詞的開頭,那麼只使用他們的香草indexes應該是綽綽有餘。如果性能出現問題,那就等到他們在查詢之前輸入三個字符。設置您的結果的限制,以獲得快速響應。