在匹配数据库中的人时避免使用O(n ^ 2) - 并行人匹配

时间:2011-08-19 15:54:28

标签: database

我有数以百万计的“人”记录 - 比如客户端的客户和客户2的客户。我们希望将客户端1和客户端2中的人员匹配在一起 - 例如,发现“Joel Spolsky先生”在客户端数据库中,并将他与客户端中的“J Spolsky”匹配,在“master database”中创建了一个全新的记录

匹配两个候选人的确切算法并不重要,重要的是最明显的解决方案是在客户端1中记录每条记录并与客户2中的每条记录进行比较。
这很快就会成为一项艰巨的任务,特别是对于客户三四五等。

有没有人有任何有趣的方法来改善表现?

4 个答案:

答案 0 :(得分:1)

如果有超过2个客户端,唯一可以避免O(n ^ 2)(或O(n ^ m))的方法是在搜索之前对数据库进行排序。

但是为了能够对它们进行排序,你必须提出一些标准化的字段,它总是与客户端完全匹配。 (例如,名称字段中的最后一个单词+邮政编码,所有这些都被强制为小写)

如果您能够对数据库进行排序,则可以将算法降低到O(n log n)

答案 1 :(得分:0)

匹配算法很重要。如果您对匹配算法一无所知,则必须将每个算法与另一个客户端数据库中的每个其他算法进行比较,最后得到O(N ^ 2)。

答案 2 :(得分:0)

最明显的方法是为所有数据库创建一个通用排序算法。将数据库排序为列表,比较每个排序列表中的“顶部”项目,然后保留丢弃“最早”项目,直到找到两个匹配的项目。记录比赛,丢弃比赛,然后继续。

如果您有两组书籍ISBN号可供比较以查找两个库之间的重复项,那么这种方法非常有效,但对于名称可能不相同的人名而言并不是很好(J Smith vs John Smith,例如) 。你可以通过使用一种KWIC方案来改善一些事情,你可以在每个数据库条目的排序列表中输入几个条目 - 例如,一个条目用于名称,一个条目用于地址,一个条目用于社会安全号码 - 无论你有什么标准可能决定匹配。 Soundex类型的名称翻译也可能是有益的。

答案 3 :(得分:0)

它在很大程度上取决于数据库。通常“相交”是最快的。

现在,您的数据库中的两个名称之间存在细微差别:“Joel Spolsky先生”和“J Spolsky”

这意味着预处理表格。确保名称匹配,并可能编写自己的“语音”索引。这似乎超出了主题,但如果你有列“name”和“firstname”匹配,但不是列“prefix”,你会怎么做? (先生和亚历克斯琼斯先生)。

在你知道它之前,你最终会得到一个规则引擎,一个决策引擎,以及一个所有“手动”案例(不是自动合并,或者确定不一样)的界面,以及3个学生合并(或标记为“notsame”)数百万个全职地址。

所以在你到达那里之前,定义你想要合并的完全,然后可以轻松选择算法