|
|
|
|
Bonjour, j'ai un petit problème en langage C... Je cherche à faire une recherche dans un fichier contenant un dictionnaire, c'et pour un programme de scrabble... Dnc j'ai besoin de faire une recherche dichotomique dans mon fichier pour savoir si le mot que j'ai a vérifier existe.
Le problème est que je ne sais pas vraiment comment utiliser la recherche dichotomique dans un fichier, puisque ça ne fonctionne pas de la meme manierre que dans un tableau.
Si vous savez comment faire et que vous avez du temps à me consacrer, merci d'avance!!!
Salut,
|
Oui, désolée, j'ai oublié de préciser.
|
Je vais peut etre vous paraître stupide, mais qu'est-ce que tu entends par passe le en ram? je comprends ce que tu veux dire, mais je ne vois pas du tout comment faire ça.
|
J'ai fait un petit prog en basic et voici les resultats:
analyse du dico en cours... Le programme a trouvé 369085 Mots dans le dico. chargement en cours 100% creation des phrases... creation de la phrase 739 / 739 quel mot voulez-vous chercher ?MAISON ce mot est bien dans le dico temps de recherche : 141 ms quel mot voulez-vous chercher ?ZYGOMATIQUE ce mot est bien dans le dico temps de recherche : 281 ms quel mot voulez-vous chercher ?AVION ce mot est bien dans le dico temps de recherche : 0 ms quel mot voulez-vous chercher ?MAISON ce mot est bien dans le dico temps de recherche : 141 ms quel mot voulez-vous chercher ?LOIRE ce mot est bien dans le dico temps de recherche : 16 ms quel mot voulez-vous chercher ? j'ai un dico de 370 000 mots je le charge en memoire dans un tableau puis je cree des phrases de 500 mots chacunes enfin je teste la presence du mot que je cherche dans l'une de ces phrases. si tu veux la source la voici:
print "analyse du dico en cours..."
open "dico.txt" for input as #dico
while eof(#dico)=0
scan
line input #dico, mot$
mot$=upper$(word$(mot$,1))
if mot$=mot2$ then goto [reload.cnn]
nb=nb+1
if int(nb/5000)=nb/5000 then locate 1,2:print nb
mot2$=mot$
[reload.cnn]
wend
close #dico
locate 1,2:print "Le programme a trouvé ";nb;" Mots dans le dico."
print "chargement en cours"
nbt=nb
dim dico$(nbt)
nb=0
open "dico.txt" for input as #dico
while eof(#dico)=0
scan
line input #dico, mot$
mot$=upper$(word$(mot$,1))
if mot$=mot2$ then goto [reload.cnt]
nb=nb+1
mot2$=mot$
if int(nb*100/nbt)=nb*100/nbt then locate 1,4:print using("###",(nb*100/nbt));"%"
dico$(nb)=mot$
[reload.cnt]
wend
close #dico
print "creation des phrases..."
nbph=int(nbt/500)+1
'print nbph
dim ph$(nbph)
trace 2
for i=1 to nbt
nump=int(i/500)+1
if nump<>nump2 then
nump2=nump
locate 1,6:print "creation de la phrase ";nump;" / ";nbph
end if
ph$(nump)=ph$(nump)+" "+dico$(i)
next i
[suite]
print "quel mot voulez-vous chercher"
input r$
r$=" "+upper$(r$)+" "
t=time$("ms")
for i=1 to nbph
if instr(ph$(i),r$) then okmot=1:exit for
next i
t2=time$("ms")
if okmot=1 then
print "ce mot est bien dans le dico"
else
print "ce mot n'est pas dans le dico"
end if
print "temps de recherche : ";(t2-t);" ms"
goto [suite]
wait
c'est ecrit en Liberty BASIC, donc en C tu devrais exploser les temps, tout le monde sait que le basic, c'est lent ! (lol) @++ |
Y a pas moyen de créer une structure spéciale, genre un arbre binaire de recherche (basé sur le dichotomique, d'ailleurs), le stocker en mémoire au démarrage et faire ensuite des accès dessus pour la recherche? en C, ça devrait se programmer assez bien, et les structures ABR sont dans les plus rapides pour faire une recherche...
|
J'ai croisé un jour déjà lointain, l'auteur d'un site avec jeu en ligne, qui m'a dit que son dictionnaire, sans doute en Java, occupait moins de 500ko.
|
En fait, j'avais aussi trouvé une structure bizarre permettant de mettre l'ODS4 de 4Mo en 400Ko, mais c un algo assez compliqué... Il faut aller voir sur ce site : http://www.nongnu.org/eliot/ |