- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想创建一个模糊搜索算法。然而,经过几个小时的研究,我真的很挣扎。
我想创建一个对学校名称列表执行模糊搜索的算法。
这是我目前看到的内容:
我的大部分研究都指向 Google 和 Stackoverflow 上的“字符串指标”,例如:
然而,这只是给出了 2 个字符串的相似程度的分数。我能想到的将其实现为搜索算法的唯一方法是执行线性搜索并为每个字符串执行字符串度量算法,并返回得分高于特定阈值的字符串。 (最初我将我的字符串存储在一个特里树中,但这显然对我没有帮助!)
虽然这对于小型列表来说并不是一个坏主意,但对于具有 100,000 个名称且用户执行了很多查询的列表来说,这将是一个问题。
我研究的另一种算法是拼写检查方法,您只需搜索所有可能的拼写错误。然而,这也是非常低效的,因为它需要超过 75,000 个单词才能得到一个长度为 7 且错误计数仅为 2 的单词。
我需要什么?
谁能给我推荐一个高效的模糊搜索算法。与:
我明白所有的算法都有其优点和缺点,没有最好的算法。
最佳答案
考虑到您正在尝试对学校名称列表进行模糊搜索,我认为您不希望使用 Levenshtein 距离等传统字符串相似性。我的假设是您正在接受用户的输入(键盘输入或通过电话语音输入),并且您希望快速找到匹配的学校。
距离度量告诉您两个字符串基于替换、删除和插入的相似程度。但是这些算法并没有真正告诉您字符串与人类语言中的单词有多相似。
例如,考虑单词“smith”、“smythe”和“smote”。我可以分两步从“smythe”到“smith”:
smythe -> smithe -> smith
从“smote”到“smith”分两步:
smote -> smite -> smith
所以这两者与strings 具有相同的距离,但作为words,它们有显着的不同。如果有人告诉你(口头语言)他正在寻找“Symthe College”,你几乎肯定会说,“哦,我想你是说史密斯。”但是,如果有人说“Smote College”,您就不会知道他在说什么。
您需要的是 phonetic algorithm喜欢Soundex或 Metaphone .基本上,这些算法将单词分解为音素,并创建该单词在口语中的发音方式的表示。然后,您可以将结果与已知的单词列表进行比较以找到匹配项。
这样的系统会比使用距离度量多快。考虑使用距离度量,您需要将用户的输入与列表中的每个单词进行比较以获得距离。这在计算上是昂贵的,而且结果,正如我用“smith”和“smote”所展示的那样,可能会很糟糕。
使用语音算法,您可以创建每个已知单词的音素表示并将其放入字典( HashMap 或可能是 trie)中。这是一次性的启动成本。然后,每当用户输入搜索词时,您就创建他输入的音素表示并在字典中查找。这要快得多,而且会产生更好的结果。
还请考虑一下,当人们拼错专有名称时,他们几乎总是能正确拼出第一个字母,而且通常拼错的发音听起来就像他们试图拼写的实际单词一样。如果是这样的话,那么语音算法绝对是可行的方法。
关于string - 模糊搜索算法(近似字符串匹配算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337135/
所以我必须用以下方法来近似 Pi:4*(1-1/3+1/5-1/7+1/9-...)。它也应该基于迭代次数。所以函数应该是这样的: >>> piApprox(1) 4.0 >>> piApprox(1
输入:图 G 输出:多个独立集,使得一个节点对所有独立集的成员资格是唯一的。因此,节点与它自己的集合中的任何节点都没有连接。这是一个示例路径。 由于这里需要澄清,因此再次改写: 将给定的图划分为多个集
我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的准确度不太满意。输入格式为 s0.31,输出格式为 s15.16。 我在这里发布这个问题,以便
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
我的目标是近似二项式变量总和的分布。我使用以下纸张The Distribution of a Sum of Binomial Random Variables作者:肯·巴特勒和迈克尔·斯蒂芬斯。 我想
我知道有方法 approximate cubic Bezier curves ( this page 也是一个很好的引用),但是有没有更快的方法来逼近 N 次贝塞尔曲线?还是只能使用下面的概括? 来自
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它有助于我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注意
我是 C++ 和编码本身的初学者,所以请原谅任何词汇错误。我找不到这个具体问题,但在互联网上找到了类似的问题,但我仍然很难获得我需要的结果。 所以我使用莱布尼茨公式来近似 pi,即: pi = 4 ·
有多种方法可以通过显示名称查找联系人。例如这个答案Android - Find a contact by display name 但是我需要找到模糊匹配的联系人。例如如果找不到“Kim”,我需要返回
我一直在尝试使用以下代码使用级数表示来近似 e 以获得尽可能多的精度数字,但无论我计算多少项,精度数字的数量似乎都保持不变。即: 2.718281984329223632812500000000000
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
我做了很多随机的数学程序来帮助我完成作业(合成除法是最有趣的),现在我想反转一个激进的表达式。 例如,在我方便的 TI 计算器中我得到 .2360679775 好吧,我想将该数字转换为等效的无理数表达
我可以通过 CPU 分析器看到,compute_variances() 是我项目的瓶颈。 % cumulative self self total
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的可扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它
这是迄今为止我的代码, from math import * def main(): sides = eval(input("Enter the number of sides:"))
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它,
我是一名优秀的程序员,十分优秀!