Recherche rapide dans une liste

Signaler
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
-
 Utilisateur anonyme -
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

8 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
51
ah il manque un mot
le problème cela prend un temps

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 ?

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))
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
51
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

ton code est bon pour trouver un mot seulement

Non.
Tu n'as pas testé le code

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
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
51
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

Bonsoir ShayW,

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