首页 > 编程知识 正文

汉明距离三角不等式,平均码长的计算公式

时间:2023-05-04 11:47:18 阅读:138464 作者:3031

汉明距离作为一种特征距离的计算方法被广泛应用于很多场合,其主要思想是找出两个特征差异的大小,也可以说是相似性。 我在图像处理中使用。 项目需要计算图像的梯度方向。 我选择了四个方向。 这样,就可以用两位二进制文件分别表示0、1、2、3,也就是00、01、10、11这四种情况。 这样,我可以将例如四个相邻点、对应的梯度特征合并为一个特征向量。 如图所示

一个字节的大小空间可以表示一个特性。 那么,让我们用这个特征来描述两张图。 假设a、b,可以得到两个特征。 featureA、featureB假设图像大小为100*100的8bit灰度图像,选择水平方向的4个像素,可以得到100*25个1字节的记述特征。 其次,如何衡量这两幅图是否相似,要用汉明距离。 其他距离也可以,但这里说汉明距离。 如果两个图像在这样的特征下是相似的,则他们的特征的对应位将应该尽可能多地匹配,即,featureA ^ featureB将意味着在特征的异或结果中的1的个数将尽可能少。 这就是如何计算1的个数。 这在leetcode和剑指offer等书中就像笔试一样。

通常的解法是把是否是1、是否是yes移位来判断。 需要注意。 需要判断给定数量(在此用tmp表示)的符号。 否则,有可能出现死循环。

intcountone(inttmp ) { int count=0; if(0==tmp )返回计数; elseif(tmp0) while (tmp ) if ) tmp1) count; tmp=tmp 1; } } else { tmp=-tmp; count=1; while(tmp ) {if ) tmp1) count; tmp=tmp 1; } }返回计数; }

这样还是不方便。 我们可以不用换成tmp。

intcountoneversion2(inttmp ) { int flag=1; int count=0; while(flag ) ) if ) flagtmp ) count; flag=flag 1; }返回计数; }

这样可以省去判断符号的麻烦。

还有一种解法。 那就是考虑到tmp每减少1,最后一位的1就会变化,留下剩下的,下次再减少1,知道tmp是零位置,就可以知道其中1的个数。

intcountoneversion3(intn ) { int count=0; wile(n ) { count; n=n(n-1 ); }返回计数; }

以上是采用轮班的方法,但不用轮班也可以。 那是下一个高速汉明距离计算的问题。 首先取三个数,这里考虑unsigned char类型,即1个字节的情况。 分别为AA=85、即01010101、BB=51、即00110011、CC=15、即00001111; 主要思想是计算1的和。 (1行计算相邻两个位置之和,得到的结果最多需要两位数。 并且)两行在计算相邻四个位置之和时,计算结果最多需要四位。 ) 3行再将前4位和后4位相加,得到的是1的个数。

unsigned Char A,b,ch,d; const unsigned char AA=85; const unsigned char BB=51; const unsigned char CC=15; A=tmp; B=AAA; ch=(a1 ) AA; //(1) D=B Ch; B=D BB; ch=(D2 ) BB; //)2) D=B Ch; B=D CC; ch=(D4 ) CC; //)3) ss =B Ch;

为了在硬件上实现,在每个时钟周期都必须注意,必须进行性能的优化。 通过这样的位运算,可以显著提高速度。 这样的计算单元的重复度相当高,所以性能会大幅提高。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。