13.07.2015 Views

Algoritmi e Strutture Dati -- Esercizi - Università degli Studi di Salerno

Algoritmi e Strutture Dati -- Esercizi - Università degli Studi di Salerno

Algoritmi e Strutture Dati -- Esercizi - Università degli Studi di Salerno

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ESERCIZIO 6.5-8 9<strong>Esercizi</strong>o 6.5-8Descrivete un algoritmo con tempo O(n log k) per fondere k liste or<strong>di</strong>nate in un’unica lista or<strong>di</strong>nata,dove n è il numero totale <strong>di</strong> elementi <strong>di</strong> tutte le liste date in input.Soluzione. L’algoritmo Merge per fondere due liste or<strong>di</strong>nate mantiene per ogni lista il puntatore alpiù piccolo elemento che non è stato ancora dato in output e ad ogni passo dà in output il minimotra i due elementi. Un’ovvia generalizzazione dell’algoritmo richiede <strong>di</strong> poter calcolare il minimo trak elementi. Ciò può essere ovviamente fatto in tempo O(k) dando quin<strong>di</strong> un algoritmo <strong>di</strong> fusione <strong>di</strong> kliste che prende tempo O(kn). Possiamo migliorare il tempo per la fusione utilizzando un min-heap nelmodo seguente. Il min-heap contiene ad ogni passo il più piccolo elemento <strong>di</strong> ciascuna delle k liste chenon è stato dato ancora in output. Ad ogni passo estraiamo il minimo dall’heap (questa operazioneprende tempo O(log k) in quanto l’heap contiene al più k elementi) ed inseriamo il prossimo elementopiù piccolo (se esiste) che proviene dalla stessa lista cui appartiene il minimo appena estratto (anchequesta operazione prende tempo O(log k)). In totale spen<strong>di</strong>amo tempo O(n log k).Versione: 1.3 del 19 novembre 2005.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!