|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Bonjour à tous,
Dans le cadre de mon cours, le prof nous a donnée un petite exercices ou on doit trouver la médiane dans un tableau de X élements, ou certains éléments peuvent se répéter. Normalement, ça serait facile de le trouver je commencerais par trier mon tableau et je retourne élément N/2 (tableau impair) ou encore la moyenne de N/2 & N/2+1 (tableau impair). Cependant, le prof nous donne une contrainte qui me fait bloquer entièrement, il refuse qu'on tri le tableau. En gros, mon algorithme doit :
Ensuite je vais devoir déterminer :
En cherchant sur internet, je suis tombé sur certaine site ou on parlais de calcul linéaire,déterminisme,etc. Mais j'ai rien trouvé qui me donnée une explication claire si je peu le dire ainsi. Surtout que dans la plus part des cas, les données du tableau était permuter. En faisant quelques tests j'ai sortis 5,6 version d'Algo différent que j'ai tester en le transposant en C#, cependant je me retrouver toujours que dans certains cas de tests j'ai une erreur. Merci d'avance ! |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Moyenne et nombre de valeurs inférieurs à la moyenne, c'est trivial et ça se fait en O(n).
Pour la médiane, je ne vois rien de mieux qu'un tri, donc la complexité minimale serait O(n log n). S'il refuse que tu trie ce tableau et que tu n'as aucune contrainte d'utilisation de mémoire, crée une copie triée du tableau. Et je pense que tous les algos en O(n log n) que tu peux trouver pour calculer la médiane seront des algos de tri plus ou moins cachés. Et tous les algos auxquels je pense actuellement sont en O(n²). Mais je pense que t'as du trouver les mêmes.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#3 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
euh...
Je peux voir l'intérêt d'un tri, mais ce n'est d'aucune manière nécessaire.. ![]() Reprenez la définition : http://fr.wikipedia.org/wiki/M%C3%A9...tatistiques%29 Citation:
Et c'est en O(N logN)...
__________________
"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
|
|
|
#4 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
@Celelibi
Oui pour la moyenne et le nombre de chiffre en bas de la moyenne ça va sans aucun problème. Mon problèmes majeur était(est) vraiment la médiane. Mais puisqu'il disait «ne pas trier les valeurs», je lui est envoyé un message pour justement savoir si je pouvais faire une copie du tableau. J'attends ça réponse et si telle est le cas, ça sera parfait. Dans situation contraire, c'est très intriguant... @souviron34 Oui, l'optique de l'option de comptage peut-être une idée, bien qu'il faut avouer que question optimisation c'est pas tous à fait ça. Mais si je n'ai pas le droit d'avoir un second tableau, je n'aurais pas trop le choix. En tous cas, merci de votre aide, et je vous donnerais des nouvelle dès que j'en aurais eu de prof et que j'aurais quelques chose Edit : Réponse du prof : «Justement, le défi est de ne pas trier (au moins, pas totalement)». Donc, rendu là il suffit de gardé une des optiques qui m'avait passé par la tête. Trier les valeurs jusqu'à ce que j'ai N/2 nombre plus petit. Bref, un mélange des 2 solutions, tri & comptage |
|
|
00
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
Citation:
Tu calcules la moyenne. O(N) Tu parcoures la table en comptant avant et après la moyenne O(N) Tu procèdes ensuite par dichotomie à partir de la moyenne : N/2*log(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
|
|
|
#6 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Enfaite la moyenne et le nombre de chiffre en bas de la moyenne ça va sans aucun problème. C'était vraiment la médiane mon problème.
|
|
|
00
|
|
|
#7 | |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Citation:
Cet algo n'est pas en O(N log N), mais en O(N log M), avec M l'intervalle des valeurs du tableau, ce qui est tout à fait différent et potentiellement pire qu'un algo naïf en O(N²). Ce que je peux proposer comme algo en O(N log N) c'est un quicksort où on ne trie que la partie où se trouve la médiane et où on s'arrête dès qu'on a trouvé pivot qui correspond à la médiane. D'ailleurs, vu qu'on ne trie que la partie qui nous intéresse, je crois que cet algo est en O(N) en moyenne et O(N²) au pire. À vérifier tout de même.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
|
00
|
|
|
#8 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
Citation:
D'ailleurs , qu'est-ce qu'une médiane ? C'est bien une valeur, non ?? Le tri t'oblige à raisonner sur les indices.. Sachant que la moyenne est M, on explore une fois et on compte combien de valeurs sont en dessus (ou en dessous). Si le nombre considéré est > N/2, c'est que la médiane est entre la moyenne et la valeur min. (valeur max) . Donc on réduit l'intervalle en 2, et on itère.. A chaque fois on ne parcours que N, et à chaque fois on réduit l'intervalle par 2.
__________________
"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
|
|
|
#9 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Citation:
Si ton tableau contient 3 valeurs {0, 2^4000, 1+2^4000}, ça serait dommage de faire dans les 4000 itérations. Dans tous les cas, je m'oppose à l'utilisation du même N. Citation:
Sinon, je viens de lire la page wikipedia... Visiblement, l'algo que j'ai esquissé ci-dessus s'appelle le quickselect.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
||
|
|
00
|
|
|
#10 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
J'ai pas encore eu le temps de regarder. Mais en pouvant déplacer certaine valeur, sans que se soit toutes les valeurs, ça sera a première vu plus simple.
Et oui, je crois que ça serait un genre de QuickSelect. En gros je parcours mon tableau au maximum N fois pour trouver ma médiane. Tous en faisant le total, et une fois la médiane trouver, je ne fais que continuer a calculer le total. Cependant Je sais qu'un (for,while) c'est O(n), mais pour le reste ^^ |
|
|
00
|
|
|
#11 | |||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
Citation:
Code :
__________________
"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
|
|
|
#12 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Question, dans ton Algorithme. Ta valeur moyenne, vient d'ou.
Car dans mon cas je ne connais pas la moyenne. En gros l'entête de mon algo peu ressembler a ceci. DeterminerMoyenne(int[] tableau, out Moyenne, out PlusPetitMoyenne) |
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
De là où tu l'as déterminée..
Ici je la prend comme une entrée... comme le min et le max..
__________________
"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
|
|
|
#14 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Ah OK, dans mon cas, je voyais dans optique ou on calcul tous dans le même module. Vu que je parcours déjà mon tableau N/2 assuré pour déterminer mon Médian
|
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
Citation:
Comme on a dit, déterminer la moyenne, le min et le max en même temps se fait en O(N) Si tu as besoin d'une fonction CalculeMedian avec juste en paramètres, tableau, et N ça marche aussi.. Par contre, comme j'ai mis au dessus, je ne vois pas coment tu peux faire en ne parcourant que N/2...
__________________
"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
|
|
|
#16 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
Oui pour la médian N/2 au mieux.
Cependant, ou fois que j'ai trouvé la Median, je n'est plus besoin de «re boucler» sur mon tableau pour le reste. Je calcul seulement le reste du tableau. Mais la je suis intriguer sur une chose je dois déterminer le nombre de valeurs inférieures . Si j'ai [1,1,1,1,1,3] , ma moyenne est de 1.3. Cependant, mon 1 se répète, donc je reste perplexe, est-ce que je dois compté les valeurs qui se répète ou pas... |
|
|
00
|
|
|
#17 | |||||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Citation:
Par contre, l'algorithme que tu as donné... Il est plein d'erreurs. 1) Quelle est la dimension (unité / type) de Delta ? Sa première affectation lui donnerait la dimension d'un indice, les autres lui donneraient la dimension d'une valeur. Admettons que l'initialisation était plutôt Delta = max - min. 2) Le test Delta <= 1 n'est valable que si les valeurs du tableau sont des entiers et pas des rationnels. Mais admettons qu'on n'a à faire qu'à des entiers. 3) max et min ne sont jamais affectés, j'imagine qu'il s'agit de la valeur max et min du tableau. 4) Chose amusante : sous l'assertion précédente, cet algo ne termine pas sur la liste suivante : [0, 1500, 3998, 3999, 4000]. La valeur de Ref va osciller de part et d'autre de 1500 (qui est la valeur juste précédant la médiane). (Et quand il termine, cet algo a la fâcheuse tendance à retourner la valeur précédant la médiane.) J'imagine que la supposition 3) étaient fausses et que ce sont en fait les bornes de l'interval à explorer et qu'il faut les mettre à jour à chaque itération. (5) Adapter cet algo pour gérer les multiplicités et les cas où la médiane n'est ni entière ni un élément du tableau n'est pas immédiat ou pas élégant.) Et donc, pour finir de te convaincre que le nombre d'itérations dépend de la valeur des données, voilà une implémentation en python (à peu près débugguée, il ne gère pas le point 5) sus-cité) de ton algo avec un comptage des itérations. Code python :
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|||||
|
|
00
|
|
|
#18 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 1 060 ![]() |
Vérifier qu'une valeur est une médiane demande au minimum de parcourir tout le tableau au moins une fois. Il est donc impossible (même dans le meilleur des cas) de calculer la médiane en ne parcourant que la moitié du tableau.
Dans le cas que tu as cité, ta médiane est 1. Cela est certainement expliqué sur wikipedia.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#19 |
![]() Inscription : juillet 2008 Messages : 64 ![]() |
N/2 ne fonctionne pas ? N étant le nombre d'élements du tableau.
Si tableau est impair (3 valeurs) --> 1,2,3 N/2 = 1.5, donc 1. Donc j'ai 1 valeur PP que ma médiane.D'ou mon au mieux N/2. Mais j'ai peut-être tord, je suis encore en test ^^ ------------ Sinon, dans mon exemple oui ma médiane est de 1. Mais je dois trouvé la moyenne, ici 1.3, et le nombre de valeur inférieur a ma moyenne. Mais bon, je vais le faire comme je le pense, et qui est normal, donc ça serait 5 valeurs inférieur à la moyenne. |
|
|
00
|
|
|
#20 | |||||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 572 ![]() |
Citation:
Je me suis légèrement trompé sur la boucle (tard et autre chose en tête), et j'ai effectivement oublié de remettre à jour min et max.. mais je remet ici le code..
C'est bien INDEPENDANT des valeurs, et c'est bien en O(N) (moyenne) et log(N)*N (médiane).
__________________
"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
|
Copyright © 2000-2013 - www.developpez.com