溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP怎么計(jì)算漢明距離總和

發(fā)布時(shí)間:2021-07-08 16:21:14 來(lái)源:億速云 閱讀:109 作者:chen 欄目:編程語(yǔ)言

這篇文章主要介紹“PHP怎么計(jì)算漢明距離總和”,在日常操作中,相信很多人在PHP怎么計(jì)算漢明距離總和問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP怎么計(jì)算漢明距離總和”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

兩個(gè)整數(shù)的 漢明距離 指的是這兩個(gè)數(shù)字的二進(jìn)制數(shù)對(duì)應(yīng)位不同的數(shù)量。

計(jì)算一個(gè)數(shù)組中,任意兩個(gè)數(shù)之間漢明距離的總和。

示例:

輸入: 4, 14, 2
輸出: 6
解釋: 在二進(jìn)制表示中,4表示為0100,14表示為1110,2表示為0010。(這樣表示是為了體現(xiàn)后四位之間關(guān)系)
所以答案為:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

注意:

數(shù)組中元素的范圍為從 0到 10^9。數(shù)組的長(zhǎng)度不超過(guò) 10^4。

解題思路 1

窮舉兩兩組合的數(shù)量,然后累加漢明距離,這個(gè)是最簡(jiǎn)單直白的方案。

結(jié)果是大量數(shù)據(jù)的時(shí)候會(huì)超時(shí),階乘的數(shù)量太多。

代碼

class Solution {
    /** 
    * @param Integer[] $nums 
    * @return Integer 
    */
    function totalHammingDistance($nums) {
        $count = count($nums);
        $sum = 0;
        for ($i = 0; $i < $count - 1; $i++) {
            for ($j = $i+1; $j < $count; $j++) 
            {
                $sum += $this->hm($nums[$i], $nums[$j]);
            }
        }
        return $sum;
    }
    // 漢明距離方法
    function hm($x, $y)
    {
        return substr_count(decbin($x ^ $y), '1');
    }}

解題思路 2 - 豎著計(jì)算

我們經(jīng)常會(huì)這樣分析問(wèn)題:最簡(jiǎn)單的情況 -> 一般的、復(fù)雜的情況。之前我們是:遍歷所有可能的兩兩組合。

現(xiàn)在我們換一個(gè)角度看:如果int只有1位-> int有32位。

首先,如果 int 只有 1 位,即數(shù)組 nums 中的元素只有兩種情況,0 或者 1,此時(shí)求漢明距離總和的步驟如下:

首先將數(shù)組分成兩組,全 0 位一組,全 1 位一組將兩組數(shù)兩兩組合,記一個(gè)為a,一個(gè)為b如果 a、b 均來(lái)自 0 那一組,或者均來(lái)自 1 那一組,此時(shí)不會(huì)有漢明距離產(chǎn)生。但是如果 a、b 一個(gè)來(lái)自 0 那一組,另外一個(gè)來(lái)自1那一組,這時(shí)將會(huì)產(chǎn)生漢明距離假設(shè) nums 數(shù)組元素個(gè)數(shù)為 n,其中 0 元素個(gè)數(shù)為 k,則 1 元素的個(gè)數(shù)為 n-k,則上一步能夠產(chǎn)生漢明距離的總和就是k*(n-k)k*(n-k) 就是 int 只有 1 位的情況下的漢明距離總和

如果將 int 的位數(shù)從 1 位擴(kuò)展到 32 位,那么就是將遍歷每一位,然后求出在這一位上的漢明距離和,累加到一起,這樣可以將算法復(fù)雜度從 $O(N^2)$ 降低到 $O(32\times N)$,即為 $O(N)$。

可以看下面這個(gè)例子:

十進(jìn)制       二進(jìn)制
4:        0 1 0 0
14:        1 1 1 0
2:        0 0 1 0
1:        0 0 0 1

先看最后一列,有三個(gè) 0 和一個(gè) 1,那么它們之間相互的漢明距離就是 3,即 1 和其他三個(gè) 0 分別的距離累加,然后在看第三列,累加漢明距離為 4,因?yàn)槊總€(gè) 1 都會(huì)跟兩個(gè) 0 產(chǎn)生兩個(gè)漢明距離,同理第二列也是 4,第一列是 3。各列相互之間兩兩組合的漢明距離總和就是各列 0 的個(gè)數(shù)與 1 的個(gè)數(shù)之和,把各列漢明距離總和再累加就是題目所求的數(shù)組 nums 元素兩兩之間的漢明距離總和。

代碼

class Solution {

    /** 
    * @param Integer[] $nums 
    * @return Integer 
    */
    function totalHammingDistance($nums) {
        $count = count($nums);
        $sum = 0;
        for($i = 0; $i < 32; $i++)
        {
            $tmpCount = 0; 
            
            for($j = 0; $j < $count; $j++)
            {
                $tmpCount += ($nums[$j] >> $i) & 1;
            }
            
            $sum += $tmpCount * ($count - $tmpCount);
        }
         
        return $sum;
    }
}

到此,關(guān)于“PHP怎么計(jì)算漢明距離總和”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI