Newsgroup: it.comp.www.php
Titolo: controllo numeri doppi, tripli, etc

ciao a tutti,
eccomi con un altro "problemino" dei miei...all'apparenza semplice..
Solo che c'e' sempre l'esigenza di trovare algoritmi o procedure che
non "appesantiscano" la macchina perchè i numeri possono essere grossi
e il tempo poco..
data una lista di numeri (solito file) -> trovare se ci sono numeri
ripetuti una o più volte.
nelle specifiche non c'è che io devo dire "quali" sono questi numeri
(il che mi rende il compito moolto più semplice) ma solo evidenziare
un errore. Avevo pensato a farmi un array ma la lista può superare
anche i 10.000 unità quindi non credo sia una buona idea (?).. mettere
tutto in una query non so pure se sia cosa buona....
Suggerimenti, consigli, idee , [codice :-) ], ben accette!!!!
grazie
Luc

 Luc
Ciao!

 tutto in una query non so pure se sia cosa buona....
Di solito questo tipo di algoritmi ha lo svantaggio che occupazione di memoria
ed efficienza sono direttamente proporzionali, ovvero gli algoritmi piu'
efficienti occupano uno sbrego di memoria.
Dato per scontato che se la lista e' preordinata sul campo di cui devi trovare i
doppioni, la soluzione del problema e' banale, volendo occupare pochissima
memoria, io farei due cicli nidificati tipo bubble sort:
per ogni elemento della lista {
	memorizzo l'elemento
	memorizzo la sua posizione
	scansiono la lista partendo dalla posizione successiva {
		se l'elemento letto e' uguale a quello memorizzato {
			segnalo il doppio
		}
	}
}
Praticamente se hai 10000 elementi il ciclo esterno va da 1 a 10000, al primo
giro il ciclo interno va da 2 a 10000, al secondo giro da 3 a 10000 e cosi' via.
Da un punto di vista di ottimizzazione questo algoritmo e' una frana, ma dal
punto di vista di occupazione di memoria e' efficientissimo.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Law of the Perversity of Nature: You cannot successfully determine
beforehand which side of the bread to butter.


?!?!? Cosa?
Se la lista è ordinata basta che li scorri tutti e per ogniuno vedi se
è uguale al precedente, o no?
O non ho capito cosa devi fare?

 ripetuti una o più volte.
Se è in un DB MySQL puoi usare COUNT ( * ) e GROUP BY per verificare se ci sono ripetizioni.

 Se è in un DB MySQL puoi usare COUNT ( * ) e GROUP BY per verificare se ci sono ripetizioni.
Siccome ho questa possibilità, per ora mi sto orientando su una query
di questo tipo:
select count(*) as conta_linee from sim where ntel in
('1234567890','1234567890','....',.................)
se conta_linee viene diverso dal totale delle linee contate nel ciclo
di lettura, vuol dire che qualcuna è duplicata...
...dovrebbe fungere...


Non ti capisco proprio. Se hai un db allora ti basta qualcosa del tipo
(usando i tuoi dati):
select ntel, count(*) as c from sim group by ntel having c>1;
questa ritorna una tabella di tutti i numeri di telefono che hanno più
di una ripetizione (dicendoti sia il numero sia il numero di
ripetizioni).


No aspetta io non ho ancora i dati nella tabella sim. La query che hai
scritto presuppone che siano già state inserite linee duplicate.
Mi spiego meglio (mancano alcuni dati):
I dati provengono da un file
Un ciclo di controllo verifica che le linee siano presenti nel db ed
abbiano uno stato=n appropriato
a questo punto prima di dare all'utente facoltà di confermare, bisogna
verificare che *nel file* non vi siano linee duplicate.
Per fare questo io banalmente pensavo di confrontare le linee che mi
provengono dal ciclo appena fatto, con il count della query che avevo
scritto prima. In effetti funziona, in pratica quello che ho scritto
è:
file:
    1234567890
    1234567890
    1234567891
ciclo di controllo sul db:
    select ntel from sim where...-> le linee sono ok e confermabili
    tot++
//tot=3
controllo duplicati nel file:
    select count(*) as c from sim where ntel in
('1234567890','1234567890','1234567891')
//c=2
if (c!=tot)
    C'e' un duplicato nel file!
else
    OK
Luk

 abbiano uno stato=n appropriato
Ma scusa...
se sei all'inizio del giochetto, non puoi semplicemente mettere la 
colonna SIM del tuo db come UNIQUE fregandotene del file?
Fai la insert, se fallisce allora era doppio, altrimenti va avanti... è 
sbagliato come concetto?
..spero di aver ben compreso...
ciao
max


<snip>
Ti giuro che capirti non è facile. Non credo di essere ancora arrivato
al problema.
Se nel db non ci possono quindi essere linee duplicate, non basta
mettere quel campo come unique?
Se il file è usato come controllo, non è meglio passare il file sul db
e lavorare con i soli dati del db?
Mi son perso per strada?
Comunque se adesso ti funziona fa niente, pace :)
Ciao!

 - Mostra testo citato -
Non hai torto, :-)
il fatto è che per le specifiche quel file - che deve essere
riutilizzato dopo in modi che neanche immaginiamo - non può avere
linee duplicate. Lo devo salvare , insomma, depurato da linee che
siano corrette, presenti nel db, [etc], e che non siano duplicate :)
PS. Il database è informix ed è già presente con milioni di record...
fare modifiche non so se è agevole e se possibile cercherei di
evitare. (nel senso, non lo so realmente, non conosco bene informix)
Grazie

 O non ho capito cosa devi fare?
Forse mi sono spiegato male.
"Dato per scontato che se la lista e' preordinata sul campo di cui devi trovare
 i doppioni, la soluzione del problema e' banale," dice proprio quello: se la
lista e' gia' ordinata e' scontato che la soluzione del problema sia banale e mi
sembrava anche offensivo indicare la soluzione :)
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
CORREZIONE D'ERRORE: Versione 1.1.
    --Pietropaolo Bianchi

 wrote:
se usi un array puoi usare
http://www.php.net/manual/en/function.in-array.php
Se i dati sono su un db la count fa il suo dovere.
Ciao Gianmarco