begin process at 2010 02 10 11:34:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > DICTIONNAIRE OPTIMISE

DICTIONNAIRE OPTIMISE


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Source .NET ( DotNet ) Classé sous :Dictionnaire, Listes Chainees, orthographe, correction orthographe, optimisation Niveau :Débutant Date de création :13/03/2008 Date de mise à jour :03/04/2008 20:34:14 Vu / téléchargé :6 073 / 360

Auteur : aokdiallo

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
/// <summary>
    /// Edité par Diallo Apha
    /// aokdiallo@hotmail.com
    /// Version du 13 Mars 2008
    ///
    /// Cette Classe est L'implementation economique en memoire et en performace d'un dictionnaire.
    /// En effet dans plusieurs applications telque les jeux de mots ou les editeurs de texte on a besoin d'un dictionnaire.
    ///
    /// A -> Une premiere approche facile :
    ///
    /// est de stocker dans un fichier tous les mots du dictionnaire.
    /// Les problemes de cette approche sont :
    /// 1 ->
    /// la taille du fichier sera enorme
    /// 2 ->
    /// la recherche d'un mot est tres couteuse car à chaque fois il faut ouvrir le fichier et le parcourir en comparant à chaque fois le mot lut
    /// avec le mot cherché.
    ///
    /// B ->
    /// Approche utiliséé dans ce projet :
    ///
    /// le dictionnaire est une liste de noeuds.
    /// chaque noeud represente une lettre et possede un lien ver d'autres noeuds
    /// je m'explique :
    /// par exemple le mot "AN" correspond au noeud('A') qui pointe vers le noeud ('N')qui à son tour pointe vers le noeud('\0')
    /// '\0' representant le caractere de fin de mot.
    /// là ou ça devient interessant c'est quand par exemple on veut ajouter les mots "ANE" et "ANES" dans le dico :
    ///
    /// dans le cas de la premiere approche on aurait simplement ajouté ANE et ANES dans le fichier ce qui fait pour "AN" et "ANE" et "ANES" 9 caracteres.
    ///
    /// dans la deuxieme approche on a deja le mot "AN" dans le dico donc il suffit de faire pointer le noeud (N) vers un nouveau noeud(E) puis
    /// faire pointer le noeud (E) vers un nouveau noeud(\0) pour ANE.
    /// ensuite
    /// faire pointer le noeud (E) vers un nouveau noeud(S)
    /// puis
    /// faire pointer le noeud (S) vers un nouveau noeud(\0) pour ANES.
    /// au final on a  que 7 noeuds.
    /// Voire la figure ci dessous :
    ///                                                 A
    ///                                                 |
    ///                                             \0<-N->E->\0
    ///                                                    |
    ///                                                    S->\0
    /// mais le plus interessant à remarquer est que :
    /// pour passer de An à ANE puis ANES on a rajouté 7 caracteres avec la premiere approche alors
    /// qu'avec la deuxieme on n'en n'a rajouté que 4
    /// on voit donc que le fait de reutiliser les lettres deja presentes nous fait enormement gagner en place memoire.
    ///
    /// Ensuite pour verifier l'existance d'un mot avec la deuxieme approche c'est tres rapide
    /// car on sais facilement trouver le noeud de la premiere lettre
    /// du mot cherché.
    /// à partir de là il suffit de tester les noeuds suivants en comparant les lettres avec celles du mot.
    ///
    /// </summary>


 Conclusion

s'il il existe  d'autres façons plus efficaces d'implementer un dictionnaire
Je suis preneur.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

13 mars 2008 06:13:11 :
petite faute de frappe lol
13 mars 2008 06:19:15 :
la figure representatnt les liaisons entre noeuds est un peu decalée sur le site apparemment ça ne viens pas de moi
13 mars 2008 20:23:28 :
J'ai maintenant séparé le projet LibDico du projet de test. Histoire de montrer la reutilisabillité de la classe LibDico dans n'importe quelle application sous forme de dll.

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) DIJKSTRA EN PRATIQUE
Source avec Zip Source avec une capture Source .NET (Dotnet) SUDOKU
Source avec Zip Source avec une capture Source .NET (Dotnet) JEU DU PENDU
Source avec Zip Source avec une capture Source .NET (Dotnet) OTHELLO
Source avec Zip Source avec une capture Source .NET (Dotnet) EDITEUR DE TEXTE AVANCÉ

 Sources de la même categorie

Source avec une capture TOOLTIP TEXT POUR LA LISTE DÉROULANTE D'UN COMBOBOX par whismeril
Source avec Zip Source avec une capture Source .NET (Dotnet) LOGIN (XML) par DanMor498
Source .NET (Dotnet) WEBTESTPLUGIN - IGNORER DES URLS LORS D'UN TEST WEB VISUAL S... par jesusonline
Source avec Zip Source avec une capture Source .NET (Dotnet) EXERCICE DE CALCUL MENTAL par Sat7121
Source avec Zip Source avec une capture Source .NET (Dotnet) TRADUCTEUR ALGO VISUAL BASIC .NET/C# par rhonin33

 Sources en rapport avec celle ci

Source .NET (Dotnet) WEBSERVICES + AJAX = UNE BONNE MÉTHODE POUR BANIR L'AUTOPOST... par driver
Source avec Zip Source avec une capture Source .NET (Dotnet) COMPTE EST BON par nicoscent
Source avec Zip Source .NET (Dotnet) HANOI ET HANOIALL SOLUTION LA PLUS COURTE par nicoscent

Commentaires et avis

Commentaire de tmcuh le 13/03/2008 10:14:16 10/10

Code très très intéressant. Bien commenté, sauf qu'il ne s'adresse pas aux débutant mais aux initiés.
Une seule question : tu permet de renvoyé la "mémoire" utilisé par la ressource, mais ça n'exprime que la quantité, pas la place "effective". Car tu met en avant le fait que ton processus soit moins gourmand en ressource mémoire, faut-il encore le prouver :)

Amicalement,
Tmcuh

Commentaire de tmcuh le 13/03/2008 10:23:02

Je viens de tester l'occupation mémoire, tu divise par 2 la taille de ton dico... impressionnant :)

Commentaire de aokdiallo le 13/03/2008 16:23:58

Salut TMUCH et merci pour le test.

Commentaire de Warny le 14/03/2008 07:36:06

Y a pas que la taille comme avantage...
Quand tu rajoutes un mot dans le dico, il est forcement classé par ordre alphabétique. Et la complexité maximum du classement est égale au nombre de lettre du mot multiplié par le nombre de lettres dans l'alphabet.

Commentaire de jimleouf le 17/03/2008 23:21:19 8/10

Bonjour AokDiallo,

ton idée du dictionnaire inspirée des graphes est très bonnes, mais le principal avantage d'un dictionnaire est l'accès en temps constant O(1), alors que la recherche dans ton cas sera en O(n) avec n la taille d'un mot.

Amicalement

Commentaire de aokdiallo le 18/03/2008 01:52:37

Salut Jimleouf
en fait le probleme que je me suis posé c'est de trouver un compromis entre la taille en memoire du dictionnaire et le temps d'acces.
Je suppose que pour l'acces en O(1) on aurais tous simplement pu recopier tous les mots du dictionnaire dans un Dictionary avec comme key le même mot ce qui serait enorme en taille memoire mais efficace en temps d'acces.
Mais bon si tu as une meilleure implementation (taille + temps d'acces )à me proposer ce serait avec plaisir que je l'etudierai.
Amicalement.

Commentaire de Warny le 18/03/2008 08:18:59

Pour le dico, le temps d'accès n'est pas O(1), c'est juste que tu ne vois pas la plomberie.
Si tu utilises un hashtable qui est le plus rapide, il faut quand même calculer la position à partir des éléments qui le constitue, ce qui donne une complexité en... O(n) avec n la taille du mot.
La méthode de oakdiallo est bien la plus efficace possible.

Commentaire de Dargos le 19/03/2008 19:10:10

simple et efficace, j'aime bien :)
par contre, pour etre pointilleux, je dirais que la methode "ajouter_mot" a un probleme :
cette methode est recursive, et elle appelle à chaque fois la methode "existe_mot" recursive aussi. en modifiant de tres peu et en utilisant de preference la methode "est_dans_liste", ca serait surement plus efficace.
ensuite, je ne suis pas tres concerné pas les mots croisés, mais j'utilise souvent des dictionnary pour faire des traductions des textes de l'application. vu ce que tu viens de faire, j'imagine que tu vas proposer une bonne idée ;)

Commentaire de aokdiallo le 20/03/2008 04:37:53

salut DARGOS c'est vrai moi aussi je me disais c'est pas joli joli pour ajouter_mot mais je voulais juste  prevenir l'utilisateur de l'existance d'un mot quand il essaye de l'ajouter une nouvelle fois.
mais bon le fait de supprimer le test existe_mot corrige cela (c'est juste qu'on aura plus d'avertissement en ajoutant un mot deja existant.)

Commentaire de aokdiallo le 20/03/2008 04:41:48

DARGOS tu peux me detailler un peu plus ce que tu souhaite faire avec les textes des applications ?

Amicalement

Commentaire de tmcuh le 20/03/2008 12:59:35

Dargos parle d'une gestion multi-langue, c'est à dire qu'on charge à tout moment des données (via xml ou autre) et par la suite on fera par exemple lors d'une question utilisateur   MessageBox.Show(mondictionnaireFR.getMessage("LA_CLE")) ... Avec quelques lignes dans le dictionnaire le besoin ne se fait pas sentir de devoir "optimiser", mais pour les grosses applications commercial, le besoin risque de se faire sentir. C'est donc juste une adaptation de ce que tu as déjà codé, mais pour une gestion multi-langue ta technique est surrement la meilleur.

Tmcuh

Commentaire de Dargos le 20/03/2008 21:40:19

exactement tmcuh.
en fait, quand on parle de dictionaire, c'est surtout avoir des paires clef/valeur (sinon on va plutot parler de liste).
donc à priori, il faudrait juste ajouter une valeur de type string sur les noeuds '\0'.
quand on va ajouter un mot, on l'ajoutera avec sa valeur : la methode ajouter_mot prendra donc 2 strings en parametre.
ensuite, vu de l'exterieur, on ne devrait pas avoir acces à la mecanique interne de la classe, mais n'avoir que 3 ou 4 methodes publiques comme ajouter, enlever, vider, charger_depuis_fichier. en particulier, on de devrait pas accéder à cette List<Noeud> particulierement dans la signature des methodes.
ensuite, dans le dictionaire, on va le plus souvent demander la valeur d'un mot, et une seule fois loader le dico complet. ce qui serait idéal serait d'avoir une public method qui renvoie une string valeur à partir d'une string clef.pour finir,
pour ca, il va falloir trouver quelle forme donner au fichier, vu qu'on rajoute des valeurs aux clefs : un xml, autres ?
Tmcuh, je suis bien d'accord avec toi pour dire qu'en vitesse acces, c'est surement la methode la plus efficace !
sinon, je vais encore coser un peu la chose :
peux tu predire ce qu'il va se passer si 2 threads ajoutent le meme mot au meme moment ?
si tu comptes laisser la methode ajouter_mot publique, il va surement falloir penser à la synchronisation des threads ! je te laisse y reflechir, mais tu peux te renseigner sur la classe ReaderWriterLock ;)
G33kemenT, Dargos

Commentaire de qwerty0060 le 31/07/2009 13:09:11

Hello, j'ai implemente ta class en action script pour un projet personnel, et je trouve que ta methode ajouter_mot peut etre aussi optimise:

public function addWord(w:String):void {
var node:Node = _root;
var lgt:int = w.length;
for(var i:int = 0; i<lgt; i++){
var sub_node:Node = node.next[w.charAt(i)];
if(!sub_node) sub_node = new Node(w.charAt(i));
node = sub_node;
}
sub_node = new Node('\0');
}

en fait l'algorithme est simple:
on cherche le si caractere existe dans le noeud suivant, si celui-ci est nul (cf. if(!sub_node)) on creer un nouveau noeud avec comme lettre le caractere, on reitere, jusqu'a la fin du mot, ou on ajoute '\0'

Commentaire de qwerty0060 le 31/07/2009 13:11:52

j'oubliais de preciser que si le mot existait deja alors on reiterais simplement sans rien faire, j'arrive avec cette methode a ajouter 250.000 mots en 2,6sec ce qui est puissant avec le language de flash qui n'est pas optimize!!

Commentaire de tresorunikin13 le 23/08/2009 05:24:45

heu bien bon,merci à vs. je trouve ce que je fais ici...
Voilà je voudrais un peu savoir comment pouvez vous faire en sorte que les mots soient classés, genre adjectif ou verbe ou nom. C'est à dire que je suis en train de réaliser un dictionnaire pareille mais je permets à l'utilisateur de préciser si le nouveau mot qu'il insère est un adjectif ou un verbe, un nom ect... comment aborderiez-vous ceci? un peu tard mais je vous crois connecté à ce sujet!

Commentaire de Dargos le 29/08/2009 12:48:54

je pense qu'il faudrait déja créer une enum : public enum eWordType { Adjective, Verb, ... }
ensuite créer une propriété dans la classe Noeud : public eWordTpe? NodeType;
nullable pour que les noeud intermédiaires nepossedent pas de valeur mais que les noeuds finaux la possedent.
de plus il faudrait modifier les methodes d'insertion de mots pour qu'ils prennent en compte cette nouvelle valeur.
et pourquoi pas accélérer la recherche avec cette valeur...
d'ailleurs, les noeuds intermediaires devraient peutetre avoir une valeur combinée de l'enum contenant l'enssemble des sous-valeurs pour accélérer la recherche. mais à ce moment la, ca ralentirait l'insertion et modification. donc au choix ;)

Commentaire de tresorunikin13 le 29/08/2009 16:47:48

oui:! merci...
Mais estt-ce je me déroute? je préfère que si l'utilisateur insère un mot, dès qu'il l'indique verbe, qu'il puisse directement insérer les mots relatifs aux conjuguaisons à tous les temps possibles, de à ce verbe. Exemple, si l'user insère le verbe  'manger', au moment où il est verbe, mon programme insère automatiquement les mots mangeais, mangerai etc grace aux méthodes appropriées. mais je me demande si en utilisant des classes adjectifs, adverbes, cela ralentirai l'application.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

optimisation bases de données [ par happyfish ] Je fait une appli ki transfere les données d'une base vers une autre. Je voulais savoir quel est le meilleur moyen pour les insertions/updates de la n systeme non lineaire+optimisation [ par correcte ] Bonjour,Je cherche un programme ecrit en c++ qui permet de resoudre un systeme d'equations non lineaire.Je cherche egalement un programme qui fait le dictionnaire [ par dibouched ] est ce qu'il ya quelqu'un qui peut me dire comment&nbsp; je peux avec c# obtenir l'ensemble des mots descendants d'un mot donn&#233;es c-a-d existe -i Dictionnaire [ par Bidou ] Bonjour !Je me demandais s'il existait des dictionnaires gratuit &#224; t&#233;l&#233;charger (du genre base de donn&#233;e j'imagine?), par exemple p correcteur d'orthographe dans un richtextbox ? [ par lscorpio1 ] comment peut on utilis&#233; un correcteur d'orthographe dans un richtextbox en c#? Reflection - Optimisation [ par bucherb ] Bonjour!Je voudrait savoir si il y a une méthode pour optimiser du code de reflection.Par exemple TextBox txt = new TextBox(); est plus rapide queActi Problème d'accès mémoire avec LPSOLVE [ par bess1982 ] Bonjour à tous,Je travaille actuellement sur un projet utilisant le solveur linéaire Lpsolve (moteur permettant de faire une optimisation).Pour faire Optimisation génétique pour .NET [ par Servlax ] Bonjour, J'aimerais savoir s'il existe des équivalents de JGAP pour Java en .NET, afin d'effectuer des "optimisations génétiques".De même, j'aimerais [DEPLACE] Optimisation du code [ par doudouastam ] Bonjour à tous,Voilà j'ai réalisé une application (pas bien méchante , je débute) mélangeant asp/sqlserver/c#. Essentiellement des connexions à une BD Instanciation d'un dictionnaire [ par t00f ] Bonjour,J'aimerais savoir comment instancier un dictionnaire avec des valeurs par défaut.En fait, j'ai une classe statique,et j'aimerais instancier mo


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,342 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales