hamming('10101010','01010101')
上記の結果は8
.
それを実装する方法は?
ここにGMPをインストールしなくても、同じ長さのバイナリ文字列を簡単に解決できます。
function HammingDistance($bin1, $bin2) {
$a1 = str_split($bin1);
$a2 = str_split($bin2);
$dh = 0;
for ($i = 0; $i < count($a1); $i++)
if($a1[$i] != $a2[$i]) $dh++;
return $dh;
}
echo HammingDistance('10101010','01010101'); //returns 8
既に存在するため、実装する必要はありません: http://php.net/manual/en/function.gmp-hamdist.php
(GMP サポートがある場合)
GMP サポートがない場合は、常にこのようなものがあります。欠点は、長さが 32 ビットまでのバイナリ文字列でしか機能しないことです。
function hamdist($x, $y){
for($dist = 0, $val = $x ^ $y; $val; ++$dist){
$val &= $val - 1;
}
return $dist;
}
function hamdist_str($x, $y){
return hamdist(bindec($x), bindec($y));
}
echo hamdist_str('10101010','01010101'); //8
この関数を試してください:
function hamming($b1, $b2) {
$b1 = ltrim($b1, '0');
$b2 = ltrim($b2, '0');
$l1 = strlen($b1);
$l2 = strlen($b2);
$n = min($l1, $l2);
$d = max($l1, $l2) - $n;
for ($i=0; $i<$n; ++$i) {
if ($b1[$l1-$i] != $b2[$l2-$i]) {
++$d;
}
}
return $d;
}
PHP マニュアルのこのコメントで提供されているコードsubstr_count()
を使用して、ハミング関数を簡単にコーディングできます。
/* hamdist is equivilent to: */
echo gmp_popcount(gmp_xor($ham1, $ham2)) . "\n";
試す:
echo gmp_hamdist('10101010','01010101')