{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A.algo - quicksort - correction\n", "\n", "Impl\u00e9mentation du quicksort fa\u00e7on graphe."]}, {"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"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"text/plain": ["<__main__.NoeudTri at 0x2bd7390ec88>"]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["class NoeudTri (object):\n", " def __init__(self,s):\n", " self.mot = s\n", " \n", "NoeudTri(\"a\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q2 : str, repr"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["a\n", "\n"]}], "source": ["class NoeudTri (object):\n", " def __init__(self,s):\n", " self.mot = s\n", " def __str__(self): \n", " return self.mot + \"\\n\" # \\n : passage \u00e0 la ligne\n", " \n", "print(NoeudTri(\"a\"))"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/plain": ["NoeudTri('a')"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["class NoeudTri (object):\n", " def __init__(self,s):\n", " self.mot = s\n", " def __str__(self): \n", " return self.mot + \"\\n\" # \\n : passage \u00e0 la ligne\n", " def __repr__(self): \n", " return \"NoeudTri('{0}')\".format(self.mot)\n", " \n", "NoeudTri(\"a\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q3 : avant, apr\u00e8s"]}, {"cell_type": "code", "execution_count": 5, "metadata": {"collapsed": true}, "outputs": [], "source": ["class NoeudTri (object):\n", " def __init__(self,s): \n", " self.mot = s\n", " def __str__(self): \n", " return self.mot + \"\\n\"\n", " def __repr__(self): \n", " return \"NoeudTri('{0}')\".format(self.mot)\n", " def insere(self,s):\n", " if s < self.mot:\n", " self.avant = NoeudTri (s) # ajout d'un successeur\n", " elif s > self.mot:\n", " self.apres = NoeudTri (s) # ajout d'un successeur\n", " else:\n", " # \u00e9galite, on ne fait rien\n", " pass\n", " \n", "n = NoeudTri(\"a\")\n", "n.insere(\"b\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La m\u00e9thode ``insere`` pr\u00e9voit de ne rien faire dans le cas o\u00f9 le mot ``s`` pass\u00e9 en argument est \u00e9gal \u00e0 l'attribut ``mot`` : cela revient \u00e0 ignorer les doublons dans la liste de mots \u00e0 trier."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q4 : __str__"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["a\n", "b\n", "\n"]}], "source": ["class NoeudTri (object):\n", " def __init__(self,s):\n", " self.mot = s\n", " \n", " def __str__(self):\n", " s = \"\"\n", " if hasattr(self, \"avant\"):\n", " s += self.avant.__str__ ()\n", " s += self.mot + \"\\n\"\n", " if hasattr(self, \"apres\"):\n", " s += self.apres.__str__()\n", " return s\n", " def __repr__(self): \n", " return \"NoeudTri('{0}')\".format(self.mot)\n", " def insere(self,s):\n", " if s < self.mot:\n", " self.avant = NoeudTri (s) # ajout d'un successeur\n", " elif s > self.mot:\n", " self.apres = NoeudTri (s) # ajout d'un successeur\n", " else:\n", " # \u00e9galite, on ne fait rien\n", " pass\n", "\n", "n = NoeudTri(\"a\")\n", "n.insere(\"b\")\n", "print(n)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["L'insertion des mots donn\u00e9s dans l'\u00e9nonc\u00e9 produit le code suivant :"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q5, Q6\n", "\n", "Il reste \u00e0 compl\u00e9ter la fonction ``insere`` afin qu'elle puisse trouver le bon noeud o\u00f9 ins\u00e9rer un nouveau mot. Cette m\u00e9thode est r\u00e9cursive : si un noeud contient deux attributs ``avant`` et ``apres``, cela signifie que le nouveau mot doit \u00eatre ins\u00e9r\u00e9 plus bas, dans des noeuds reli\u00e9s soit \u00e0 ``avant`` soit \u00e0 ``apres``. La m\u00e9thode ``insere`` choisit donc un des attributs et d\u00e9l\u00e8gue le probl\u00e8me \u00e0 la m\u00e9thode ``insere`` de ce noeud."]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["abc\n", "deux\n", "dire\n", "dizaine\n", "exception\n", "opera\n", "programme\n", "quel\n", "un\n", "unite\n", "xyz\n", "\n"]}], "source": ["class SecondeInserstion (AttributeError):\n", " \"insertion d'un mot d\u00e9j\u00e0 ins\u00e9r\u00e9\"\n", "\n", "class NoeudTri :\n", " \n", " def __init__(self,s):\n", " self.mot = s\n", " \n", " # la cr\u00e9ation d'un nouveau noeud a \u00e9t\u00e9 plac\u00e9e dans une m\u00e9thode\n", " def nouveau_noeud(self, s) : \n", " return self.__class__(s)\n", " \n", " def __str__(self):\n", " s = \"\"\n", " if hasattr(self, \"avant\"):\n", " s += self.avant.__str__ ()\n", " s += self.mot + \"\\n\"\n", " if hasattr(self, \"apres\"):\n", " s += self.apres.__str__()\n", " return s\n", " def __repr__(self): \n", " return \"NoeudTri('{0}')\".format(self.mot)\n", " \n", " def insere(self,s):\n", " if s < self.mot:\n", " if hasattr(self, \"avant\"): \n", " self.avant.insere (s) # d\u00e9l\u00e9gation\n", " else:\n", " self.avant = self.nouveau_noeud(s) # cr\u00e9ation\n", " elif s > self.mot:\n", " if hasattr(self, \"apres\"):\n", " self.apres.insere (s) # d\u00e9l\u00e9gation\n", " else:\n", " self.apres = self.nouveau_noeud(s) # cr\u00e9ation\n", " else:\n", " raise SecondeInsertion(s)\n", " \n", "li = [\"un\", \"deux\", \"unite\", \"dizaine\", \"exception\", \"dire\", \\\n", " \"programme\", \"abc\", \"xyz\", \"opera\", \"quel\"]\n", " \n", "racine = None\n", "for mot in li:\n", " if racine is None: \n", " # premier cas : aucun mot --> on cr\u00e9e le premier noeud\n", " racine = NoeudTri(mot)\n", " else : \n", " # second cas : il y a d\u00e9j\u00e0 un mot, on ajoute le mot suivant \u00e0 l'arbre\n", " racine.insere(mot)\n", "\n", "print(racine)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q7 : dessin"]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["n3012711442136 -> n3012711442528 [label=\"-\"];\n", "n3012711442528 -> n3012711442416 [label=\"-\"];\n", "n3012711442416 [label=\"abc\"];\n", "n3012711442528 [label=\"deux\"];\n", "n3012711442528 -> n3012711442472 [label=\"+\"];\n", "n3012711442472 -> n3012711442360 [label=\"-\"];\n", "n3012711442360 [label=\"dire\"];\n", "n3012711442472 [label=\"dizaine\"];\n", "n3012711442472 -> n3012711442192 [label=\"+\"];\n", "n3012711442192 [label=\"exception\"];\n", "n3012711442192 -> n3012711442304 [label=\"+\"];\n", "n3012711442304 -> n3012712180984 [label=\"-\"];\n", "n3012712180984 [label=\"opera\"];\n", "n3012711442304 [label=\"programme\"];\n", "n3012711442304 -> n3012712181040 [label=\"+\"];\n", "n3012712181040 [label=\"quel\"];\n", "n3012711442136 [label=\"un\"];\n", "n3012711442136 -> n3012711442024 [label=\"+\"];\n", "n3012711442024 [label=\"unite\"];\n", "n3012711442024 -> n3012711442584 [label=\"+\"];\n", "n3012711442584 [label=\"xyz\"];\n", "\n"]}], "source": ["class NoeudTri :\n", " \n", " def __init__(self,s):\n", " self.mot = s\n", " \n", " # la cr\u00e9ation d'un nouveau noeud a \u00e9t\u00e9 plac\u00e9e dans une m\u00e9thode\n", " def nouveau_noeud(self, s) : \n", " return self.__class__(s)\n", " \n", " def __str__(self):\n", " s = \"\"\n", " if hasattr(self, \"avant\"):\n", " s += self.avant.__str__ ()\n", " s += self.mot + \"\\n\"\n", " if hasattr(self, \"apres\"):\n", " s += self.apres.__str__()\n", " return s\n", " def __repr__(self): \n", " return \"NoeudTri('{0}')\".format(self.mot)\n", " \n", " def insere(self,s):\n", " if s < self.mot:\n", " if hasattr(self, \"avant\"): \n", " self.avant.insere (s) # d\u00e9l\u00e9gation\n", " else:\n", " self.avant = self.nouveau_noeud(s) # cr\u00e9ation\n", " elif s > self.mot:\n", " if hasattr(self, \"apres\"):\n", " self.apres.insere (s) # d\u00e9l\u00e9gation\n", " else:\n", " self.apres = self.nouveau_noeud(s) # cr\u00e9ation\n", " else:\n", " raise SecondeInsertion(s)\n", " \n", " def dessin(self):\n", " s = \"\"\n", " if hasattr(self, \"avant\"):\n", " s += 'n{0} -> n{1} [label=\"-\"];\\n'.format(id(self), id(self.avant))\n", " s += self.avant.dessin()\n", " s += 'n{0} [label=\"{1}\"];\\n'.format(id(self), self.mot)\n", " if hasattr(self, \"apres\"):\n", " s += 'n{0} -> n{1} [label=\"+\"];\\n'.format(id(self), id(self.apres))\n", " s += self.apres.dessin()\n", " return s \n", " \n", "li = [\"un\", \"deux\", \"unite\", \"dizaine\", \"exception\", \"dire\", \\\n", " \"programme\", \"abc\", \"xyz\", \"opera\", \"quel\"]\n", " \n", "racine = None\n", "for mot in li:\n", " if racine is None: \n", " # premier cas : aucun mot --> on cr\u00e9e le premier noeud\n", " racine = NoeudTri(mot)\n", " else : \n", " # second cas : il y a d\u00e9j\u00e0 un mot, on ajoute le mot suivant \u00e0 l'arbre\n", " racine.insere(mot)\n", "\n", "print(racine.dessin())"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"image/png": "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\ntRH1KzNmzGhtbRWDN0VUtz0Ug7evMAyjq6urp6enqiZhGoYRj8cty7IsK5FIJBIJldDUuausSNTP\n8YSpq97e3m9+85t9fX033XTTli1bxGC2VGWjtlDRNwEAGBVcAwmgZh08ePDAgQPBbTxGpqenR007\nNAzDcZw1a9Zs2LDhxhtvvOaaa0zTrHiL7Pu+pmnz589/4403zj777P7+ftXov/3225s3b/785z+v\n7of5wgsvOI7zwx/+8NJLL/3yl7/8/PPPX3/99Y2NjX/yJ3+yceNGwzAMw3j44Ycvv/zys846K51O\nz549+wtf+MKtt946ZcqU73znO/X19V/4wheeeOKJdDq9efPmSy+9tMijWqr33tHR8c477+RyObXo\nbjKZVKNhsohBMCml7/u6rsfj8b6+PvXtiLdW5fVzPB9aV0KIfD6/atWqp59++g//8A/Vb/385z//\n0pe+tG/fvgsuuOBHP/pRMIgNAKglBEgAtamtra2trW3Tpk1FbieXyzmOI4RQkcl13ffff3/t2rXn\nnXeeZVmVnc+pdumZZ57p7Ox84403tmzZsnz5crXeied5AwMD6gvTNFXH/41vfOPxxx/3fX/Pnj1P\nPfXUBRdcMGHChP7+/qamJiHEwMCAejvxePxXv/rVnj173njjjc9+9rNf//rXL7nkkh/96EeHDh36\n4Q9/eOedd/74xz+Ox+N+pW+X53nevn37MplMKpWqr69PJBKxWEzXdTUAWOTGM5nMm2++OXXqVM/z\nihl0reb6OZ4wdSWEME3TsqzPfOYzy5YtE0L09/ffcccdN99885IlS9rb25988slrr722Gj5oAACU\nFgESQK1R4cGyrNtuu60kG1y3bp0aRHJdt7m5eeXKlatXr/Z9/5Zbbqlsc6xuDrFt27bp06c3Nzcv\nXbr0i1/8ourv1RTK4Gmapl188cVr1679yEc+4vv+l7/85fvuu++pp56aNWuW67rqacHA3cDAwGmn\nnXbbbbc1Nze3trZKKXfv3t3S0rJhw4ZcLtfR0TEwMJBMJis+eqbr+qxZs84999wJEyZMmDChqanJ\nNM1Sbbyjo+Ppp59evnx58Zuq2vo5npB1NTAw0NDQsGTJEsdxNE3L5XL79+9/9913N2zY0Nraunfv\n3muvvTbq9y8BAAxHgARQs9TIz4ipEbZsNiuEUClr4cKF3/nOd1paWoQQR44cqZ7peSrLpdNp1coX\n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\nbZ0xY4YoyKXq+ZqmOY6jNqUekVJWsKkt/hSPqmqrH8/zcrmcKKif3t7eb37zm319fTfddNPmzZuF\nEJqm9fT0dHV1GYahMsD27dtvuummJ5988oEHHhBCbNmy5eWXX965c+dNN900MDCgtpxOp7u7uzVN\n6+vr8zyvu7tbCNHd3d3X15fP5x3H6e3tFUJkMhnXdQtrWB2oihwNQf2MgsL68Tyvv79fCJHNZtUf\nDd/31XTcE1dgb2+veoLgI6rRQYAEAOAY1G27TdP80CGRY9I0TUoZj8cbGhqklNu3b583b969997b\n2dlpGEYsFit/W6M+uf/FL34xc+bMc889d86cOZqm7dmz5+qrr9Y0bfXq1ffff78Qoq+v7/LLL588\nefLcuXPVe7nrrrsmT5582mmn/fznP/c877zzzrv00kvVEzRN27dv34svvrh///5Nmza99dZb6n29\n/fbbDz/8sHrRnp6eOXPm/I//8T9mz5798ssvO47T3t7+9NNPT548+eqrr+7u7lbNbpmPhhDCMIx4\nPG5ZlmVZiUQikUioDludu8qqtvpRL9fd3X3BBReosz9v3jxN03K53KpVq+bPnz8wMKBy3XPPPTdx\n4sQLL7zwrrvuUh89/OVf/qXjOI899ti//du/CSF27ty5dOnSxx57TH2aMDAwMGPGjHPPPff888//\nl3/5l7//+7+fOXPmxz72sY9//OOTJ0/+0pe+NGfOnPnz50+aNOnSSy89//zzfd/fvXu3quF58+bJ\nyn0AQf2UlvoDtWnTJlU/d9xxh6Zp69atu+CCC6ZPn3766ae/9NJLUsqf/vSn6uyrvz+FFSilVFs4\n/fTTL7jggquuuiqXy1Xqz0ttYxEdAACO4eDBgwcOHAhu4zEyPT09atqYGo1Zs2bNhg0bbrzxxmuu\nucY0zXK2Neq1crnc7bfffvPNNy9ZsqS9vf2JJ5748z//8127dj388MO7d+/+wQ9+kM/nr7rqqiVL\nlvyf//N/5s+f/5Of/CSfz2/btu3QoUMvvPDCnXfe+cMf/vC//uu/vvSlLy1YsGDu3LlPP/30kiVL\n/uAP/uDZZ5/93Oc+F7yQ53lqcMkwjAceeODdd9994403nnrqqTvuuGPLli3/9m//9vLLL7/xxhvL\nly9fs2bN+vXrbdsu8gZ3IzggHR0d77zzTi6XU4vuJpNJNQtOVs3kt+qpH0XX9UOHDt19990LFiyY\nM2fO888/v2jRolgs9pnPfGbZsmVCiGw2e/311//DP/zDZZdddskll7S3t0+ZMuXP/uzP1q9ff+ut\nt5522mlCCNM0W1pavv/976vA+e67744fP37Xrl0LFy7ctGlTPB4///zzL7300meffXbHjh2PP/54\nR0fHY489NmvWrFWrVh04cODdd9+95557PvvZzy5durS9vf3JJ5+89tpri/z/dARGqX6klGqQLR6P\n9/X1yeLicbXVzwn4vq9pWjab/fM//3NVP+3t7QsWLNA0LZ/P//znP9+yZcuXvvSlCy+88Atf+MLn\nP//5pUuXTps27Zlnnlm8eHFhBQoh/uVf/uWpp5664IILJkyY0N/fb1lWVb3T2kCABABgqLa2tra2\ntk2bNhW5nVwuFywcouu667rvv//+2rVrzzvvPMuyyrysha7ruVxu//7977777oYNG1pbW3/1q1/9\n2Z/92b333ptKpe64446JEyceOXLkX//1X1944YVYLPbyyy+7rnvLLbe0trZu2LAhl8t1dnam0+nT\nTz/9k5/8ZCqVmj59+rZt266++urOzs7e3l61iEUsFhNCqDEQ9brd3d3z589vamr61Kc+tXbt2vfe\ne++MM8647bbbmpubTzvtNDUlsvw8z9u3b18mk0mlUvX19YlEIhaL6bquBnAqskvDVVX9CCEGBgZO\nPfXUq666qq6uTp39K6+8MpVKLVmyxHEcTdMGBgZaW1vnzZs3bty4OXPmPPfccwsWLDhy5Mitt966\ndevWLVu2CCF6eno+8YlPqNmq8Xj8jDPOuP766++5556jR4+ef/75r7/++vjx46WUCxcu/MM//EPX\ndROJxGmnnXbqqacuXLjwkUceef/99998883f/e53qob37t177bXXln+h0VGtn0wm8+abb06dOtXz\nvGLuhVNt9XNiUsoh9bNz507Lsj7xiU+0tLR88pOf/OIXv5jJZN5+++3Cs3/11VePGzdOVaDv+6Zp\n3nPPPffdd99TTz01a9YsNaqJkiNAAgDw/6jmz7Ks2267rSQbXLdunRoEcF23ubl55cqVq1ev9n3/\nlltuKf/a+qplXLBgQSKRWLx4sVpt4pVXXhk/fry66aWU0jRN9bQXX3xR07R4PN7W1rZw4UIp5dKl\nS+PxeLB4pmptNU1TAyZqCHH4h/19fX2WZRXuQzCJznGcSt1gQNf1WbNmnXvuuRMmTJgwYUJTU1OZ\n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\n", "text/plain": [""]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyensae.graphhelper import draw_diagram\n", "img = draw_diagram(\"\"\"\n", "blockdiag {{\n", "{0}\n", "}}\n", "\"\"\".format(racine.dessin()))\n", "img"]}, {"cell_type": "code", "execution_count": 10, "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}