Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-02-2009, 11:59   #1
emix0880
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)
inserisce n nell' albero puntato da tp, che ne è la radice.

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.
emix0880 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2009, 13:02   #2
Furla
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.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2009, 19:42   #3
emix0880
Junior Member
 
Iscritto dal: Nov 2008
Messaggi: 6
Quote:
Originariamente inviato da Furla Guarda i messaggi
la struttura che hai linkato 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.
ciao inanzittutto grazie per la risposta. Il mio problema è proprio evitare di usare un array e muovermi direttamente nell' albero. oggi abbiamo trovato la soluzione con delle chiamate ricorsive sui 2 figli per trovare il posto dove inserire e chiamare hepyfy per farlo risalire. abbiamo dovuto agiungere dei controlli per no far continuare la ricorsione una volta che si era trovato il posto dove inserire e averlo fatto risalire.
emix0880 è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2009, 15:51   #4
Furla
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.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2009, 16:12   #5
emix0880
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ò comunque ho quasi finito di scriverla e in teoria dovrebbe funzionare.
emix0880 è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2009, 16:30   #6
Furla
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.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2009, 20:03   #7
emix0880
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 ). MA il prof ha detto che se è necessario è meglio non aggiungere campi alla struttura, perchè la rende molto pesante (visto il gran numero di instanze). Allora ha accennato a una modo:

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?
emix0880 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2009, 20:55   #8
qwerty86
Senior Member
 
L'Avatar di qwerty86
 
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
qwerty86 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2009, 20:33   #9
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
Quote:
Originariamente inviato da emix0880 Guarda i messaggi
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?
l'albero di natale è il risultato giusto, ma deve essere solo tra il penultimo e l'ultimo livello, e non c'è bisogno di appesantire la struttura: basta usare i puntatori ai figli, e il puntatore al padre dell'elemento puntato ti permetterà di distinguere tra il caso in cui è figlio e quello in cui è in coda, con una condizione del tipo

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.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2009, 21:32   #10
emix0880
Junior Member
 
Iscritto dal: Nov 2008
Messaggi: 6
Quote:
Originariamente inviato da Furla Guarda i messaggi
l'albero di natale è il risultato giusto, ma deve essere solo tra il penultimo e l'ultimo livello, e non c'è bisogno di appesantire la struttura: basta usare i puntatori ai figli, e il puntatore al padre dell'elemento puntato ti permetterà di distinguere tra il caso in cui è figlio e quello in cui è in coda, con una condizione del tipo

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)
Allla fine sono riuscito a implementare con l' intero in pratica ho creato
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?
emix0880 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2009, 11:15   #11
Furla
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.
Furla è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
The Grand Tour 2026: ecco chi saranno i ...
SSD NVMe M.2 e Pentium III insieme? Si.....
Un altro iPhone economico è in arrivo a ...
Svolta Polestar per la ricarica: Plug&am...
Windows 11, cali di prestazioni sulle GP...
QNAP lancia myQNAPcloud One: l'archiviaz...
Clamoroso in Formula 1: FIA pronta a cam...
iPhone 18 Pro Max con batteria da oltre ...
L'UE dà ragione ad Apple: Maps e ...
Droni accecati e comunicazioni isolate: ...
Accesso alla memoria su Windows 11 solo ...
Regali di San Valentino: 15 idee tech sf...
Stellantis a picco in Borsa: 22 miliardi...
Baldur's Gate 3 diventa una serie TV: pr...
Intel riapre la sfida con Steam Deck: Pa...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v