|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
[C-PHP] Algoritmo di ricerca sottostringhe matchanti
Ciao a tutti,
ho un problema: ho 2 stringhe (che altro non sono che caratteri rappresentati come esadecimali) molto lunghe, di circa 10kb l'una. Vorrei trovare le sottostringhe più lunghe uguali all'interno di queste 2 stringhe... Esempio dvksjvsvdvvbvbssbkueewOUIBVAdalwiiilaclca cscasqoklsmccOUIBVAspjpsglmsbmsb in questo caso l'algoritmo dovrebbe ritornarmi la sottostringa OUIBVA. C'è un modo veloce per scrivere sto algoritmo in C o PHP? Va bene anche pseudocodice, perchè io non ho idee ![]()
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
L'ho fatto al lavoro in C# poco piu' di un mese fa, se ti serve domani lo posto.
Mi sembra di essere arrivato a complessita' n^2 Ln(n), quindi nel tuo caso estremamente lento.
__________________
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. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
una possibile implementazione che pensandoci un attimo mi è venuta in mente è effettuare un XOR della prima stringa con la traslazione di un byte alla volta della seconda.
A quel punto devi memorizzarti il numero massimo di zeri consecutivi nelle varie esecuzioni dell'XOR ed effettuare la ricerca dell'esecuzione con il max numero di zeri. Quindi, ricapitolando, se non mi sono dimenticato niente e se funziona (ad occhio mi sembrerebbe di si.. ma tra la teoria e la pratica di solito ce ne passa ![]() quindi mi sa che è equivalente alla soluzione di gugoxx ![]() cmq sui processori moderni per stringhe di 10000 caratteri dovrebbe essere *sufficientemente* veloce ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
ma si ragazzi n^2 Ln(n) è perfetto, tanto serve solo a me questo algoritmo...
@ ^TiGeRShArK^: oddio, non ho capito come funziona...aspè fammi un esempio veloce, ti do le stringhe: abbazalla ciccalibba In pratica come funziona?? ![]() abbazzalla - ciccalibba abbazzalla - iccalibba abbazzalla - ccalibba abbazzalla - calibba intendi questo?
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Avevo perso la prosceuzione.
Si', funziona come ha detto TigerShark, ed e' anche molto elegante. Anche questo e' n^2 ln(n), ed e' piu' bello del mio. Ma forse prendendo spunto da questo si puo' ridurre a n*Log(n). anche a me serviva per qualche decina di Kappa, quindi non sono stato a cercare la soluzione ottima, ma direi che ci si puo' lavorare.
__________________
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 : 09-02-2008 alle 11:44. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]() dovrebbe essere così: Codice:
sacca ^ pacca = 10000 sacca ^ accap = 11011 sacca ^ ccapa = 11110 sacca ^ capac = 10111 sacca ^ apacc = 11101 ![]() ah.. dimenticavo.. Se non erro dovrebbe funzionare solo con stringhe di dimensione uguale ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7249
|
che culo! casualmente mi è capitato di implementare un algoritmo simile in C
te lo allego perchè non ho nemmeno voglia di ricordarmelo ![]() |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
Quote:
Ma dici che con PHP si può fare?? Mi metto a spulciare il manuale, vedo se lavorare con i byte funziona come nel C... Quindi se non ho capito male... la migliore corrispondenza nel tuo caso è la prima, 10000 giusto? Perfetto, è una genialata questo algoritmo ![]()
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
Quote:
![]() Per sfida personale prima di leggerlo provo ad implementarlo in PHP e vedo cosa ne cavo fuori, altrimenti ripiego sul tuo listato ![]()
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7249
|
tranquillo poi se avrai bisogno cercherò anche di spiegarlo (forse)
![]() |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
cmq non so quanto può essere una genialata dato che è il primo che mi è venuto in mente... e quindi potrebbe anche presentare qualche problemino che ora mi sfugge ![]() Cmq se provi ad implementarlo vedrai subito se funziona correttamente ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:16.