TutorielsVous débutez ? C'est ici qu'on commence !
Mon compte
Recherche
Livre d'or
PublicitéVous devez être inscrit pour pouvoir poster des messages
| Page : 1 | |
| Pseudo | Commentaire |
|---|---|
| Page : 1 | |
Skydreamer
|
# Posté le 26/07/2006 à 09:45:07 - Ce membre a mis la note : 18 |
|
Groupe : Membres |
J'y avais déjà pensé mais j'ai jamais eu le temps de le mettre en pratique !
Je met 18 car le tuto est clair et précis. |
iPoulet
|
# Posté le 26/07/2006 à 19:55:47 - Ce membre n'a pas mis de note |
![]() Groupe : Membres |
On a besoin de plus de tutoriels intelligents comme celui-ci. Et en plus, il est bien foutu
|
guimers8
|
# Posté le 26/07/2006 à 23:10:25 - Ce membre a mis la note : 19 |
Cocoa/ObjC![]() Groupe : Membres |
Excelent tutoriel, intéréssant et utile, il en faudrait plus !
Les tutos sur l'algorithmyque sont vraiment géniaux !
Je met 19 ! ![]() Mac mini, Intel Core Duo à 1,83GHz avec 2 Go RAM. iPod Vidéo, 5.5G Noir, 30 Go. Au fait, pourquoi ne pas visiter… mon blog ? |
Greenflood
|
# Posté le 28/07/2006 à 02:28:16 - Ce membre n'a pas mis de note |
Got root ?![]() Groupe : Membres |
De l'algorithmique de base, mais ca ne fait jamais de mal pour les debutants .
|
Kaeihan
|
# Posté le 04/08/2006 à 22:28:33 - Ce membre a mis la note : 20 |
Eh j'embrasse pas une fille !![]() Groupe : Membres |
Très bon tuto, le sujet est bien expliqué
Merci et bravo ! |
Oli
|
# Posté le 05/08/2006 à 11:56:19 - Ce membre a mis la note : 18 |
C++, C++ fort que C!!!![]() Groupe : Membres |
Oui j'ai déjà pensé à un truc dans le genre mais moins bien
Je met 18 car le tuto est très clair. Oli- Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre - Linus Torvalds XHTML/CSS - PHP/SQL - JS - C++ - Batch - N++ - FF - C::B - The Gimp - Blender Mon blog, en exclusivité !!! ||| Tuto sur le Game Engine de Blender !!! |
coyotte49
|
# Posté le 05/08/2006 à 23:26:22 - Ce membre a mis la note : 17 |
|
Groupe : Membres |
Court, clair, bien foutu. 17/20
|
Benjitheone
|
# Posté le 06/08/2006 à 11:40:57 - Ce membre a mis la note : 18 |
![]() Groupe : Membres |
Je suis débutant, et c'est un bon plan à savoir pour plus tard. En plus le tuto est très clairement expliqué.
Merci beaucoup à toi. Je vous en foutrai moi des "ce n'est que deux ans..." |
asuka_soryu
|
# Posté le 08/08/2006 à 09:41:19 - Ce membre a mis la note : 18 |
|
Groupe : Membres |
Super clair.
Il y a moyen faire une petite optimisation cependant (vu que la dichotomie existe pour accélérer une recherche, autant aller jusqu'au bout) : dans la condition de la boucle (où tu regarde si la valeur actuelle est supérieure ou inférieure à la valeur recherchée, tu peut remplacer par : ifin = im - 1; (si la valeur actuelle est supérieure à celle recherchée) id = im + 1; (si la valeur actuelle est inférieure à celle recherchée) En effet la case du tableau d'indice [im] a déjà été testée, inutile de la retester. Le gain semble certes minime mais c'est toujours ça de pris (surtout que dans certain cas, les tableau sont bien supérieurs à 10 000 )
|
berli888
|
# Posté le 08/08/2006 à 16:50:59 - Ce membre n'a pas mis de note |
-> Supinfo Paris![]() Groupe : Membres |
Et si le nombre d'éléments dans le tableau est impair ? Oo
|
Severance
|
# Posté le 09/08/2006 à 11:10:50 - Ce membre n'a pas mis de note |
![]() Groupe : Membres |
pour asuka :
si je fais cela, ça va fausser le prochain tour de boucle sur l'opération : Code : C++ im = (id + ifin)/2;
non? pour berli : ca marche de la même façon si il y a un nombre impair (on fais des opérations sur des indices entiers donc l'ordi arrondi lui-même). Mes tutos sur le SDZ :
|
remram44
|
# Posté le 10/08/2006 à 22:28:28 - Ce membre a mis la note : 16 |
§ KCOMDL §![]() Groupe : Membres |
Code : C int tab[10] = {12, 14, 20, 25, 26, 28, 35, 99};
=> Code : C int tab[8] = {12, 14, 20, 25, 26, 28, 35, 99};
Sinon, une fonction récursive (je m'amuse bien) : Code : C #include <stdio.h>
int Recherche(unsigned char *tableau, int longueur, int valeur_cherchee) { fprintf(stderr, "Recherche(%p, %d, %d)\n", tableau, longueur, valeur_cherchee); /* S'il ne reste qu'un élément */ if(longueur == 0) return -1; if( (longueur == 1) && (tableau[0] == valeur_cherchee) ) return 0; int position = longueur/2; fprintf(stderr, "Comparaison avec %d\n", tableau[position]); /* Si cet élément est plus petit que la valeur cherchée */ if(tableau[position] < valeur_cherchee) { /* On appelle la fonction récursivement sur les éléments suivants */ position = Recherche(&tableau[position + 1], longueur - position - 1, valeur_cherchee) + position + 1; if(position==-1) return -1; else return position; } /* Si cet élément est plus grand que la valeur cherchée */ else if(tableau[longueur/2] > valeur_cherchee) /* On appelle la fonction récursivement sur les éléments précédants */ return Recherche(tableau, longueur/2, valeur_cherchee); else /* On a trouvé, retour */ return position; } int main() { const int ln = 9; unsigned char tab[9] = { 2, 5, 8, 12, 24, 42, 72, 81, 120 }; printf("%d\n", Recherche(tab, ln, 42)); /* Devrait afficher 5 */ getch(); return 0; } |
98111
|
# Posté le 13/08/2006 à 00:41:35 - Ce membre n'a pas mis de note |
Fier d'être un acolyte.![]() Groupe : Membres |
Comme précisé plus haut, une version récursive eut été plus lisible.
Mais c'est à mon humble avis une mauvaise idée que de montrer une implémentation d'un tri binaire en C++ sans rappeller que c'est juste pour le fun : les gens ont déjà beaucoup trop tendance à oublier la STL. Du coup, je me fait plaisir et je donne une version STL, extraite du site de SGI Code : C++ int main()
{ int A[] = { 1, 2, 3, 3, 3, 5, 8 }; const int N = sizeof(A) / sizeof(int); for (int i = 1; i <= 10; ++i) { cout << "Searching for " << i << ": " << (binary_search(A, A + N, i) ? "present" : "not present") << endl; } } Ce code a l'avantage de marcher sur tout les conteneurs, des tableaux aux listes chainées (un bsearch sur une liste chainée c'est idiot, mais on peut ).
(et en C c'est pareil sauf qu'il faut définir une fonction de comparaison puis utiliser bsearch de stdlib.h ) PS: Je t'ai pas noté parce que je sait que je suis un vieux bougon, mais tu devrais mentionner ces fonctions. Donnez vos disques durs à la Science : utilisez ShAkE, le défragmenteur qui défragmente ! Disponible ici en diffèrents coloris et sous GPL. Respect à RMS. |
Severance
|
# Posté le 14/08/2006 à 10:07:40 - Ce membre n'a pas mis de note |
![]() Groupe : Membres |
Citation : 98111 mais tu devrais mentionner ces fonctions.
Tu le fais si bien
Mais connaitre le principe que j'explique n'est pas inutile (si on l'enseigne en fac/iut/école c'est qu'il y a une raison ), il y a des cas ou utiliser une fonction toute faîte ne fonctionne pas, en plus le principe marche aussi dans d'autres languages...
Mes tutos sur le SDZ :
|
Dusty
|
# Posté le 03/09/2006 à 21:42:33 - Ce membre a mis la note : 18 |
|
Groupe : Membres |
Bravo pour ce tuto très intéréssant
J'ai juste une question concernant la rapidité d'exécution de ton algorithme. La partie que tu as présentées ici est extrêmement rapide pour les petits tableaux mais n'aurais-tu pas omis le faite que l'utilisation du "Tri par insertion" selon bluestorm est particulièrement lent (tuto aussi très intéréssant, en particulier la partie sur la complexité)? En effet, selon les calculs de bluestorm, pour trier un tableau long de environ 4000 entiers il faut une seconde sur un processeur de 3Ghz
Donc ma question est la suivante: j'ai un tableau NON-TRIE et je veux faire une recherche à l'intérieur quel recherche est la plus appropriée? Dichotomique ou séquentielle? |
Severance
|
# Posté le 03/09/2006 à 23:02:09 - Ce membre n'a pas mis de note |
![]() Groupe : Membres |
Je n'ai pas vraiment fait de calcul, et d'ailleurs il y aurait beaucoup de paramètres à prendre en compte (processeur, système d'exploitation...) mais pour ton cas, tout dépend de la taille de ton tableau. De sa taille en condition extrême (le maximum de comparaisons à faire dans le pire des cas) et en condition lambda (le nombre de compraisons effectuées "classiquement").
Mais de toute façon, si tu as 10 comparaisons à faire, fait une recherche séquentielle... Et il existe d'autres tris (par sélection ou bulle par exemple). Regarde si tu peux trouver un bouquin de C++ assez gros, normalement ils y sont détaillés. Mes tutos sur le SDZ :
|
Dusty
|
# Posté le 04/09/2006 à 09:58:50 - Ce membre a mis la note : 18 |
|
Groupe : Membres |
Merci de ta réponse très rapide Severance.
Je vais m'informer à ce sujet. Mais je crois qu'on peut le dire, une recherche sur une liste séquentielle déjà triée est une idiotie. Ta solution doit être utilisée dans tous les cas. Concernant le problème du tri, je crois avoir peut-être un tri intéréssant: les listes chaînées. Il me semble qu'elle sont intéréssant parce qu'elle n'oblige pas à bouger le reste des données (d'une cellule à l'autre) quand on insère un nombre qui se place dans les premières positions. |
Tristan10101
|
# Posté le 28/12/2006 à 02:31:58 - Ce membre a mis la note : 19 |
Enjoy !![]() Groupe : Membres |
Très bon tuto ! |
gehem
|
# Posté le 24/01/2007 à 09:22:50 - Ce membre n'a pas mis de note |
|
Groupe : Membres |
Très bonne idée, c'est un algorithme très utile, 18/20 , et voici quelques compléments pour amener la note à 20/20 !
La recherche dichotomique peut se faire aussi sur une table non ordonnée. C'est particulièrement intéressant quand la table augmente régulièrement ou subit des modifications : s'il faut la ré-ordonner à chaque modification ou ajout on a vite fait de perdre l'avantage de la recherche dichotomique. Comment fait-on ? 1) On a une première table, la table des données, dans laquelle s'entassent successivement les nouvelles données au fur et à mesure qu'il y en a, comme des livres qui viendraient s'ajouter à une pile déjà existante. Les données sont donc dans un ordre quelconque, l'ordre d'arrivée. Chaque donnée a une adresse. 2) On utilise une deuxième table, la table des adresses : dans cette table les adresses sont rangées dans l'ordre suivant : d'abord l'adresse de la donnée la plus petite, puis l'adresse de la donnée immédiatement supérieure, etc... pour finir par l'adresse de la donnée la plus grande. La recherche d'une donnée : On compare cette donnée à celle que l'on trouve à la première adresse (adresse basse, donnée basse) et à celle de la dernière adresse (adresse haute, donnée haute). Supposons que la donnée recherchée se trouve entre les deux, on la compare alors à la donnée qui se trouve à l'adresse médiane (donnée médiane). Si cette dernière est supérieure à la donnée recherchée, alors cette adresse médiane devient notre adresse haute, et inversement si la donnée médiane est plus petite que la donnée recherchée, l'adresse médiane devient notre nouvelle adresse basse. Et ainsi de suite. C'est tout à fait semblable à la dichotomie sur une table triée. En fait, la table n'a pas été écrite dans l'ordre croissant des données, mais on a écrit les adresses ordonnées selon l'ordre croissant des données (et cela se fait au fur et à mesure que la table des données s'agrandit). L'avantage de cet algorithme est considérable : Comme déjà dit, quand une table s'agrandit régulièrement par ajout successifs, il n'y a pas besoin de la retrier après chaque ajout ou modification. C'est la table des adresses qui est modifiée, comment : Quand une nouvelle donnée arrive, elle prend sa place à la suite de la table des données, elle a une adresse. Il faut ensuite insérer son adresse dans la table des adresses : pour cela on cherche cette nouvelle donnée par dichotomie, c'est à dire qu'on trouve dans la table des adresses : soit son adresse si elle est déjà présente, soit la place où son adresse devrait se trouver si elle y était, et dans les deux cas c'est là qu'on insérera la nouvelle adresse. On peut aussi bien faire des suppressions de données : On recherche dans la table des adresses l'adresse de la donnée à supprimer, on la supprime, c'est à dire qu'on "tasse" cette table, et on suprime la donnée. Astuces : Insérer une nouvelle adresse dans la table des adresses est beaucoup plus léger que de trier une table de données. C'est particulièrement léger si la table des adresses est faite de plusieurs blocs comportant un certain nombre de cases disponibles en fin de bloc, cela permet de ne déplacer que, statistiquement, la moitié des adresses d'un bloc lors de l'insertion d'une nouvelle adresse. De temps en temps, quand ces cases disponibles auront été consommées, il faudra re-écrire ces blocs en ménageant de nouveau des cases vides en fins de blocs.Ce n'est pas lourd. En pratique, les blocs d'adresses peuvent contenir par exemple 100000 adresses chacun, et on met en mémoire uniquement les adresses basse et haute de chaque bloc ainsi que les données basse et haute correspondantes. Supposons que l'on ait 100 blocs, on a donc en mémoire 100 adresses basses, 100 adresses hautes et les 200 données correspondantes. On commence la recherche par une recherche séquentielle en mémoire de la donnée recherchée parmi ces 200 données. afin de déterminer dans quel bloc d'adresses on va chercher par dichotomie. Jusque là il n'y a aucun accès au disque. Puis on fait la dichotomie : pour ça il faut charger le bloc d'adresse sélectionné (1 accès au disque) puis il faudra accéder au disque (table des données) environ 16 fois pour trouver la donnée ou bien là où on doit insérer son adresse . La programmation demande beaucoup de soin mais c'est très efficace. |
rrk275
|
# Posté le 03/05/2007 à 18:29:15 - Ce membre n'a pas mis de note |
|
Groupe : Membres |
Savoir comment ca marche c'est tres bien mais dans la pratique utlisez plutot bsearch ...
louis Louis |
gatsu
|
# Posté le 27/08/2008 à 14:25:49 - Ce membre n'a pas mis de note |
|
Groupe : Membres |
Ce tuto n'aurait-il pas plutôt sa place dans l'algorithmique?
Si vous avez des livres, dvd, JeuxVideos qui prennent la poussières allez sur http://www.troczone.com/?p=gatsu77 et échanger contre d'autres biens . |
Vous devez être inscrit pour pouvoir poster des messages
Changer de design |
En savoir plus |
Plan du site |
Politique d'accessibilité |
Règles |
RSS tutoriels |
RSS news
Édité par Simple IT SARL :
Nous contacter
| Notre blog | Revue de presse | Publicité
Y'a plus rien à lire, faut remonter maintenant !
Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.
127 Zéros connectés |
9 requêtes |
0.0228s (0.0115s)
