|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Nov 2008
Messaggi: 6
|
[C] coda con priorità con albero binario
ciao a tutti
il mio problema è questo: devo scrivere le funzioni che creano una coda con priorità. la strutura è la seguente: Codice:
struct nodo{
int priorità;
nodo dx;
nodo sx;
}
Codice:
nodo * inserici(nodo **tp, nodo *n) la mia prima idea è stata di sfruttare l' implementazione con heap(array). Tramite visita per livelli (BFS), riempio l' array. Dopo, inserendo l' elemento in ultima posizione, chiamo heapyfi sul suo padre (i/2) per farlo risalire al posto giusto. Sistemo i puntatori e restituire come radice il puntatore del elemento V[0]. il tutto con complessità O(n)per la visita + O(log n) per le operazioni sull' array. MA ho scoperto da colleghi che c' è una soluzione con complessità minore senza creare l' arrey, ma muovendosi sull' albero e facendo chiamate ricorsive sui figli. SU google ho cercato in lungo e il largo ma parlano tutti di heap binari. Qualcuno mi suggerisce come procedere? PS. se c' è bisogno si può aggiungere un campo alla struttura per tenere l' indirizzo del padre. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
la struttura che hai postato corrisponde ad un heap binario.
se sai come funziona un heap, non ti sarà difficile fare un funzione che inserisce all'ultimo posto il nuovo elemento e poi lo fa risalire, specialmente se inserisci nella struttura un puntatore al padre; la cosa importante è poter trovare l'ultimo posto in O(logn). visto che la struttura della coda è ancora da definire, io userei direttamente un array per implementarla, senza passare per la struttura ad albero. Ultima modifica di Furla : 22-02-2009 alle 15:54. |
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Nov 2008
Messaggi: 6
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
però immagino che in quel modo controlliate tutti i nodi dell'albero, a quel punto la complessità sarebbe lineare, e non O(logn). se volete trovare l'ultimo posto in O(1) dovrete ingegnarvi usando i puntatori delle foglie per realizzare una lista con inserimento in coda.
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Nov 2008
Messaggi: 6
|
purtroppo non abbiamo una gran libertà implementativa, in quanto questa è una parte del progetto di sistemi operativi e da specifiche non possiamo usare allocazione dinamica, quindi per usare tecniche che usano liste con malloc, dobbiamo farlo con vettori, e il discorso si complia un pò
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
non devi allocare nulla più di quello che hai già per fare quello che dico, è solo che uno dei due puntatori delle foglie, invece di essere nullo, contiene l'indirizzo della foglia successiva. in più ovviamente ti serve un puntatore all'ultima foglia per l'inserimento O(1).
Ultima modifica di Furla : 22-02-2009 alle 16:33. |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Nov 2008
Messaggi: 6
|
ciao ho provato il tuo metodo è devo dire che è molto valido. Solo che per attuarlo ho aggiunto 3 campi uno al padre, uno al ultimo nodo e uno alla foglia successiva. Man mano che inserisci creo una sorta di lista lungho i livelli dell' albero (tipo addobbo dell' albero di natale
in base a un intero si fa and bit a bit per trovare la posizione da inserire. es il numero la radice si inserisce quando l' albero è NULL lo 0 vuol dire sinistra e l' 1 destra il primo nodo si etichetta con 0 e va a sinistra della radice il secondo è 1 cioè 1 in binrio quindi destra il terzo 00 cioè sinistra sinistra il quarto 01 cioè sinistra destra ecc ecc non mi è molto chiaro come implementarlo. Qualcuno conosce già questo algoritmo? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
un Heap puoi implementarlo usando un Array, in A[1] c'è la radice, e per ogni elmento i il figlio sinistro si trova nella posizione di indice 2*i e il figlio destro nella posizione 2*i+1.
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
Quote:
if(elem->destro->padre==elem) cout<<"destro è figlio di elem"; else cout<<"destro è in coda dopo elem" non so se ho capito bene come funziona il discorso dell'intero, se ce n'è uno per tutto l'albero e ogni bivio è un bit occhio, perché ti limita a 16 o 32 il livello massimo dell'albero (a seconda della macchina su cui lo compili), penso che sia comunque un numero sufficiente per quello che ci devi fare. pensandoci bene, in effetti, questo intero potrebbe essere benissimo il numero di elementi dell'albero, a meno del primo bit a 1 a partire da sinistra (che ti consente però di capire dove parte il numero) Ultima modifica di Furla : 24-02-2009 alle 20:58. |
|
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Nov 2008
Messaggi: 6
|
Quote:
static short int p; /* profondità */ static short int n=1; /* numero nodo */ e scendo a seinistra o destra con((n>>p)&1 ==0) e ((n>>p)&1 ==1) e ogni volta che faccio una chiamata ricorsiva faccio p-- e quando ritorna p++ e quando la foglia e quella che satura il livello cio 2^p+1 incremento p++. L' inserimento ora è ok. ora mi serve l' heapify che suppongo non si possa fare button up come per l' array ma sto cercando di farlo dopo che ha inserito ed è risalito alla radice. Applico hepyfi alla radice e ricorsivamente hai figli. secondo te può andare? |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
se usi il puntatore al padre puoi fare il posizionamento bottom-up, altrimenti ti tocca farlo ricorsivo partendo dalla radice. puoi evitare di richiamarlo per tutti i nodi, ma per solo quelli che fanno parte del "percorso" memorizzato negli interi.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:50.



















