| Recherche rapide d'un élément de tableau. | |
|
|
Auteur | Message |
---|
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 18:12 | |
| Bonjour.
Connaissez-vous une méthode rapide afin de savoir si un élément existe dans un tableau de valeurs.
En java, il existe une méthode qui ressemble à 'instr' donnant directement le résultat.
En panoramic, évidemment, je ne cherche pas à lire chacun des éléments du tableau, puis le comparer à la valeur cherchée.
Merci de votre aide. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 18:15 | |
| Pour le moment, nous n'avons pas cela en Panoramic. | |
|
| |
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 18:24 | |
| Bonjour Klaus.
Merci de la réponse.
Je vais donc procéder autrement.
Pendant que j'y suis, connais-tu la longueur maximum d'une chaîne de caractères en panoramic ? | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 18:39 | |
| Bonjour Pan59, Pour répondre simplement : pour la longueur maxi d'une chaine, le plus simple c'est de faire un petit programme : une boucle qui rajoute un caractère au fur et à mesure et tu modifie le caption de la fenêtre pour voir l’incrémentation... je ne connais pas la réponse... Sinon pour la recherche dans une liste, tu peux classer tes éléments avec SORT_ON N puis faire une recherche par dichotomie... Sinon, on en a déjà parlé sur le forum. Sous google tu tapes : - Code:
-
recherche dichotomie site:http://panoramic.1fr1.net comme ça google fait la recherche sur la totalité du forum et rien d'autre... | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 18:48 | |
| Je pense que c'est limité à 2 puissance 31 - 1 caractères, peut-être 2 puissance 32 - 1 si la longueur est stockée en non-signée. En tout cas, c'est énorme. J'ai fait ce petit programme: - Code:
-
label err
dim i%
on_error_goto err for i%=1 to 1000000000 step 100000 caption 0,str$(i%) dim s$ s$ = string$(i%," ") free s$ next i%
message "Pas d'erreur" end
err: off_error_goto message "Erreur avec i%="+str$(i%) terminate et j'ai eu la patience de le laisser aller jusqu'à 15 millions de caractères - ça passe. En fait, en-dehors el la limite théorique, c'est la place en mémoire qu posera les limites. | |
|
| |
Invité Invité
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 19:00 | |
| Si le tableau ne change pas, tu fais une routine qui met dans une chaine, l'ensemble d'un tableau, avec un séparateur de champ: - Code:
-
dim tab$(1000),line%,a$ , a% ,list$ label cherche
' on rempli le tableau avec des polices de caractères pour simplifier dlist 1 :font_names_load 1 for a%=1 to count(1) tab$(a%)=item_read$(1,a%) :list$=list$+item_read$(1,a%)+"|" next a% edit 2 button 3:top 3,30:caption 3,"cherche":on_click 3,cherche end
cherche: a$=text$(2) if instr(list$,a$) > 0 then message "trouvé:" + a$:else:message "inconnu dans la liste" return Si tu veux à partir de là connaitre la position, alors tu explores la liste, ou au départ, tu fais une autre chaine avec un séparateur par élément, et un deuxième entre pour extraire la position. Je n'ai pas le temps de le faire maintenant, mais cela pourrait ressembler à cela: "10,1|15,2|30,3|". i,2,3 étant l'incrémentation de a% Tu fais cette chaine en même temps que list$, avec la longueur de list$ à chaque fois. Si tu ne comprends pas et que personne n'intervient d'ici ce soir, je regarderais. Je me demande si je ne suis pas hors sujet en voyant les réponses entre-temps. J'avais déjà essayé de remplir un edit pareil en incrémentant, et je sais qu'on peux en mettre des quantités. J'avais pas trouvé la limite. A plus! |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 19:08 | |
| Tu n'es pas hors sujet, Cosmos70. Tu as répondu à une des deux questions de Pan59. Et ton astuce est intéressante: constituer une seule chaîne avec l'ensemble des éléments, séparés par un séparateur à choisir, et en plus tu ajoutes le numéro de chaque élément de sorte qu'après un INSTR, on peut trouver facilement le numéro qui sert d'indexe. Astucieux. Pour ma part, je suggère une légère variante de la proposition de Cosmos70. On constitue toujours une seule chaîne de caractères avec tous les éléments, séparés par un séparateur quelconque. Puis, on utilise une des routines de KGF.dll qui trouve très rapidement l'indexe d'un élément dans une telle chaîne. Extrait de la doc: - Code:
-
ItemIndexInString
Cette fonction cherche une chaîne dans une autre. La chaîne dans laquelle on cherche, est une liste de chaînes dans laquelle les sous-chaînes sont séparées par un caractère de séparation. La fonction retournera non pas la position, mais l'indice de la sous-chaine trouvée. L'appel a le format suivant:
res% = dll_call3("ItemIndexInString",adr(string$),adr(sep$),adr(item$))
string$ liste de chaînes dans laquelle il faut chercher
sep$ tcaractère de séparation
item$ chaîne de caractères à chercher dans string$
res% indice de item$ dans string$ si trouvé, et zéro sinon
Exemple: dim res%,sting$,item$,sep$ item$ = "Mai" sep$ = "," string$ = "Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre" res% = dll_call3("ItemIndexInString",adr(string$),adr(sep$),adr(item$)) if res%=0 message "le mois est invalide" else vous avez saisi de mois numéro "+str$(res%) end_if C'est écrit en Delphi et est très rapide. | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 19:27 | |
| Voici un code de recherche par dichotomie : il est particulièrement rapide. La recherche doit se faire sur un tableau TRIE - Code:
-
' ***************************************************************************** ' RECHERCHE DICHOTOMIQUE DANS UN TABLEAU TRIE
' DICHO.BAS
' Exemple d'utilisation ' La recherche doit se faire sur un tableau trié ' Le tableau peut contenir n'importe quel type de données : entier, réel ,string
' La dichotomie consiste à couper le tableau en 2 et comparer la valeur du milieu ' avec celle à rechercher. ' si la valeur du milieu est supérieure à celle recherchée,on recherche alors ' dans la premiere moitié sinon dans la seconde.
' Cet algorithme est très rapide : sur un très grand tableau, il est très efficasse
DIM T(1000), i dim premier,milieu,dernier,recherche, trouve, pos ' création d'un tableau d'entiers contenant les valeurs de 1 à 1000 for i = 1 to 1000 : t(i) = i : next i recherche = 999 : ' valeur à rechercher ' recherche = 1110 trouve = 0 : premier = 1 : dernier = 1000 while (premier <= dernier) and trouve = 0 milieu = int((premier + dernier)/2) if t(milieu) = recherche trouve = 1 : pos = milieu else if t(milieu) > recherche dernier = milieu else premier = milieu +1 end_if end_if end_while if trouve = 0 message "cette valeur n'appartient pas à la liste" else message "cette valeur appartient à la liste " + chr$(10)+chr$(13)+ "elle est en position: " +str$(pos) end_if
| |
|
| |
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 20:31 | |
| Bonsoir à tous.
Je vous remercie bien sincèrement de votre aide.
Je conserve donc les 2 méthodes.
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 22:30 | |
| J'ai ajouté une fonction dans KGF.dll qui fait cette recherche. Format: - Code:
-
res% = dll_call3("SearchListBox",hnd%,mode%,adr(crit$)) Du coup, KGF.dll passe à la version V1.61 du 20/09/2012Cette fonction recherche un élément dans un objet LIST identifié par son handle. Si mode%=0, la chaîne de caractères crit$ doit correspondre au début de l'élément. Si mode%=1, la chaîne de caractères doit correspondre à l'élément entier. La recherche est insensible à la casse. Dans la documentation, il y a un programme exemple détaillé. Il faut télécharger: DLLs\KGF.dll (la DLL) DLLs\Documentation CHM\KGF.chm ou KGF.pdf ou KGF.doc (la doc) C'est écrit en Delphi et utilise un seul appel API - c'est très rapide. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Recherche rapide d'un élément de tableau. Jeu 20 Sep 2012 - 22:59 | |
| @pan59: Peut tu nous donner une idée de la quantité d’élément que tu veux contrôler ? Pour ton projet, je suppose que tu dois avoir une masse considérable de données à trier... dans un cas comme celui-là, il vaut mieux abandonner l'idée de tout faire en RAM... | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 0:28 | |
| Par contre un tri par arbre pourrait dans ce cas être très intéressant (Voir arbres binaires de Nardo)
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 0:30 | |
| Pourquoi trier ? Tu as vu la fonction que j'ai mise à disposition ? Simple, ultra-rapide - pourquoi chercher midi à 14 heures ? | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 0:51 | |
| Ce n'est pas faux j'avoue Klaus Plus simple de trouver directement | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 0:57 | |
| | |
|
| |
Invité Invité
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 2:11 | |
| |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 6:58 | |
| Je pensais à une sorte de base de données sur disque, avec index calculé... Je pensais à ce que Klaus avait écrit sur la gestion de fichier de type ISAM...
| |
|
| |
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 9:46 | |
| Bonjour.
Je viens juste de retrouver la dll suivante, dans kgf.dll, qui me convient parfaitement.
res% = dll_call3("ItemIndexInString",adr(string$),adr(sep$),adr(item$))
Cette fonction cherche une chaîne dans une autre. La chaîne dans laquelle on cherche, est une liste de chaînes dans laquelle les sous-chaînes sont séparées par un caractère de séparation. La fonction retournera non pas la position, mais l'indice de la sous-chaîne trouvée. | |
|
| |
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Recherche rapide d'un élément de tableau. Ven 21 Sep 2012 - 14:18 | |
| Bonjour.
A l'attention de Klaus.
J'ai réalisé le petit programme qui suit. Mais le résultat donné n'est pas correct. Il affiche 458, alors que le mot à trouver se trouve à l'index 23.874 dans le dictionnaire !!
Merci de ton aide. - Code:
-
dim a$, chaine$, mot$, sep$ dim y%
dll_on "kgf.dll"
file_open_read 1,"c:\perso\langues\traducteur\dictionnaires\dico_espagnol.dat"
' Lignes de titre. file_readln 1,a$ file_readln 1,a$
while file_eof(1)<>1
' maison;fs;casa;fs; file_readln 1,a$ if a$="FIN" then exit_while chaine$=chaine$+left$(a$,instr(a$,";")-1)+"#" end_while
sep$ = "#" mot$="maison" y% = dll_call3("ItemIndexInString",adr(chaine$),adr(sep$),adr(mot$)) message str$(y%)
dll_off
file_close 1 | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Dim 23 Sep 2012 - 21:34 | |
| Et qu'est-ce qu'on trouve à la position 458 ? Je n'ai pas beaucoup d'éléments pour essayer de reproduire le problème. | |
|
| |
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Recherche rapide d'un élément de tableau. Dim 23 Sep 2012 - 21:44 | |
| Bonsoir Klaus.
On trouve la ligne suivante:
à voix basse;locut;en voz baja;locut;
Il s'agit d'un fichier trié. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Recherche rapide d'un élément de tableau. Dim 23 Sep 2012 - 22:15 | |
| Le problème vient des espaces. Une chaîne individuelle dans la liste ne peur contenir un espace car l'espace est un délimiteur d'office et implicite. Je viens de le découvrir, et je vais mettre la doc à jour. Mais il y a un moyen de le contourner: remplace les espaces par autre chose. J'ai essayé "@" et ça marche. Regarce ce programme: - Code:
-
dim a$, chaine$, mot$, sep$ dim y%
dll_on "kgf.dll"
chaine$ = "#" for y%=1 to 853 chaine$ = chaine$ + str$(y%) + "#" next y% chaine$ = chaine$ + "à@voix@basse;locut;en@voz@baja;locut;" for y%=855 to 23873 chaine$ = chaine$ + str$(y%) + "#" next y% chaine$ = chaine$ + "maison" + "#" + "xxx" + "#" + "yyy" + "#"
sep$ = "#" mot$="maison" y% = dll_call3("ItemIndexInString",adr(chaine$),adr(sep$),adr(mot$)) message str$(y%)
dll_off
il affiche 23.873 ce qui est normal, car les indices sont comptés à partir de zéro. Un résultat de -1 signifie "non trouvé". | |
|
| |
Contenu sponsorisé
| Sujet: Re: Recherche rapide d'un élément de tableau. | |
| |
|
| |
| Recherche rapide d'un élément de tableau. | |
|