|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
[C] Ordinamento e accesso random
Ho 1 problema e una domanda da porre,
come si può accedere a dati in modo random in un file per porli in una lista,ho un txt contenente es 111 aaa bbb 222 ccc ddd 333 ttt hhhh 555 yyy iiii ad esempio si vuole che il random prenda valori a caso ,come si fa a "mandarlo a capo" nella ricerca ,nel senso,come si fa a fargli capire di prendere i valori (sono in terzine,codice,nome e cognome) domanda,miglior algoritmo ordinamento per lista linkata? Grazie in ancitipo |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
si,ok,ma per creare un archivio qual' è il miglior tipo di lista ,linkata,doppiamente linkata ,circolare.....?e su questo tipo di lista qual' è il miglior ordinamento ?
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Bisogna vedere bene cosa vuoi fare, cmq in genere un'ottima struttura dati è un albero binario di ricerca, consente la ricerca in O(log N).
In pratica ogni nodo X dell'albero ha un figlio sinistro e uno destro, nel figlio sinistro in genere si pone l'elemento minore di X, mentre nel figlio destro l'elemento maggiore o uguale a X (se vuoi memorizzare doppioni). Uno dei problemi con questa struttura è che l'albero può essere sbilanciato tutto da un lato e degenerare nel caso pessimo in una lista collegata (ricerca in O(N) in tal caso), per ovviare a questo si adotta il bilanciamento automatico, che non è immediato da implementare (vedi alberi AVL). |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
grazie,avrei però bisogno di ordinare in loco e come lista per un piccolo archivio,va bene la linkata?
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Quote:
In ogni caso l'ordinamento in genere è finalizzato alla ricerca, e una struttura come un albero binario se mantenuta opportunamente bilanciata ti garantisce prestazioni superiori senza ricorrere ad un continuo ordinamento dei dati (l'ordinamento viene imposto direttamente all'inserimento dei dati). Se il fine è la ricerca dei dati allora ti consiglio di usare un albero binario. Tanto per la cronaca i principali DBMS fanno uso di strutture ad albero. |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
grazie! ok,ma io devo (per esercizio) creare in una lista (come voglio) ,ed effettuare ricerche e l' ordinamento (con quello che voglio),non posso usare db
Da qui le domande per entrambe le cose,andrei su linkata e quicksort,confermate? Per l' altra domanda come posso fare a posizionarmi su una riga i-esima di un file txt (accedendo con read) ,dove questa riga sia multipla di 3? (seek?) Grazie in anticipo! |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Quote:
![]() Detto ciò una lista doppiamente linkata (che quindi ha anche riferimento al predecessore) la vedo meglio. Puoi andare di quicksort, però non ho mai implementato algoritmi di ordinamento su strutture diverse dagli array, ci potrebbero essere delle difficoltà dovute al fatto che non puoi accedere in maniera diretta agli elementi della lista ma devi usare un iteratore. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Con lsesk puoi posizionarti in un punto qualsiasi del file! Dai uno sguardo qui http://www.manpagez.com/man/2/lseek/
Comunque per un algoritmo di ordinamento devi sempre definire un (non ricordo bene il nome ma te lo chiamo così) comparatore! Ad esempio per i numeri un comparatore ti dice che 1 è minore di 2 oppure che 1 è uguale a 1! Per elementi diversi dai numeri devi definirlo tu! Ad esempio per un ordinamento lessicografico "pippa" viene prima di "pippo" (che esempiaccio gagliardo eh)! Comunque come Java anche il C ha già la funzione di quick sort e anche di merge sort, e addirittura anche di heap sort .... http://www.manpagez.com/man/3/qsort/ devi solo implementare il comparatore... |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Se non erro quelle funzioni vanno bene solo per gli array, e non ad esempio per le liste collegate.
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
grazie ragazzi,allora ,al momento però penso partirò con una linkata semplice e quicksort,eventualmente poi approfondirò con la doppiamente linkata
per lseek come faccio a portarmi ad esempio alla quarta riga? lseek(file, 4, SEEK_SET); ? Grazie! Ultima modifica di gabmac2 : 14-04-2010 alle 09:13. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
tutto dipende dal terzo parametro... comunque ricorda che l'offset parte da zero quindi se sei all'inizio la quarta è 3
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Edit.
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
grazie,ma allora cosa devo scrivere per andare alla terza riga?
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E' probabile che ti convenga leggere prima tutta le righe, e poi sceglierle a caso
__________________
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. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
ad esempio vorrei generare un numero es 6 e andare al sesto record,come posso fare?
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Carichi tutte le stringhe in una lista o un array, e poi vai a prendere il sesto elemento...
Possibile pseudocodice per il C 1. conto quante righe ci sono 2. Creo un array di tante righe 3. rileggo il file, memorizzando ciascuna riga nel posto giusto 4. inizio a tirare i valori a caso e restituisco ogni volta il record corrispondente. In C#, che mi piace tanto ma tanto ma tanto di piu', sarebbe Codice:
string[] data = File.ReadAllLines(@"C:\temp\mioFile.dat"); Random rnd=new Random(); string primoDato = data[rnd.Next(data.Length)];
__________________
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 : 14-04-2010 alle 19:49. |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jun 2009
Messaggi: 5536
|
grazie,è l' idea che avevo avuto io,ma devo assolutamente andare sul file come ho scritto (è il testo del problema),come posso fare?Penso si possa accedere a un iesima riga
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:41.