|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Provincia Varese
Messaggi: 217
|
Scelta struttura dati
Devo realizzare il progetto spiegato dopo in C, non vi chiedo grossi aiuti, solo di aiutarmi a scegliere le strutture dati più adeguate. Non ci possono essere vincoli di dimensione, quindi le matrici vanno escluse. Devo tenere conto delle prestazioni quindi le scelte devono portarmi a evitare che le operazioni richieste abbiano costi eccessivi. Grazie mille, ogni aiuto è gradito
Quote:
__________________
La risposta non la devi cercare fuori, la risposta è dentro di te. Epperò è ... quella sbagliata! - Quelo
Ultima modifica di L\'Esecutore : 03-04-2009 alle 15:36. |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Provincia Varese
Messaggi: 217
|
Up
__________________
La risposta non la devi cercare fuori, la risposta è dentro di te. Epperò è ... quella sbagliata! - Quelo
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Potresti usare un albero a quadranti. Non ho capito bene la distinzione tra ordine e perimetro ma dovrebbero diventare entrambi funzione della profondità dell'albero.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Provincia Varese
Messaggi: 217
|
Io me lo sono immaginato come un piano cartesiano, la prima tessera sta in (0,0).
Se ho 3 tessere rispettivamente in(0,-1), (0,0), (0,1) il mio mosaico avrà ordine 3 e perimetro 8.
__________________
La risposta non la devi cercare fuori, la risposta è dentro di te. Epperò è ... quella sbagliata! - Quelo
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Carta e penna alla mano dopo un paio di scarabocchi mi risulta papabile un quadtree costruito dal basso.
In pratica quando introduci la prima tessera crei un quadrante senza genitore di lato unitario e posizione (xa,ya) Quando introduci la seconda tessera crei un secondo quadrante senza genitore di lato unitario e posizione (xb,yb) Dopodichè unisci i due quadranti con un parente comune di lato Max(xb-xa, yb-ya) In generale per unire due quadranti in un genitore devi determinare il minimo quadrante sufficiente a contenerli entrambi partendo dalla radice dell'albero. Il quadrante esiste se la sua superficie è contenuta nella radice dell'albero. Altrimenti occorrerà congiungere la radice alla foglia inserendo tutti i nodi del ramo a cui la foglia appartiene. Risulta a questo punto che il perimetro dell'albero sia il perimetro della radice e l'ordine il lato della stessa. L'albero ti consente di determinare con efficienza se le posizioni astrattamente accessibili che crei quando introduci una nuova tessera siano effettivamente disponibili.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Provincia Varese
Messaggi: 217
|
Non ho molta familiarità sui quadtree, ora vedo di fare qualche tentativo.
Grazie dell'aiuto, spero di riuscire a metterlo in pratica
__________________
La risposta non la devi cercare fuori, la risposta è dentro di te. Epperò è ... quella sbagliata! - Quelo
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Io invece ti propongo tale classe (Beh, in C un insieme di strutture dati e di funzioni).
Per memorizzare le tessere del mosaico gia' inserite userei una Lista di coordinate. Per memorizzare le posizioni papabili per i prossimi inserimenti userei un'altra Lista di coordinate, da aggiornarsi ogni volta che si inserisce una nuova tessera. La funzione per verificare se una coordinata e' possibile e' banalmente la ricerca in quest'ultima lista. le funzioni di inserimento e cancellazione, quest'ultima necessaria per la lista dei papabili, sarebbero quindi O(N Log N) come da lista. La funzione perimetro dovrebbe essere semplicmente la lunghezza della lista dei papabili, quindi O(1). Non ho capito nel caso di buchi interni se il perimetro li deve considerare. Questo approccio lo farebbe. Per la funzione ordine dovrebbe essere sufficiente tenere a mente la massima coordinata X e la massima coordinata Y (ed evenutlamente anche le minime, nel caso di coordinate negative), durante l'inserimento di una nuova tessera, quindi di nuovo O(1) Poi in realta' io userei 2 Hashtable con chiave doppia al posto delle 2 liste, dove le 2 chiavi sarebbero ovviamente le coordinate. In tal modo anche tutte le funzioni di inserimento e cancellazione sarebbero con complessita' O(1). Avresti quindi tutto in O(1), direi con conseguente massimo dei voti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 06-04-2009 alle 13:20. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Provincia Varese
Messaggi: 217
|
La hashtable mi piace molto come soluzione, ma temo che per questo progetto sia fuori discussione
__________________
La risposta non la devi cercare fuori, la risposta è dentro di te. Epperò è ... quella sbagliata! - Quelo
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:59.


















