用集算器比较字符串相似性

用集算器比较字符串相似性

【问题】

1、有 1001 个数字串(每个数字串长度不等,都是 0~9 之内),每一个数字串都和另外 1000 个中找出相同数最多和不同数最多的数字串(等于 1001 个数字数字串都要找一次)
2、就是如果第 1 行和第 1001 行都含有 1,算是相同数有 1 个;如果只有第 1 行数字串含有 1,而第 1001 行数字串没有,算是不同数有 1 个;
3、在数据库中用最少的步骤实现;
4、由于 1001 个数字串会每 3 分钟更新一次,因此要最快或者最少的步骤完成;
5、如果 1001 个成倍增长,变成 2001 个、7001 个,可以同样算法么?

【回答】

提问者需要逐条比较所有 1000 条字符串,甚至更多。用 Mongodb 没有提供这么复杂的运算,只能把数据读出来再处理,但用 Java 硬写比较麻烦,可以试试用集算器来处理,代码要简单些:

A B C D
1 =connect(“test”) =A1.query@x(“select str from x”)
2 =create(str,md,ms)
3 =B1.(~.str.split()) >debug(now())
4 for A3 >diff=same=0
5 for A3 if B5 != A4 =A4\B5
6 >diff=[D5.len(),diff].max()
7 >same=[A4.len()-diff,same].max()
8 =A2.record([A4.concat(),diff,same])
9 >debug(now())

A1、B1:查询原始数据到 B1 序表

A2:生成结果序表

A3:将原始数据中的字符串分割成字符数组,A3 是改数组的序列

A4:循环 1,取 A3 中的成员 1 准备与其他成员比较

B4:循环 1 的变量,初始为 0,记录比较的结果不同数与相同数

B5:循环 2,遇到成员 1 时候跳过,取成员 2 与成员 1 比较数字字符

D5、D6:找到两个成员中不同的字符数量,循环并总是存下最大值

D7:计算 A4 与 diff 的差为 same 的值,循环并总是存下最大值,循环 2 结束

B8:记录到 A2 序表,循环 1 结束

而由于要逐条比较,逻辑不变的情况下,性能方面肯定会随着成员数量增加而增加。这里在 B3、A9 增加了时间打印,1000 条多次测试在 80 秒 -110 秒完成。而当数据达到 2000 条时运行时间会大于 6 分钟。