Mi piace troppo questo forum sto trovando le soluzioni per un sacco di esercizi di ASD che non sapevo fare ^^
Mi restano però alcuni dubbi su di un esercizio, eccolo:
Data una sequenza di n numeri A = (a1, a2, ..., an) ed un intero 1 <= k <= n, si descriva ed analizzi un algoritmo che in tempo O(n + k log k) trovi i k numeri più grandi in A ordinati dal più piccolo al più grande.
Questa è la mia soluzione
Ho pensato di sfruttare la struttura dati heap, in particolare una funzione heapsort modificata. Praticamente a partire dall'array A costruisco l'heap tramite la funzione buidheap che si dimostra prende tempo O(n).
Quindi itero il for dell'heapsort non per tutta la lunghezza dell'array ma solo per k volte:
Codice: Seleziona tutto
heapsort_modificata(A, k)
	buildheap(A)
	i <- length[A]
	for j <- k-1 downto 0 do
		k_elementi[j] <- A[i]
		scambio A[1] <-> A[i]
		i <- i - 1
		heapsize[A] <- heapsize[A] - 1
		heapfy(A,1)Il problema è che se ho fatto tutto correttamente, la funzione dovrebbe impiegare tempo O(n + k log n), O(n) per costruire l'heap tramite buildheap e poi si hanno le k chiamate alla funzione heapfy che impiega tempo log n. Giusto? C'è quel log n che mi rovina...
Che dite si può fare di meglio? Voi come procedereste?