php搜索相似数据,求解类似数据如何搜索!

本文探讨了如何提高查找与给定字符串1和2在256位、64位和1024位二进制表示中相似度大于0.9的数据的效率。作者提出逐块比较和缓存策略,以及利用十六进制存储拆分后的数据,以减少比较复杂度。适合PHP和JavaScript开发者应对海量数据存储和搜索问题。
摘要由CSDN通过智能技术生成

数据格式如下

"10101010001001101100100011000100100100001011100001000010010101000101010101000101".....共计256位

就是除了1就是0的唯一标示符256位的跟64位的还有1024位的

这种标示符

目前我已经有256位的跟64位的了,目前数据我已经生成了800w条,陆续生成中

字符串1="10101101001010010111010101100001011101000101010010001000111001101010010101"...

字符串2="10101001001011010111010101000001011101000101110010001001111001101010010101"....

求这两个字符串的相似度 顺序比较 以下为相似度 计算

$len = strlen($hash1);

for ($i = 0; $i < $len; $i++){

if ($hash1[$i] !== $hash2[$i])

$count++;

}

return 1-($i/$len);

得到相似度

搜索要求为

从数据库中读取出跟 "字符串s" 相似度>0.9的,目前数据采用mysql储存,属于个人瞎胡闹搞得东西,不会采用商业数据库储存买不起,可以采用nosql储存,memcache储存,主要程序语言PHP,javascript算是预处理,我就会这两种!

求大神解这种数据如何搜索!!!!!!

回复内容:

数据格式如下

"10101010001001101100100011000100100100001011100001000010010101000101010101000101".....共计256位

就是除了1就是0的唯一标示符256位的跟64位的还有1024位的

这种标示符

目前我已经有256位的跟64位的了,目前数据我已经生成了800w条,陆续生成中

字符串1="10101101001010010111010101100001011101000101010010001000111001101010010101"...

字符串2="10101001001011010111010101000001011101000101110010001001111001101010010101"....

求这两个字符串的相似度 顺序比较 以下为相似度 计算

$len = strlen($hash1);

for ($i = 0; $i < $len; $i++){

if ($hash1[$i] !== $hash2[$i])

$count++;

}

return 1-($i/$len);

得到相似度

搜索要求为

从数据库中读取出跟 "字符串s" 相似度>0.9的,目前数据采用mysql储存,属于个人瞎胡闹搞得东西,不会采用商业数据库储存买不起,可以采用nosql储存,memcache储存,主要程序语言PHP,javascript算是预处理,我就会这两种!

求大神解这种数据如何搜索!!!!!!

我能想到算法上的两个优化点。

第一个,是你逐位判断的代码里面,只要$count大于$len的10%就不用循环下去了,相似度必然小于0.9。

第二个,既然数据是自己生成的,那可以在生成时一并储存拆分值的十六进制数。

举个例子,比如1024位的字符串,每16位为一个单位,共拆分为64个单位,每个单位的16位二进制数转换成4位16进制数,和这个1024位的字符串一并储存起来。

每次比较时,先逐个比较这64个单位的数值是否相同,如果有58个相同,那相似度就有0.9以上。

如果只有57个相同呢?剩下不同的7个4位16进制数,一共有4*7=28位十六进制数字,然后进行逐个比较。

有a个相同,则1024位转化成256位的十六进制数的数字上的相似度等于((57*4)+a) / (64*4) ,他要大于0.9。也就是说,在逐个比较时,a大于等于0.9*64*4 - 57*4 就不用判断了,相似度大于0.9。

如果只有a-1个相同呢?把不同的28-(a-1)位转化为2进制,按上面的方法,逐个比较。

有b个一样,相似度为((57*16)+(a-1)*4+b) / 1024,他要大于0.9,即b大于等于0.9*1024 - 57*16 - (a-1)*4时,相似度大于0.9。

把上面的57和a-1换成任意的x y就是实际情况了。虽然计算量还是很大,不过相比逐个比较小了很多了。

另外,计算出每两个16位二进制数的单位的相似度的时候可以缓存起来,留给256位和64位比较时用。仔细想想量好像也很大……就不继续写了。

两个串直接做与运算,然后结果统计1的数量,与其中一个串比较,数量相近则相似

了解一下海明距离,还有cos相似度

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值