Newsgroup: it.comp.lang.visual-basic
Titolo: come si fa?

come posso trovare in un tempo ragionevole una stringa in una lista di 25000
voci?
vi ringrazio
salutoni

 ha scritto nel messaggio
news:8vbvmu$sho$1...@serv1.iunet.it...


 voci?
Le metti su un database e gli crei anche l'indice.
Ciao
Sirjo

 voci?
La lista è in una matrice ? E' ordinata ? E' fissa o dinamica ?
Se dai qualche info in più...
Tanto per dire, in una lista di parole fissa e ordinata, tipo dizionario, puoi
fare una ricerca con pochi confronti usando la ricerca "binaria".
In breve, confronti la parola con l'elemento della matrice che è al centro
della lista, se è maggiore vai a confrontare con quello che è al centro
della parte rimanente, e così via. In una lista di 2^N elementi ci metti
al massimo N colpi (2 * N confronti di stringhe, se usi una routine del tipo
che ti mostro) :-)
Esempio raffazzonato (non ho un sorgente sotto mano, vado a memoria) :
- ipotizzo che tu abbia una strMatriceDiParole() e una strParola.
Crea una Function di questo tipo:
_______________________________________
Function NumeroParola(strMatriceDiParole() As String, strParola As String)
    Dim PuntoDiRicerca As Long  ' è l'indice della parola che stai confrontando.
    Dim Massimo As Long
    Dim UltimoMinimo As Long
    Dim UltimoMassimo As Long
    Massimo = UBound(strMatriceDiParole())
    PuntoDiRicerca = Massimo / 2 ' nel tuo caso partiresti da 12500
    UltimoMassimo = Massimo
    ' fai un loop
    Do
        '   vai a confrontare strParola con strMatriceDiParole(PuntoDiRicerca)
        If strParola = strMatriceDiParole(PuntoDiRicerca) Then
            '     è uguale ?  l'hai trovata, esci dalla function
            NumeroParola = PuntoDiRicerca
            Exit Function
        End If
        '   vai a confrontare strParola con strMatriceDiParole(PuntoDiRicerca)
        If strParola > strMatriceDiParole(PuntoDiRicerca) Then
            '     è maggiore ? la prima parte del dizionario non ti interessa più :-)
            ' dividi in due la parte restante del dizionario e ricominci
            UltimoMinimo = PuntoDiRicerca
            PuntoDiRicerca = PuntoDiRicerca + ((UltimoMassimo - PuntoDiRicerca) / 2)
        Else
            '     è minore ? puoi ignorare la seconda parte, spezzi in due la prima
            '     e riprovi
            UltimoMassimo = PuntoDiRicerca
            PuntoDiRicerca = PuntoDiRicerca - ((PuntoDiRicerca - UltimoMinimo) / 2)
        End If
    Loop
End Function
_______________________________________
Probabilmente (sicuramente :-)) ) è pieno di errori e non è affatto
ottimizzato, ma ti dovrebbe mostrare una strada possibile. Tanto per
cominciare, al posto dei due "if strParola" si dovrebbe usare una Select Case
sul risultato di una StrComp... Non ho qui il sorgente, ma ho già fatto
qualcosa del genere. Se non ci esci dimmelo, che lo ritrovo.
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

 come posso trovare in un tempo ragionevole una stringa in una lista di
25000 voci?
Non ho assolutamente idea dei tempi effettivi del codice seguente percio',
se farai dei test, fammi sapere, grazie.
Option Explicit
Sub Main()
  Dim a(0 To 4) As String
  Dim s         As String
  Dim f
  a(0) = "Pippo"
  a(1) = "Pluto"
  a(2) = "Paperino"
  a(3) = "Topolino"
  a(4) = "Minnie"
  s = "Pippo"
  For Each f In Filter(a, s)
    Debug.Print f
  Next
End Sub
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 Non ho assolutamente idea dei tempi effettivi del codice seguente percio',
se farai dei test, fammi sapere, grazie.
[...]
... e, se hai tempo e voglia, anche di questo, grazie:
Option Explicit
Sub Main()
  Dim a(0 To 4) As String
  Dim s         As String
  Dim i         As Long
  a(0) = "Pippo"
  a(1) = "Pluto"
  a(2) = "Paperino"
  a(3) = "Topolino"
  a(4) = "Minnie"
  s = "Pippo"
  i _
    = UBound( _
        Split( _
          Left$(Join(a, "|"), InStr(Join(a, "|"), s)), "|"))
  If i < 0 Then
    Debug.Print "'"; s; "': stringa non trovata."
  Else
    Debug.Print i; a(i)
  End If





 </CHAT>


 quello che ha trovato :-(
Sarà anche poverà, però io me la sono segnata.
Un sistema di questo tipo non l'avevo mai visto usare.
Compliments :)

 Compliments :)
Grazie, o nostra GUIDa !
--
Ciao.:-)
