Sunteți pe pagina 1din 1

Missing Numbers

Se dau n-1 numere distincte de la 1 la n, sa se dea un algoritm cat mai eficient care sa determine
numarul lipsa.

Rezolvare
Prima rezolvare ce ne poate veni in minte este aceea de a verifica daca fiecare numar 1 -> n este
prezent in sirul nostru, printr-o parcurgere (acest algoritm are complexitatea O(n2) ). O alta rezolvare
triviala ar fi sa sortam numerele si sa determinam prin parcurgere numarul i pentru care a[i] != i
(pentru sortari rapide algoritmul are complexitatea O(n log n) ).
O rezolvare mai eficienta poate fi data folosind Divide et Impera. Putem imparti numerele in doua
multimi, una in care vom pune numerele mai mici sau egale cu n/2, iar in cealalta restul. Acum vom sti
din care din cele doua multimi lipseste numarul, dupa numarul de elemente al acestora. Considerand
T(n) timpul de executie al algoritmului, atunci complexitatea devine T(n) = T(n/2) + O(n) = O(n). Deci
algoritmul este liniar, si foloseste memorie O(n), ignorand memoria consumata de stiva din algoritmul
Divide et Impera ( O(log n) ). O alta idee este de a folosi un tabel de dispersie sau un sir de valori
booleene care va folosi memorie suplimentara O(n) (poate fi redusa la O(n/log n) daca se lucreaza pe
biti).
O rezolvare eleganta se foloseste de proprietatea ca suma numerelor naturale de la 1 la n este n(n + 1)/2.
Numarul lipsa este egal cu diferenta dintre n(n + 1 )/2 si suma numerelor noastre. Aceasta solutie are
complexitatea O(n) (parcurgem sirul pentru a determina suma) ca timp si O(1) ca memorie. Daca n este
destul de mare, s-ar putea ca n(n+1)/2 sa depaseasca domeniul de reprezentare al intregilor, rezultand
in necesitatea implementarii operatiilor cu numere mari. Pentru a evita acest lucru folosim operatia xor
(notata prin ∧ ) si proprietatile ei a ∧ a = 0 si a ∧ b = b ∧ a. Vom face suma xor a numerelor a[i] ∧ i (1
<= i <= n):
S = a[ 1 ] ∧ 1 ∧ a[ 2 ] ∧ 2 ∧ ... ∧ a[ n - 1 ] ∧ n - 1 ∧ n
Astfel fiecare numar care apare in sir va fi in suma de doua ori si va fi anulat, iar rezultatul final va fi
indicele numarului lipsa. Solutia are compexitatea O(n) ca timp si O(1) ca spatiu.

S-ar putea să vă placă și