java - 基于线性时间搜索字符串对字符串进行排序

标签 java c++ sql algorithm search

我有一个存储数百或数千个字符串的 SQLite 数据库,我保留了一个我增长的这些字符串的数组,以便我可以更轻松地更快地搜索我的数据库。但是,用户可以使用搜索字符串进行搜索,我将根据与搜索字符串的接近程度对数据库中的字符串进行排名。例如,假设他们搜索“foo”。如果我的数据库中有条目“foo”“foobar”和“foo foo”,是否有人对按顺序排列这些字符串的算法有任何想法:

1. “foo”(完全匹配)

2。 “foo foo”(它包含两次搜索字符串)

3。 “foobar”(它包含一次搜索字符串)

有没有人知道或有任何关于会产生此结果的算法的想法?如果有人希望发布任何代码片段,我同时使用 Java 和 C++,但我实际上只是在寻找算法的想法。

请注意,我希望像 fobar 或 fuo 这样的东西也出现在搜索结果中,因为它距离搜索有 1 个字母,

最佳答案

当您说您希望排名在线性时间内时,我猜您只想分析集合中的每个字符串一次。

一种相对简单的方法是根据您定义的一些规则计算分数。当然,您拥有的规则越多,所需的时间就越长,但只要您实现良好的分析,即使是数千个字符串也不会花费很长时间。

例如,您说完全匹配获得 100 分,而包含搜索字符串 n 次获得 10n 分,将它包含在另一个词中 n 次获得 5n 分,依此类推。如果您以相当分离的方式实现您的规则,您可以调整您的规则几次,看看它们在实际搜索中的表现如何,直到您对搜索的准确性感到满意为止。

一旦你有了一组分数,你就可以使用一些非常快速的排序算法来为你排序你的结果,从最好的分数到最差的。当然,您会排除分数小于 x 的结果。

(顺便说一句,这种技术可以很容易地实现高级搜索功能,例如 AND/OR/NOT,因为您可以拆分搜索词的分析,并结合每个结果的得分)

关于java - 基于线性时间搜索字符串对字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7843050/

相关文章:

java - Java Concurrency In Practice 中的 CountDownLatch 示例

java - 从文本文件中查找平均值

java - Spring MVC Rest中处理JSon时如何处理POJO嵌套对象

c++ - 嵌套循环创建美国国旗

MySQL - 如何列出具有引用我的表主键的外键的所有表?

java - 在 Notes 客户端中运行时 Domino 代理程序问题 - 在服务器上运行良好

c++ - 现代双重引用

c++ - 我的二进制转换器有问题

mysql - 使用带有 where an in 运算符的联接时出现 sql 查询错误

sql - 对替换 id 的行进行排序