|
Publicité ' | ||||||||||||||||||||||||
|
|
#41 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 819 ![]() |
Citation:
Code java :
Ou alors, comme le dit prgasp77, utiliser une liste des index à "oublier".
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#42 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
En fait, je pensais (je vérfierais demain) faire la même idée que j'ai expoée plus haut (qui donne une seule itération pour tout sauf le premier cas (4) et le cas de puissance, qui donne x fois N, x étant la puissance), mais en prenant une valeur relative (qui correspond un peu à l'idée de ton algo
Je vous tiens au courant demain..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#43 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Ce que je peux te proposer comme algo bête en O(N²), si tu ne veux pas du tout toucher au tableau, c'est :
Prendre une valeur de référence, et parcourir le tableau pour à la fois compter le nombre de valeurs inférieures à la référence, et aussi trouver la plus petite valeur strictement supérieure à la valeur de référence (qui serait la suivante si le tableau était trié). Et de recommencer avec la valeur suivante comme valeur de référence tant que le comptage des valeurs inférieures à la référence n'est pas suffisant. Sous forme de pseudocode, ça donne ça : Code :
(Y'a beaucoup de if pour gérer les cas spéciaux avec les multiplicité, mais c'est pas complique.)
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
||
|
|
00
|
|
|
#44 | ||||
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Bon, j'ai fini pas faire 2 version fonctionnel. Je vous donne la version C#.
Avec un demi-trie (la moyenne n'est pas ajouté. Donc le plusPetit que la moyenne ne fonctionne pas plus Code :
Sans trier, simplement en calculant (il manque le calcul du nombre de valeur inf à la moyenne) Code :
|
||||
|
|
00
|
|
|
#45 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Ton premier algo est un vrai tri par sélection. Sauf que tu t'arrêtes au milieu.
Par contre j'ai pas compris ton deuxième algo.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#46 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Je reviendrais vers vous cette am, mais je crois que j'ai un algo en O(N log(log(M)) dans le pire des cas....
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#47 | |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Citation:
O(n/2) et o(n) sont bien les seules que j'arrive a calculer ^^ Comme mon second vu que je parcours 2 fois, je crois que ça serait O(n²) ? Mais vraiment pas sûr. Cependant, dans la version avec tri, il me manque le calcul de la moyenne et du nombre de valeur plus petit que la moyenne. Et dans la seconde, du nombre de valeur plus petit que la moyenne. Donc, ça va encore modifié la complicité de O. |
|
|
|
00
|
|
|
#48 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Citation:
Donc potentiellement O(N)...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#49 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Bien, montre-nous ton algo.
Au pire, on trollera sur la complexité.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#50 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Oups j'avais sauté cette phrase en première lecture xD
Enfaite, je prends chaque Indice du tableau, puis je compte le nombre de valeur inférieur. Ensuite, celui qui a NbrElement/2 élement inférieur. Bien ça me donne mon Median. Cependant, dans le cas d'un tableau de NbrElement pair, j'ai besoin de 2 nombre pour déterminer mon médiane sois : N/2 et N/2+1. Je cherche donc c'est 2 résultat. |
|
|
00
|
|
|
#51 |
|
Membre Expert
![]() Yankel ScialomIngénieur en systèmes embarqués Inscription : juin 2004 Messages : 1 001 ![]() |
Mais raison de plus pour un quickselect. On ne trie que ce qu'il faut (c'est à dire que l'on positionne quelques éléments, et c'est tout). Pourquoi tourner autour du pot ?
__________________
gasp in touch -- Yankel Scialom |
|
|
00
|
|
|
#52 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
En fait, j'en ai 2..
Un comme dérivé du premier que j'avais indiqué, qui est en O(N logc M), et l'autre linéaire, en O(N), ressemblant furieusement à ce qu'on peut lire dans les Selection algorithm à la rubrique Linear minimum/maximum algorithms. Je les posterrais tout à l'heure..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#53 | ||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
OK, alors voilà..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
||
|
|
10
|
|
|
#54 | |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Citation:
Mais mes 2 algo fonctionnelle sont citer un peu plus haut. |
|
|
|
00
|
|
|
#55 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 819 ![]() |
Citation:
Code java :
Auquel cas, je ne pense pas que la recherche des 2 candidats soit en O(1). C'est plutôt que tu profites de ta boucle d'équilibrage (en O(N)) pour identifier les 2 candidats.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#56 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Citation:
Comme on n'ordonne pas, on est obligé de passer à travers tous les points, du coup j'ai encadré la valeur de référence par une valeur sup et une valeur inf.. Disons que je n'ai pas de gros tests à faire toruner, mais il me semble qu'au max on ne devrait tourner que très peu de fois (sans doute 2 itérations en moyenne) : soit on est au dessus et la valeur est celle du dessous, soit on est en dessous et la valeur est celle du dessus... M'enfin, peut-être que je me trompe... En fait, c'est comme si on avait ordonné et qu'on prenne le milieu, sauf qu'on n'ordonne pas et qu'on s'approche extrêmement vite. Il faudrait tester sur de très grands tableaux... En fait vraisemblablement le pire cas serait avec plein de valeurs autour de la moyenne... Bien entendu, on peut améliorer encore en divisant en intervalles (DPR)... Mais j'aime pas ce qui complique Mais en tous cas ça me semble simple, sans tri, et rapide.... Quant à l'autre, avec un log double au lieu du log simple, ça devrait être pratiquement là aussi 2 itérations max.. (puisque là ça ferait log itéré 3 fois).. (mais faudrait régler le pbe des cas dégénérés impairs). Déjà avec un log simple pour des cas "normaux" (et pas du genre quil y a dans le test) ça devrait être très efficace.. (puisque c'est log(log)) C'était le fun à chercher une solution
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
10
|
|
|
#57 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Citation:
- Tu utilises un tableau temporaire. Donc quitte à avoir un algo qui nécessite un espace en O(N), autant faire un quickselect (qui sera en O(N) en temps) sur une copie du tableau. Cela dit, il est facile dans ton code se passer de ce tableau en utilisant log(tab[i]-min+1) chaque fois que tu utilises temp[i]. - Je trouve que ta recherche de valeurs immédiatement supérieures et inférieures à la "médiane temporaire" est... compliquée. Ça n'est pourtant qu'une recherche de min et max. Et sur le fond, ce qui me dérange dans ton algo, c'est qu'en prenant le log des valeurs du tableau, on perd en précision. Les double ne sont pas des réels, ni même des rationnels limités à un intervalle. C'est un truc complètement bâtard avec un nombre de bits de mantisse limité. En bref : dans le cas général, l'exponentielle du log n'est pas égale à la valeur de départ. Mais même en imaginant qu'on ait des réels, prendre le log des valeurs ne fait que "resserrer" l'intervalle entre la valeur max et la valeur min. Si tu travailles sur des double, ton algo initial (sans prendre le log des valeurs) est en O(N*log((max-min)/delta)) avec delta le plus petit écart entre deux valeurs consécutives qu'on va noter delta = d1 - d2. Si tu travailles sur des entiers, delta = 1 et on avait noté précédemment max-min = M (sans le dire parce que c'était pas important). Maintenant, avec le log des valeurs, ton algo est en O(N*log( log(max-min)/(log(d1)-log(d2)) )) C'est pas très beau, on peut réécrire la partie à l'intérieur du premier log. log(max-min)/(log(d1)-log(d2)) = log(M)/log(d1/d2) Si d1 et d2 sont proches d1/d2 va tendre vers 1 par valeurs positives, donc log(d1/d2) va tendre vers 0. Donc log(M)/log(d1/d2) va augmenter rapidement quand d1 et d2 sont proches. Donc si on met des valeurs assez proches, ça fait exploser le nombre d'itérations (quand ça termine). Par exemple : {0, 1e-16, 2e-16, 1, 2}, il trouve la médiane (dont la valeur est approximative) en 52 itérations. (Parce que oui j'aime bien faire chier. Citation:
Par contre cet algo c'est rien d'autre qu'une variante de l'algo dérivé du tri par sélection que j'ai présenté un peu plus haut. Il est en O(N²). Commencer avec la moyenne comme valeur initiale n'est qu'une heuristique. La médiane peut être aussi éloignée qu'on veut de la moyenne. Par exemple {0, 1, 2, 3, 4, 5, ... k, 2^4000}. Cet algo va faire (k-1)/2 itérations (c'est à dire O(N)). Et dans chaque itération il recherche la valeur immédiatement inférieure (en O(N)). Oui souviron, t'as tout à fait le droit de me trouver insolent. ^^
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
||
|
|
00
|
|
|
#58 | ||||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Vite fait :
Citation:
Citation:
Citation:
Citation:
Le "délire" encore une fois est lié aux problèmes <= et <... Je dis juste que c'est possible à faire, mais je n'ai pas que ça à faire, donc pour raffiner... Je présente une idée, sans plus.. Qui se passe de tris (ce qui était demandé) et semble tourner correctement (à quelques corrections à faire), tout en étant strictement < O(N2)...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
||||
|
|
00
|
|
|
#59 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Bon, encore plus fort
En mixant les 2 approches : Citation:
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#60 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Effectivement, c'est une solution à laquelle j'avais vaguement pensé sans la formaliser. (Je me suis arrêté quand j'ai vu que sa complexité allait avoir un "min".)
À chaque itération tu élimines au moins une valeur du tableau, et t'espères en moyenne* en éliminer la moitié. C'est donc du O(N*min(N, log(M)/log(d1/d2))) ou un truc du genre. C'est donc au pire du O(N²). Y'a juste un truc qui m'intrigue, c'est si on a plein de valeurs très proches et que le log les rend égales (parce qu'on est sur des double). Tu risques de pas pouvoir trouver la bonne valeur. * Pour avoir un cas moyen il faut trouver une hypothèse moyenne de répartition des valeurs entre min et max. Répartition uniforme peut-être ?
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com