Home  >  Article  >  Backend Development  >  求解类似数据如何搜索!

求解类似数据如何搜索!

WBOY
WBOYOriginal
2016-06-06 20:12:35785browse

数据格式如下
"10101010001001101100100011000100100100001011100001000010010101000101010101000101".....共计256位
就是除了1就是0的唯一标示符256位的跟64位的还有1024位的
这种标示符
目前我已经有256位的跟64位的了,目前数据我已经生成了800w条,陆续生成中

字符串1="10101101001010010111010101100001011101000101010010001000111001101010010101"...
字符串2="10101001001011010111010101000001011101000101110010001001111001101010010101"....
求这两个字符串的相似度 顺序比较 以下为相似度 计算

<code>

$len = strlen($hash1);
for ($i = 0; $i </code>

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

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

回复内容:

数据格式如下
"10101010001001101100100011000100100100001011100001000010010101000101010101000101".....共计256位
就是除了1就是0的唯一标示符256位的跟64位的还有1024位的
这种标示符
目前我已经有256位的跟64位的了,目前数据我已经生成了800w条,陆续生成中

字符串1="10101101001010010111010101100001011101000101010010001000111001101010010101"...
字符串2="10101001001011010111010101000001011101000101110010001001111001101010010101"....
求这两个字符串的相似度 顺序比较 以下为相似度 计算

<code>

$len = strlen($hash1);
for ($i = 0; $i </code>

得到相似度
搜索要求为
从数据库中读取出跟 "字符串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相似度

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn