Recherche rapide dans une liste

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 29 déc. 2011 à 17:51
 Utilisateur anonyme - 30 déc. 2011 à 23:03
Bonjour à tous

J'ai un tableau de string nommé permutation qui peut contenir jusqu'à 200000 élements
et une liste de string nommé dico(7)
dico(7) de taille 57000
je veux savoir si un élement de permutation
se trouve dans dico(7)
j'ai écrit le code suivant

Private Function FindWordInList(ByVal index As Integer, ByVal permutation As String()) As String()
        Dim sql = (From value As String In permutation Select value Where listdico(index).Contains(value)).ToArray
        Return sql
    End Function


le problème cela un temps pour
possible que le LINQ prend beaucoup de temps

Merci
A voir également:

8 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 déc. 2011 à 17:53
ah il manque un mot
le problème cela prend un temps
0
Utilisateur anonyme
29 déc. 2011 à 18:56
Bonsoir ShayW,

J'ai essayé chez moi les 'predicates' qui sont très rapides :

Public Class Form1

    Dim texte As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim liste As New List(Of String)
        Using r As New IO.StreamReader("mots.txt")
            liste.AddRange(r.ReadToEnd.Split(Environment.NewLine))
        End Using
        texte = "BA"
        Dim items As List(Of String) = liste.FindAll(AddressOf Cherche)
        '... moins de 1 seconde
    End Sub

    Private Function Cherche(ByVal mot As String) As Boolean
        If mot.Contains(texte) Then Return True Else Return False
    End Function
End Class


C'est toujours pour ton jeu ?
0
Utilisateur anonyme
29 déc. 2011 à 19:12
Juste une ligne à remplacer dans le code ci-dessus (oui j'avais pas mis option strict )
liste.AddRange(r.ReadToEnd.Split(New String() {Environment.NewLine}, StringSplitOptions.None))
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 déc. 2011 à 21:13
Bonsoir Banana32
Oui pour le jeu des chiffres et des lettres
j'ai presque fini
les chiffres sont fait avec solution
toutes les solutions possible
le temps cela dépend 10 secondes pour
400 solutions différentes

ton code est bon pour trouver un mot seulement
dans une liste
j'ai besoin de trouver tous les mots de la listeA qui se trouve dans la listB
et listA contient plus de 200000 mots
et listB 50000
dans le jeu
avec les lettres sorties au tirage
je trouve toutes les combinaisons possibles
de 2 à 8 lettres et pour chaque combinaison
je crée toute les permutations possible

et ensuite cherche tous les mots existants
avec 8 lettres c'est assez rapide
avec 9 lettres c'est prend ......
pour le coup j'ai réduit le tirage au sort
à 8 lettres
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
29 déc. 2011 à 23:58
ton code est bon pour trouver un mot seulement

Non.
Tu n'as pas testé le code
0
Utilisateur anonyme
30 déc. 2011 à 01:16
Sinon j'avais fait ceci pour chercher tous les mots possibles dans un dico en partant d'un mélange de lettre (je te l'ai simplifié).
La liste 'resultats' est triée par longueur de mots.
Option Strict On
Public Class Form1
    Dim Mots As New List(Of String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'chargement fichier de mots
        Using r As New IO.StreamReader("mots.txt")
            Mots.AddRange(r.ReadToEnd.Split(New String() {Environment.NewLine}, StringSplitOptions.None))
        End Using
        Dim resultats As List(Of String) = ChercherMots("SONPISOSAND")
        '.... resultats ici
    End Sub

    Public Function ChercherMots(ByVal Melange As String) As List(Of String)
        Dim motsf As New List(Of String)
        For Each mot As String In Mots
            Dim masque As String = mot
            For Each lettre As String In Melange
                If masque.Contains(lettre) Then
                    masque = Replace(masque, lettre, "", 1, 1)
                End If
            Next
            If masque.Length = 0 Then motsf.Add(mot)
        Next
        'tri par longeur de mot
        motsf.Sort(New clsCompare)
        Return motsf
    End Function

    Class clsCompare
        Implements IComparer(Of String)

        Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
            If x.Length > y.Length Then
                Return -1
            ElseIf x.Length = y.Length Then
                Return 0
            Else
                Return 1
            End If
        End Function
    End Class
End Class
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
30 déc. 2011 à 11:41
Bonjour

J'ai trouvé la bonne méthode binarysearch
rapide

Private Function FindWordInList(ByVal index As Integer, ByVal permutation As String()) As List(Of String)
        Dim id As Integer
        Dim listresult As New List(Of String)
        For Each item In permutation
            id = listdico(index).BinarySearch(item)
            If id >= 0 Then
                listresult.Add(item)
            End If
        Next
        Return listresult
    End Function
0
Utilisateur anonyme
30 déc. 2011 à 23:03
Bonsoir ShayW,

Je n'ai pas bien saisi ton sytème de 'permutations'. Je suis curieux de voir ta future source
Bonne continuation.
0
Rejoignez-nous