1

Je suis confrontré à un problème de vitesse, en effet je dois parcourir une liste de chaînes de caractères et trouver une correspondance très rapidement. J'hésite entre implanter un arbre binaire de recherche ou une table de hachages. En fait je ne sais pas vraiment les avantages et inconvénients de ses 2 méthodes tant en consommation mémoire et surtout en temps de recherche dans les pires conditions.
Voilà si vous pouvez m'éclairer sur ce sujet ça serait vraiment sympa, merci d'avance. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

2

mais tu peux pas chercher sur le net des comparatifs ou reflechir avec ton cerveau bordel de merde ?
avatar
納 豆パワー!
I becamed a natto!!!1!one!

3

Peut-être qu'un trac serait plus adapté. non ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

peut-être qu'en testant toi même tu te ferais une meilleure idée, non ?
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

5

C'est vraiment très critique ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

6

Hum vous me les cassez grave là franchement j'en est ras le cul des réponses cherche sur le net ou réalise le truc!

Pour gouverne j'ai mon arbre bianire en ce moment avec mes fonctions j'ai réalisé il y a peu de temps une table de hachage mais vraiment simpliste sans malheuresement après un temps de recherche trouvé des infos concrètes. Alors épargniez moi votre sauce genre je me fous de votre gueule et je ne fais que poser des questions à la con en vous demandant de macher mon travail, vous êtes débile ou quoi?

En fait j'ai un programme qui à besoin de rechercher des mots stockés dans un dictionnaire, sans ma table de hachage simpliste il tourne à 1ko/s avec table, environ 100 ko/s mais ça ne me suffit pas, le traitement sur des fichiers de taille considérable supérieur à 20 Mo est horriblement lente, de plus il faut que j'exploite la méthode Burrows & Wheeler qui demande un algorithme de trie rapide or arbre de recherche avec une dérivée. Mais le problème est que malgré les recherches effectués je le répété je n'arrive pas à savoir les complexités des algos type arbre binaire de recherche (ARB) ou tables de hachages ou encore la quantité de mémoire requise.

[EDIT] Content monsieur Microbug, toujours HS.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

7

Bah alors réfléchis, c'est d'autant plus simple si tu as déjà les algos tongue

(edit : Kevin est là, donc il va sans doute répondre à ta question, mais je pense pas que ce soit très formateur sad)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

./6 > sick, l'orthographe... sad

9

Tu comprend vraiment rien toi. roll
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

10

Si tu n'arrives pas à déterminer quelle quantité de mémoire bouffe ton programme, demande-nous de t'aider sur un point précis plutôt que de nous demander de balancer le résultat final, ce qui ne t'apprendra rien du tout...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

11

Arbre binaire de recherche -> lookup en O(longueur de la chaîne).
Table de hachage -> lookup en (temps de calcul du hash)+O(1+(probabilité de collision))

Ce sont des chaînes d'octets ou de bits? Parce que pour des chaînes d'octets, tu peux aussi essayer les arbres d'ordre 256 (l'ordre est le nombre de nœuds fils, par exemple arbre binaire == arbre d'ordre 2), ça te fera en théorie un lookup 8 fois plus rapide.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

Mais tu vois ça où que je te demande de me balancer le résultat final, je veux pas d'algos???

Je vais détaillez encore plus loin:

J'exploite l'algorithme de compression LZW, celui-ci demande la création d'un dictionnaire, pour mon cas ce dictionnaire est de taille variable mais par défaut de 8192 éléments plus précisément 8192-259=7933 éléments réellement utilisés.

Chaque éléments que j'appel définitions peuvent contenir une chaîne de caractères de taille maximal de 4096 caractères.

L'algorithme de compression demande la recherche d'une chaîne de caractère nommé tampon dans le dictionnaire et donc si la recherche est réussie de renvoyer l'index où ce trouve la définition. Or le problème de cette algo de compression c'est qua lé recherche d'une définition dans le dictionnaire est très longue et demande une organisation des données pour effectuer la recherche plus rapidement.

J'ai donc décidé d'organiser mon dictionnaire en sommaires, chaque sommaire contient toutes les défintiions commençant par le même caractère cette méthode demande dans mon cas 8 Mo de mémoire avec un dico de 8192 éléments et n'augmente pas assez la vitesse de compression je trouve.

Avant de développer la méthode avec tables de hachages je me demande si s'est réellement utile dans mon cas, vous allez encore me dire que je suis une faigniasse de ne pas la faire mais vous en ferez autant.
Donc je voudrais savoir les avantages entre un ABR et table(s) de hachage(s).
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

13

Pour la mémoire:
Arbre binaire de recherche -> environ O(n ln(n)), avec n le nombre de chaînes présentes
Arbre d'ordre 256 -> à peu près 4 fois la mémoire d'un arbre binaire ((256/2)/2log(256)==4)
Table de hachage -> (taille de la table de hachage) + (probabilité de collision)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

geogeo
: Mais tu vois ça où que je te demande de me balancer le résultat final, je veux pas d'algos???

Mais ce que je te donne est le résultat final! Tu as demandé la vitesse et la mémoire de tes algorithmes, les voilà!
J'ai donc décidé d'organiser mon dictionnaire en sommaires, chaque sommaire contient toutes les défintiions commençant par le même caractère cette méthode demande dans mon cas 8 Mo de mémoire avec un dico de 8192 éléments et n'augmente pas assez la vitesse de compression je trouve.

Alors fais la même chose avec le deuxième caractère etc. Cf. ma suggestion de l'arbre d'ordre 256. Et 8 MO?! C'est beaucoup trop! Remplace tes tableaux de chaînes par des tableaux de pointeurs vers des chaînes. Ou des tableaux d'indices (0..8191).

Tu ne penses quand-même pas qu'on va te faire ton TPE sur la compression pour toi...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

Merci pour les réponses j'avais pas vu, c'est ce que j'attendais.
Alors fais la même chose avec le deuxième caractère etc. Cf. ma suggestion de l'arbre d'ordre 256. Et 8 MO?! C'est beaucoup trop! Remplace tes tableaux de chaînes par des tableaux de pointeurs vers des chaînes. Ou des tableaux d'indices (0..8191).


OK OK même si mes tableaux sont des pointeurs.
Tu ne penses quand-même pas qu'on va te faire ton TPE sur la compression pour toi...


Lol tu as vu ça marqué où? J'ai pas demandé la lune ou encore un algo tout frais maché. roll

PS: J'aime bien les réponses du genre: "Ouai je vais pas faire ton boulot à ta place", alors que la question demande juste une réponse simple! sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

16

Bon, je vois comment tu trouves 8 MO (4*256*8192). Il y a moyen de consommer beaucoup moins de mémoire que ça! Tu n'as pas besoin de tous les 8192 pointeurs dans chaque sommaire, tu peux mettre un tableau compact d'indices short, plus un seul tableau de 8192 pointeurs pour le dictionnaire entier. Total: 48 KO.

De même, si tu veux faire un arbre d'ordre 256, pour économiser de la mémoire, n'alloue pas un tableau vide. S'il n'y a aucun mot qui commence par "x", n'alloue pas un tableau pour le nœud "xa...xz" (ça ne sert à rien s'il n'y a rien dans ce nœud), mais mets NULL dans la case qui correspond à "x".

Et tu peux même économiser encore plus de mémoire en ne mettant pas toutes les 256 entrées, mais juste une paire (lettre,entrée) pour chaque entrée non-vide. Le désavantage de cette dernière méthode est que le lookup devient plus lent parce que tu ne peux plus te contenter de regarder dans un tableau (O(1)), mais tu dois faire une recherche (O(ln(n)) si tu as maintenu tes entrées à l'état trié, O(n) sinon, avec n le nombre d'entrées non-vides de ton nœud).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

Merci, OK je vois. wink
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

18

Enfin de compte j'ai mélangé table de hachage avec arbre binaire voici comment je procéde:

J'ai une table de pointeurs pointant vers des ABRs il y a un total de 65536 pointeurs.
Un index de cette table correspond au 2 premiers caractères d'une chaîne.
Chaque ABR est construit suivant la taille de la chaîne.

Grâce à cette méthode je ne consomme seulement que 400 ko de mémoire environ pour un dico de 8192 éléments. Le gain en vitesse est assez important mais je trouve insuffisant.

Pour un ordre d'idée je met 2min à compresser un fichier de 48 mo dans les pires conditions c'est à dire un parcours presque complet des ABRs avec un dico de 8192, méthode LZW.

N'y a t-il pas d'autres moyens mieux adapter pour effectuer la recherche encore plus rapidement. Ou encore créer un ABRs suivant les caractères de la chaîne et non ses infos (taille, première lettre...)?

Vraiment désolé de poser cette question mais je ne vois réllement pas comment faire mieux et aucuns sites ne donnent des infos sur ce sujet.
Encore merci de votre aide.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.