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

本文介绍如何利用集算器解决在数据库中高效比较大量字符串相似性的问题。针对1001个数字串,需要找出与其他串相同数最多和不同数最多的串,集算器提供的解决方案相比Mongodb和Java硬编码更简洁。虽然性能会随数据量增加而增加,但在1000条数据测试中,集算器能在80秒到110秒内完成任务。

【问题】

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 分钟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值