Comment calculer la somme de la distance de Hamming en PHP

James Bond
Libérer: 2023-03-11 11:00:02
avant
1881 Les gens l'ont consulté

La distance de Hamming de deux nombres entiers fait référence au nombre de bits binaires différents correspondant aux deux nombres. Aujourd'hui, l'éditeur va vous présenter la méthode de calcul de la somme des distances de Hamming en PHP. Vous pouvez vous y référer si vous en avez besoin.

Comment calculer la somme de la distance de Hamming en PHP

La distance de Hamming de deux entiers fait référence au nombre de bits différents correspondants dans les chiffres binaires de ces deux nombres.

Calculez la somme des distances de Hamming entre deux nombres quelconques dans un tableau.

Exemple :

输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系) 所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
Copier après la connexion

Remarque :

La plage des éléments du tableau est de 0 à 10^9. La longueur du tableau ne peut pas dépasser 10^4.

Idées de résolution de problèmes 1

Énumérez de manière exhaustive le nombre de combinaisons par paires, puis accumulez la distance de Hamming. C'est la solution la plus simple et la plus directe.

Le résultat est qu'il expire lorsqu'il y a une grande quantité de données et que le nombre de factorielles est trop élevé.

Code

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'); }}
Copier après la connexion

Idées de résolution de problèmes 2 - Calcul vertical

Nous analysons souvent des problèmes comme celui-ci : le cas le plus simple -> cas généraux, complexes. Auparavant, nous étions : parcourir toutes les combinaisons possibles par paires.

Maintenant, regardons les choses sous un autre angle : si int n'a que 1 bit -> int a 32 bits.

Tout d'abord, si int n'a que 1 bit, c'est-à-dire que les éléments du tableau nums n'ont que deux situations, 0 ou 1. À ce stade, les étapes pour trouver la somme de la distance de Hamming sont les suivantes :

Divisez d'abord le tableau en deux groupes, un avec tous les bits 0, tous les groupes de 1 bit combinent deux groupes de nombres par paires, l'un est a, l'autre est b. Si a et b appartiennent tous deux au groupe de 0, ou les deux du groupe de 1, il n'y aura pas de distance de Hamming. Mais si l'un des a et b vient du groupe 0 et l'autre du groupe 1, la distance de Hamming sera générée. Supposons que le nombre d'éléments dans le tableau nums est n et que le nombre d'éléments 0 est k. , alors le nombre de 1 éléments Le nombre est n-k, alors la somme des distances de Hamming qui peuvent être générées à l'étape précédente est k*(n-k)k*(n-k), qui est la somme des distances de Hamming lorsque int n'a que 1 digit Si le nombre de chiffres dans int est étendu de 1 chiffre à 32 bits, alors chaque bit sera parcouru, puis la somme des distances de Hamming à ce bit sera calculée et accumulée ensemble. Cela peut réduire la complexité de l'algorithme de $. O(N^2)$ à $O( 32 fois N)$, soit $O(N)$.

Vous pouvez regarder l'exemple suivant :

十进制 二进制 4: 0 1 0 0 14: 1 1 1 0 2: 0 0 1 0 1: 0 0 0 1
Copier après la connexion

Regardez d'abord la dernière colonne, il y a trois 0 et un 1, puis la distance de Hamming entre eux est de 3, c'est-à-dire que la distance entre 1 et les trois autres 0 est accumulées, puis regardez Dans la troisième colonne, la distance de Hamming cumulée est de 4, car chaque 1 produira deux distances de Hamming avec deux 0 De même, la deuxième colonne est également de 4 et la première colonne est de 3. La somme des distances de Hamming des combinaisons par paires de chaque colonne est la somme du nombre de 0 et du nombre de 1 dans chaque colonne. La somme des distances de Hamming de chaque colonne est la distance entre les deux éléments de la. nombres de tableaux requis par la question.

Code

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; } }
Copier après la connexion

Apprentissage recommandé :

Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:hxd.life
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!