我有7位數字的號碼列表。我需要在列表中執行搜索操作。程序的輸入將如此5xx9xx1。至少3位數字是已知的。已知數字的索引並不重要。你會建議哪種算法?我不想用'like'查詢在數據庫上搜索。算法建議 - 在號碼列表上搜索
回答
我能想到的通過一些通配符搜索參數來匹配集合上的元素的唯一方法是遍歷列表並找到匹配的元素。
如果結果太慢,您還可以將列表分開並執行並行搜索。
我假設您有初始數字列表已排序。如果它沒有排序,你最好將它排序,因爲使用排序列表,你可以用一個非常直的算法得到數字。但是,如果這不是時間關鍵操作,則最好使用散列表或B-Tree數據結構。 B-Tree可以爲您提供log(n)查詢時間。實施起來更容易。
隨着排序列表,你可以跳轉到正確的元素直接,如果輸入指定搜索的位置和價值,即如果輸入稱只尋找具有5
,在位置6
9
和1
號碼,分別爲3
和0
,您可以直接跳轉到索引5,000,000
,並且您不必查找5,999,999
以外的值。
關鍵洞察在於這樣一個事實:如果你在尋找在X
位置的數字(I
),你發現在那個位置上的第一個這樣的號碼N
,那麼接下來連續10^X-1
數字將有I
在同一位置。將有I
在X
的下一組號碼將在索引N + 10^(X+1)
。
例如,如果你正在尋找與5
數字在2
位置,如果你是在說10000500
,那麼您可以在的東西,將匹配條件讀取下一10^2-1(99)
號碼。下一組位於10000500 + 10^3 = 100001500
。
在你的問題,雖然你有多個這樣的條件,所以你開始在最高位置的數字,然後進一步下降到更小的位置,並跳轉到數字集。如果下一個跳轉到的數值大於上一個數字所允許的範圍,則跳轉到上一個數字指向的數值。
例如,如果你在2
位置和3
與5
尋找數在1
位置,你開始在10000530
。接下來的10^1
號碼將符合您的標準。單獨的3
的下一個集合將在10000530 + 10^2 = 10000630
,但是超過5
在位置2
設置的限制,即99
。所以你跳轉到5
指向的下一個集合,即10001530
。
這種方法在時間上是線性的,w.r.到輸出集,所以你可以有一個巨大的輸入,如果你的輸出是非常小的,這個方法會非常快速。如果您使用B-Tree或某些此類方法,則它們將取決於輸入大小。
- 1. 搜索/過濾算法建議
- 2. 搜索建議android
- 3. PHP搜索建議
- 4. ajax搜索建議轉義編碼
- 5. 搜索號碼
- 6. 在手機中搜索電話號碼的算法?
- 7. azure sql數據庫智能搜索算法建議需要
- 8. 任何分佈式並行樹搜索算法建議?
- 9. 簡單的搜索關鍵字建議工具或算法
- 10. 如何構建自定義搜索建議的建議表?
- 11. 需要關於改進我的代碼的建議:搜索算法
- 12. 在谷歌地圖搜索輸入建議列表
- 13. 如何在Google地圖搜索中顯示建議列表?
- 14. 搜索對話框搜索建議
- 15. 使用NHibernate搜索的搜索建議
- 16. 關鍵幀上的搜索建議
- 17. 無法選擇的搜索建議
- 18. 對搜索方法的要求建議
- 19. 無法獲取Google搜索建議API
- 20. Rails Elasticsearch預測搜索表單建議
- 21. 搜索算法
- 22. 搜索算法
- 23. 在逗號列表中搜索mysql
- 24. 搜索建議的背景
- 25. 導航搜索建議
- 26. PHP MySQL搜索建議
- 27. 谷歌搜索建議api
- 28. 安卓搜索與建議
- 29. RavenDb LuceneQuery建議搜索
- 30. 搜索建議失敗2.2
數字是唯一的嗎? – 2014-10-02 11:40:20
是的數字是唯一的,列表大小約爲100k到200萬 – qasanov 2014-10-02 11:41:44
樸素算法:迭代所有數字並返回匹配的數字。你有什麼限制,你已經嘗試過什麼?列表中的數字是否已排序?你在找任何比賽還是全部比賽? – 2014-10-02 11:41:52