{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A.algo - Quicksort\n", "\n", "Cet \u00e9nonc\u00e9 a pour objectif de pr\u00e9senter l'algorithme de tri [quicksort](https://fr.wikipedia.org/wiki/Tri_rapide) qui permet de trier par ordre croissant un ensemble d'\u00e9l\u00e9ments (ici des cha\u00eenes de caract\u00e8res) avec un co\u00fbt moyen."]}, {"cell_type": "markdown", "metadata": {}, "source": ["Lorsqu'on parle de co\u00fbt moyen, cela signifie que le co\u00fbt n'est pas constant en fonction de la dimension du probl\u00e8me. Ici, le co\u00fbt moyen d\u00e9signe le co\u00fbt moyen d'un tri \\textit{quicksort} obtenu en faisant la moyenne du co\u00fbt du m\u00eame algorithme sur toutes les permutations possibles de l'ensemble de d\u00e9part. en $O(n \\ln n)$ o\u00f9 $n$ est le nombre d'\u00e9l\u00e9ments \u00e0 classer. Le tri *quicksort* appara\u00eet rarement sous la forme d'un graphe : il est plus simple \u00e0 programmer sans les graphes mais il est plus simple \u00e0 appr\u00e9hender avec les graphes. Dans cette derni\u00e8re version, l'algorithme ins\u00e8re un \u00e0 un les \u00e9l\u00e9ments d'une liste \u00e0 trier dans un graphe. Chaque noeud de ce graphe est reli\u00e9 \u00e0 deux autres noeuds."]}, {"cell_type": "markdown", "metadata": {}, "source": ["* Un noeud ``avant`` ou ``\"<\"`` qui permet d'acc\u00e9der \u00e0 des \u00e9l\u00e9ments class\u00e9s avant celui de ce noeud.\n", "* Un noeud ``apres`` ou ``\">\"`` qui permet d'acc\u00e9der \u00e0 des \u00e9l\u00e9ments class\u00e9s apr\u00e8s celui de ce noeud.\n"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Les noeuds ``avant`` et ``apres`` sont appel\u00e9s les successeurs. Le terme oppos\u00e9 est pr\u00e9d\u00e9cesseur. Ces deux noeuds ont n\u00e9cessairement un pr\u00e9d\u00e9cesseur mais un noeud n'a pas forc\u00e9ment de successeurs. S'il en avait toujours un, l'arbre serait infini."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q1 : classe\n", "\n", "On cherche \u00e0 construire une classe ayant pour nom ``NoeudTri`` et qui contient une cha\u00eene de caract\u00e8res initialis\u00e9e lors de la cr\u00e9ation de la classe : ``n = NoeudTri(\"essai\")``."]}, {"cell_type": "code", "execution_count": 2, "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q2 : __str__\n", "\n", "On \u00e9crit la m\u00e9thode ``__str__`` de sorte que l'instruction ``print(n)`` affiche la cha\u00eene de caract\u00e8res que contient ``n``."]}, {"cell_type": "code", "execution_count": 3, "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q3 : avant, apr\u00e8s\n", "\n", "On cherche maintenant \u00e0 d\u00e9finir d'autres noeuds, reli\u00e9s \u00e0 des attributs ``avant`` et ``apres``. On suppose que les noeuds utilisent l'attribut ``mot``, on cr\u00e9e alors une m\u00e9thode ``insere(s)`` qui :\n", "\n", "* Si ``s < self.mot``, alors on ajoute l'attribut ``avant = NoeudTri(s)``.\n", "* Si ``s > self.mot``, alors on ajoute l'attribut ``apres = NoeudTri(s)``."]}, {"cell_type": "code", "execution_count": 4, "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q4 : __str__\n", "\n", "La m\u00e9thode ``__str__`` n'affiche pour le moment qu'un mot. Il s'agit maintenant de prendre en compte les attributs ``avant`` et ``apres`` afin que l'instruction ``print(n)`` affiche ``avant.__str__()`` et ``apres.__str__()``. Il faudra \u00e9galement faire en sorte que la m\u00e9thode ``avant.__str__()`` ne soit appel\u00e9e que si l'attribut ``avant`` existe. Comme la liste des mots \u00e0 trier est finie, il faut bien que certains noeuds n'aient pas de successeurs. Qu'est-ce qu'affiche le programme suivant ? "]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"ename": "NameError", "evalue": "name 'NoeudTri' is not defined", "output_type": "error", "traceback": ["\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mracine\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mNoeudTri\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"un\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# noeud tri n'est pas encore d\u00e9fini\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mracine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minsere\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m\"unite\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mracine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minsere\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m\"deux\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mracine\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'NoeudTri' is not defined"]}], "source": ["racine = NoeudTri(\"un\") # noeud tri n'est pas encore d\u00e9fini\n", "racine.insere (\"unite\")\n", "racine.insere (\"deux\")\n", "print(racine)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q5 : insere\n", "\n", "Est-il possible de trier plus de trois mots avec ce programme ? Que faut-il modifier dans la m\u00e9thode ``insere`` afin de pouvoir trier un nombre quelconque de mots ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q6 : exception\n", "\n", "Ajouter le code n\u00e9cessaire afin que la m\u00e9thode ``insere`` g\u00e9n\u00e8re une exception lorsqu'un mot d\u00e9j\u00e0 pr\u00e9sent dans l'arbre est \u00e0 nouveau ins\u00e9r\u00e9."]}, {"cell_type": "code", "execution_count": 6, "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q7 : graph\n", "\n", "On se propose de construire une image repr\u00e9sentant l'arbre contenant les mots tri\u00e9s par l'algorithme *quicksort*. Cette repr\u00e9sentation utilise le module [blocdiag](http://blockdiag.com/en/) ou on peut utiliser la fonction [draw_diagram](http://www.xavierdupre.fr/app/pyensae/helpsphinx/pyensae/graphhelper/blockdiag_helper.html?highlight=draw_diagram#pyensae.graphhelper.blockdiag_helper.draw_diagram)."]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"image/png": "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\nTZ069c0335wzZ84FF1yQy+XmzZvned6NN944d+7cp59+euTIkUKInTt33nfffR9++OGll17a2Ngo\nhCitw4QQ+Xz+o48+qqmp0XW9tra2sbFxwoQJmqZVV1d//PHH/q994WshP4MvMuMPBRyGOiGE7LEK\n9dsI8Hd7Pp93HEcOo7quK/cukJ9QnCw/J/zNF198cdu2bZ9++unmzZtXrFjx2muv/fSnP127du3M\nmTOvuuoqwzC6u7sXLVr02GOP3XHHHaNHj04mk8uWLbvzzju/+93vTpgwYdOmTWPHjn3jjTfknI1t\n2/Pnz89ms1OmTBFC3HrrrcuXL7csyzCMnTt3Pv/882PHjl26dGksFuvXCyE/gyka4w8FHIDQeJ6X\nzWZzuZz81h891RpGEZaT5aePHTt21NTUNDQ05HK5Y8eOtbe3f/bZZ3PmzKmsrKyvrz98+HAymWxp\nabnjjju2bt26ffv2zs7Ojz/++MCBAw0NDcOHD3/33XcnT548a9YseULWMAwhREVFxY4dO9LptLwF\niWma8lqETCazfPnym266KRaLsbKtzKk+/lDAYehieA2d/MDr7OyUVxkLIeSnoxJnlMhP6E6YH+24\ntyafz3/lK1+59tprhRALFiyIx+PyGgVN044ePfqlL31p586dY8eO/epXv7po0aLRo0cfPXpU07SZ\nM2cmEol58+YJIaqqqkpXqrW2tgohhg8fXllZKe/9ls/nDx06NGnSpEmTJr399tv+yqpTN35Adwb6\nTenxR+NZqBjK5ACqREeNKnm/rkwmk81mC4WCXFOsygcb+Qnd8fmR58L6/M706dP/9a9/1dXVvfPO\nOz/60Y8syzrvvPM2bdp04MCB3/3ud4lE4mtf+1pDQ8OaNWu+//3vr1q1KplMTpgwYffu3cOHD1+4\ncOHu3bs1TZMP5vLzWSgUenp65Nee582ZM+ell15qaWlZt27d559/fjrnT8lP6JQefzRm4ACFumvE\nyCPd9vb2YcOGaZoWj8dN05R3tFfoU438hOWE+Tl+GZzrunPnztU07Rvf+EZra+uGDRvS6fTDDz88\na9ashQsXTp06taqq6je/+c3EiROffvrpffv2XXHFFbfddtvLL7983XXXLV++/KKLLqqvry8Wi/6t\nKOXyqXQ6LZdMGYZRLBZnzpy5fv36yy677Nxzzz3vvPOOryNPhvyEJQLjDwUchjpV+mokeZ537Nix\n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\n", "text/plain": [""]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyensae.graphhelper import draw_diagram\n", "img = draw_diagram(\"\"\"\n", " blockdiag {\n", " A -> B -> C -> D;\n", " A -> E -> F;\n", " F -> G [label = \"edge-FG\"];\n", " E [label=\"label-E\"]\n", " }\n", " \"\"\")\n", "img"]}, {"cell_type": "code", "execution_count": 8, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1"}}, "nbformat": 4, "nbformat_minor": 2}