Bonjour à tous
J'ai un problème dans un exercice de programmation, et j'aimerais votre aide parce que je suis vraiment bloqué
On considère deux listes d'entiers tous différents L1 et L2 qui sont triées, et on me demande de trouver le kième plus petit élément de la réunion de ces deux listes, avec une complexité O(log (n)) , où n est le maximum des tailles de liste L1 et L2
Je suis parti sur l'idée d'une dichotomie, mais je n'arrive pas à aboutir...
Si quelqu'un peut me mettre sur la voie, je lui en serais reconnaissant =)
Merci d'avance !
Les entiers sont différents dans une même liste.
Le sont-ils aussi entre L1 et L2 ?
Autrement dit l'intersection entre L1 et L2 est vide, c'est ça ?
Salut.
Alors j'ai un petit souci : qd j'ai lu l'énoncé, j'ai tout de suite pensé à un algo, seulement il n'est pas en log(n)...
Alors voilà mon raisonnement :
Bonsoir Simpom
Effectivement j'ai déjà pondu un algo de cette sorte, et effectivement il est en O(k). Sinon on peut aussi fusionner les deux listes l1 et l2, mais là c'est en O(n1 + n2) où ni = len(li), ou encore essayer de créer les deux listes de taille n/2 pour faire une dichotomie, mais là c'est en O( n log n) avec mon programme
Du coup la véritable difficulté c'est de trouver un algo en log(n) ... Mais merci pour ta réponse, si jamais tu as une nouvelle idée je suis preneur =)
La je pense que je vais laisser passer cette nuit : on dit souvent qu'elle porte conseil
Encore merci et bonne nuit !
Un coup de divide and conquer (diviser pour gagner).
Supposons pour simplifier que est une puissance de , disons , et que est inférieur ou égal au minimum des longueur des deux listes triées que je vais appeler et .
On sait au début que le -ème plus petit élément, appelons-le , se situe dans ou dans .
Supposons que . Alors se situe dans ou dans . Si au contraire , alors ...
Je te laisse continuer.
Bonjour.
Une idée d'informaticien (nul n'est parfait)...
A partir des listes L1 et L2, on génère les listes Lbis1 et Lbis2 telles que :
Lbis1[ni] = 1 si l'entier ni est présent dans la liste L1
Lbis1[ni] = 0 si l'entier ni est absent de la liste L1
Lbis2[ni] = 1 si l'entier ni est présent dans la liste L2
Lbis2[ni] = 0 si l'entier ni est absent de la liste L2
Il suffit ensuite de balayer les deux listes indexées Lbis1 et Lbis2 en parallèle avec les tests adéquats.
A+
GaBuZoMeu, bonjour.
En 35 ans de développement en informatique embarquée (je sais, je fais partie de la préhistoire de l'informatique juste après le boulier, la règle à calculs et les tables de log), je n'ai jamais entendu parler de complexité d'un algorithme dans le cadre de mes nombreuses expériences professionnelles...
Au vu de la puissance de calcul des processeurs actuels, est-il valable de perdre du temps à gagner quelques opérations ?
Par contre, taille du processeur (de 1 bit à 128 bits), taille de ses mémoires mortes ou vives, fréquences d'horloge, code sans 'bogues' et surtout le coût d'un processeur et de son environnement (et j'en oublie), ça oui...
Cordialement.
Alors pourquoi interviens-tu sur une question concernant la complexité d'un algorithme ?
Puisqu'ici c'est bien le noeud de l'affaire !
bonjour,
je me permet d'ajouter que si on utilise la notation grand O en complexité, c'est pas par paresse, c'est parce que justement on prend en compte l'accélération matérielle. Qu'un processus s'execute en temps ou , c'est équivalent à un changement de matériel près.
Par contre, entre un algo linéaire et un algo logarithmique, il existera toujours une différence dans le temps d'exécution.
Bon, ravinator semble se désintéresser de son fil...
Pour conclure tout de même, voici un petit programme écrit en Sage qui fait le travail (trouver le k-ème à partir de deux listes disjointes L et M triées dans l'ordre croissant). Il n'est pas inutile de savoir que Sage indexe les listes à partir de 0. Le programme fait boucles avec un test dans chaque boucle : on a bien une complexité en , donc en puisque .
Je n'ai jamais utilisé Sage, mais comme ça je dirais qu'il va y avoir un souci si une des liste a une taille inférieure à k/2. Dans tous les cas j'aime bien l'idée de recycler les bugs en exercices
(et je suis d'accord avec la précision de Bachstelze, j'ai été un peu rapide dans ma formulation)
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :