用集算器比较字符串相似性
用集算器比较字符串相似性
【问题】
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 分钟。