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
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.