2011-10-20 84 views
3

我有一個存儲幾百或幾千個字符串的SQLite數據庫,我保留這些字符串的數組,使我可以更快速地搜索我的數據庫。但是,用戶可以使用搜索字符串進行搜索,並且我將對數據庫中的字符串進行排序,以確定它們與搜索字符串的距離。例如,讓我們說他們搜索「foo」。如果我在我的數據庫中有條目,「foo」,「foobar」和「foo foo」,沒有人有任何想法可以按順序對這些字符串進行排序:在線性時間基於搜索字符串排序字符串

1.「foo」(完全匹配)

2.「富富」(包含搜索字符串的兩倍)

3.「foobar的」(它包含搜索字符串一次)

有誰知道,或者有一個什麼想法算法會有這個結果嗎?如果有人希望發佈任何代碼片段,我正在使用java和C++,但是我真的只是在尋找算法的想法。

注意,我想是這樣fobar或不明原因發熱,以在搜索結果中還顯示,因爲它是1函關從搜索,

+0

的http://弱勢族羣。 com/spell-correct.html可能是有趣的,但它使用了完全不同的概念。 –

+0

同樣感興趣:使用許多算法從2天前http://stackoverflow.com/questions/7805897/simple-spell-checking-algorithm/7808099#comment9559839_7808099 –

回答

1

當你說你想要的排名是在直線的時候,我猜測你只想分析一次集合中的每個字符串。

一個相對簡單的方法可以根據您定義的一些規則計算得分。當然,規則越多,所需時間就越長,但只要實施分析,即使對於數千個字符串也不需要很長時間。

一個例子是,你說完全匹配得分爲100,而包含搜索字符串n次數達到10n,並且在另一個字詞中包含n次得到5n,依此類推。如果您以相當分散的方式實施您的規則,則可以調整規則幾次,並查看它們在實際搜索下的表現如何,直到您對搜索的準確性感到滿意爲止。

一旦你有一組分數,你可以使用一些非常快的排序算法來按照最好分數到最差排序結果。當然,你會排除小於x分數的結果。因爲你可以分析搜索條件的分析結果並結合他們的分數)

(就像一個側面說明,這種技術將使它很容易實現高級搜索功能,如AND/OR/NOT)