Questo è un caso particolarissimo del problema del sottoinsieme somma (che è np-completo), dove la somma che vuoi ottenere è x e il sottoinsieme ha sempre cardinalità 2.
Dal momento che devi comunque sempre trovare una combinazione di due elementi, non potrai fare a meno di avere complessità n^2. Potrai al massimo diminuire il numero di iterazioni del caso pessimo di un fattore costante, ma n^2 rimane.
Se parti col merge sort potresti testare solo i primi k elementi minori di x/2 con i successivi h elementi maggiori di x/2 e minori di x. In questo modo scarti alcune combinazioni inutili. Infatti con il tuo algoritmo nel caso pessimo fai un numero di passi pari alla sommatoria di 1, 2, 3, ..., k+h-1, ossia (k+h-1)*(k+h-2)/2, quindi (k^2+2hk-3k+h^2-3h+2)/2; con questo ne fai solo kh. In breve questo approccio è più veloce per ogni h o k tali che la loro somma sia circa maggiore di 6, ossia per tutti i casi sensati per un'elaborazione.
Ultima modifica effettuata da Il Totem il 15/05/2011 alle 13:09 |