IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lisp Discussion :

Débutant - algorithm qsort


Sujet :

Lisp

  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut Débutant - algorithm qsort
    Bonjour,

    Originaire de c++ j'ai un peu de mal à me retrouver en LISP et fais qqs petits algorithmes pour me lancer. Un simple qsort pas optimal, mais je n'obtiens qu'un stack-overflow:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    (defun qsort (l)
    	   (if (= (length l) 1)
    	       l
    	       (append
    		(qsort (lowerpart l (pivot l)))
    		(qsort (upperpart l (pivot l))))))
     
    (defun lowerpart (l r)
    	   (let ((return-value '()))
    	     (dolist (e l)
    	       (if (<= e r)
    		   (push e return-value)))
    	     return-value))
     
    (defun upperpart (l r)
    	   (let ((return-value '()))
    	     (dolist (e l)
    	       (if (> e r)
    		   (push e return-value)))
    	     return-value))
     
    (defun half (l)
    	   (truncate (/ (length l) 2)))
     
    (defun pivot (l)
    	   (nth (half l) l))
    Je suis preneur de conseils, merci!

    PS: sous Emacs CLISP, quand je décide de réinitialiser le thread, je n'arrive plus à relancer la boucle REPL; du coup j'éteins et rallume Emacs, qqn connaît-il une solution plus pratique? Merci encore

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Que donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (let ((l '(42 42))) (lowerpart l (pivot l)))
    Pour qu'un algorithme récursif ait une chance de terminer (un jour), il faut absolument que les données "diminuent" d'une itération à l'autre...

    [EDIT]
    Petite remarque: ton algorithme est en O(n*n) alors que quicksort est en O(n*log(n))... ce n'est donc pas quicksort...

    Après vérification, ton algorithme est bien quicksort et il est bien en O(n*log(n))!

    En effet, au premier "tour", on fait N-1 comparaisons et on obtient 2 listes qui contiennent en tout N éléments.
    Aux "tours" suivants (en cumulant ce qui se passe pour chacune des sous-listes), on fait aussi N-1 comparaisons qui conduisent à 4 sous-listes.
    Le nombre de "tours" est égal au nombre de fois qu'il faut diviser N par 2 pour n'obtenir que des singletons, ce qui est, dans le meilleur des cas (où, à chaque fois, les 2 moitiés ont plie poil la même taille), justement la définition du log de N en base 2.
    Dans le pire des cas, à chaque découpe, on isole un seul élément, ce qui demande donc N-1 étapes pour arriver à des singletons, d'où o(n*n).
    [/EDIT]

    Dans emacs, as-tu essayé de tuer le buffer? C-x k

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Très juste. Voilà ce que ça fait de traduire sans réfléchir un algo c en LISP...
    Il me semblait en revanche que ce modèle de tri récursif était appelé qsort, la complexité supplémentaire viendrait-elle des fonctions lowerpart / upperpart qui répètent l'opération sur l'ensemble de la liste?
    Saurais-tu où je pourrais trouver des exemples de programmation "à la LISP" pour en comprendre l'esprit?
    Merci de ton aide

Discussions similaires

  1. [Débutant] Algorithme de recherche d'un nœud dans un arbre N-aire
    Par geforce dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/03/2015, 22h17
  2. [Débutant] Algorithme de parcours en profondeur d'un Arbre N-aire
    Par geforce dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/02/2015, 11h31
  3. [débutant] algorithme de calcul de prix HT/TTC
    Par keren dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/06/2009, 12h14
  4. Débutant en Algorithme
    Par Zecherche dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/12/2006, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo