diff --git a/TD02/INF-TC1-td02.ipynb b/TD02/INF-TC1-td02.ipynb index 092659048d6cc797ec369bdd6a055c5e4a1431c8..02477689ac7145d8203ba223bc378c9cd93db8b7 100644 --- a/TD02/INF-TC1-td02.ipynb +++ b/TD02/INF-TC1-td02.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "fab957ee", + "id": "6e217066", "metadata": {}, "source": [ "NAME:" @@ -38,7 +38,7 @@ "1) Répondez aux questions dans les cellules en dessous des questions.\n", "\n", "2) Votre code devra remplacer le texte suivant : \n", - "\n", + "erge\n", "```python\n", "# YOUR CODE HERE\n", "raise NotImplementedError()\n", @@ -788,7 +788,7 @@ "id": "5f3fc128-2a2e-42bd-924a-d691c09150d6", "metadata": {}, "source": [ - "Nous allons maintenant implémenter **arbre binaire complet**. Cet arbre sera utile pour l'exercice suivant et la création d'un Tas. Cet arbre (dans sa configuration [min-heap](https://en.wikipedia.org/wiki/Min-max_heaphttps://en.wikipedia.org/wiki/Min-max_heap), où les données sont renvoyées par ordre croissant) satisfait la propriété suivante : la valeur de tout noeud est inférieure à celle de ses enfant. Cet arbre binaire sera de surcroît implémenté en utilisant un tableau (car il s'agit d'un arbre _complet_ où tous les niveaux sont remplis, sauf éventuellement le dernier). L'arbre binaire possède des noeuds ayant un index $i$, avec un fils gauche et un fils droit. Le tableau et l'arbre sont reliés de la façon suivante : \n", + "Nous allons maintenant implémenter **arbre binaire complet**. Cet arbre sera utile pour l'exercice suivant et la création d'un Tas. Cet arbre binaire sera implémenté en utilisant un tableau (car il s'agit d'un arbre _complet_ où tous les niveaux sont remplis, sauf éventuellement le dernier). L'arbre binaire possède des noeuds ayant un index $i$, avec un fils gauche et un fils droit. Le tableau et l'arbre sont reliés de la façon suivante : \n", "\n", "- La racine a la position $i = 0$ (cette valeur sera renvoyée par la fonction `get_racine`)\n", "- Le parent a la position $\\lfloor (i - 1)/ 2 \\rfloor$ (fonction `get_parent`)\n", @@ -796,15 +796,15 @@ "- Le fils droit a la position $2 \\times i + 2$ (fonction `get_fils_droit`)\n", "\n", "```\n", - " 3\n", + " 1\n", " / \\\n", " 2 5\n", " / \\ /\n", - " 1 4 6 \n", + " 3 4 6 \n", " \n", "\n", "La liste correspondante :\n", - "[3, 2, 5, 1, 4, 6]\n", + "[1, 2, 5, 3, 4, 6]\n", "```\n" ] }, @@ -875,12 +875,12 @@ }, "outputs": [], "source": [ - "L = [3, 2, 5, 1, 4, 6]\n", - "tree_empty = BinaryTree(L)\n", - "assert tree_empty.taille() == len(L) # 6\n", - "assert tree_empty.get_racine() == L[0] # 3\n", - "assert tree_empty.get_fils_gauche()[0] == L[2*0+1] # 2\n", - "assert tree_empty.get_fils_droit()[0] == L[2*0+2] # 5" + "L = [1, 2, 5, 3, 4, 6]\n", + "tree_values = BinaryTree(L)\n", + "assert tree_values.taille() == len(L) # 6\n", + "assert tree_values.get_racine() == L[0] # 3\n", + "assert tree_values.get_fils_gauche()[0] == L[2*0+1] # 2\n", + "assert tree_values.get_fils_droit()[0] == L[2*0+2] # 5" ] }, { @@ -891,6 +891,55 @@ "Cette structure de donnée sera utile pour la question suivante afin de créer un `Tas`." ] }, + { + "cell_type": "markdown", + "id": "5f35e9de-025f-4c89-a004-a24af997474a", + "metadata": {}, + "source": [ + "**Exercice 3.3** - L'abre que vous venez de créer sera utilisé dans l'exercice suivant afin de créer un tas. Pour cela nous devrons nous assurer que l'arbre atisfait la propriété suivante : la valeur de tout noeud est inférieure à celle de ses enfant. Ecrire une fonction de parcours de l'arbre qui renvoie `True` si cette propriété est vérifée, sinon `False`. Conseil : \n", + "\n", + "1. Proposez une approche récursive\n", + "2. Le cas d'arrêt est un noeud vide\n", + "3. L'appel récursif est déclanché en fonction de la valeur du noeud en cours et celle de ses enfants" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11065fbe-7209-4e87-8b9c-04d19d14fcee", + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "fc1f2a4ce40504acecf986a88152ab86", + "grade": false, + "grade_id": "cell-f45461f84548c912", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def check_min_tree(T, i=0):\n", + " # YOUR CODE HERE\n", + " raise NotImplementedError()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da01b2ab-4633-443f-97ea-b1022bc714ef", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "assert check_min_tree(tree_values) == True" + ] + }, { "cell_type": "markdown", "id": "d9f0166d-d12f-42a1-989a-b7014117e73d", @@ -900,7 +949,9 @@ "source": [ "## Exercice 4 (Bonus) : Création d'un tas et tri par tas\n", "\n", - "Une structure de donnée de `Tas` permet de réduire la complexité de manipulation d'une file de priorité. La particularité de cette méthode est de répartir le coût de la recherche du plus petit élément (qui sera renvoyé) entre l'ajout et la suppression. " + "Nous allons désormais créer une nouvelle structure de donnée : le `Tas`. Celle-ci permettra à termes de réduire la complexité de manipulation d'une file de priorité, en répartissant le coût de la recherche du plus petit élément (qui sera renvoyé) entre l'ajout et la suppression.\n", + "\n", + "Nous nous baserons pour cela sur l'arbre binaire de la question précédente, qui est dit dans une configuration [min-heap](https://en.wikipedia.org/wiki/Min-max_heaphttps://en.wikipedia.org/wiki/Min-max_heap), où les données sont renvoyées par ordre croissant." ] }, { diff --git a/TD03/INF-TC1-td03.ipynb b/TD03/INF-TC1-td03.ipynb index 4bd31c9af58a7eb3a85a03e0b253ab92141b0cd9..44d251d30d9b0218ac32c4d4bd34761f5b6e9292 100644 --- a/TD03/INF-TC1-td03.ipynb +++ b/TD03/INF-TC1-td03.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "a4c364d0", + "id": "c71aca63", "metadata": {}, "source": [ "NAME:" @@ -31,9 +31,12 @@ "id": "b0997389-5a87-4e8d-9600-29ed76e01759", "metadata": {}, "source": [ - "### IMPORTANT A LIRE (SUR L'UTILISATION DE CE NOTEBOOK)\n", + "<details style=\"border: 1px\">\n", + "<summary> RAPPELS SUR L'UTILISATION DES NOTEBOOKS</summary>\n", "\n", - "Le but de votre travail est de répondre aux questions des exercices en **remplissant certaines cellules de ce notebook avec votre solution**. Ces cellules, une foit remplies et lancées au fur et à mesure de vos avancées, permettront de valider des tests écrits dans d'autres cellules de ce notebook. **Il est donc important de bien suivre les instructions et répondre aux questions dans l'ordre**, et ne pas changer le nom des fonctions et/ou les cellules. Pour résumer :\n", + "### Comment utiliser ces notebooks ?\n", + "\n", + "Le but de votre travail est de répondre aux questions des exercices en **remplissant certaines cellules de ce notebook avec votre solution**. Ces cellules, une foit remplies et lancées au fur et à mesure de vos avancées, permettront de valider des tests écrits dans d'autres cellules de ce notebook. **Il est donc important de bien suivre les instructions et répondre aux questions dans l'ordre**, et ne pas changer le nom des fonctions et/ou les cellules. En particulier :\n", " \n", "1) Répondez aux questions dans les cellules en dessous des questions.\n", "\n", @@ -46,15 +49,12 @@ "\n", "(vous pouvez effacer ces deux lignes quand vous les rencontrez mais ne modifiez pas les noms de fonctions sinon les tests ne marchent plus).\n", "\n", - "3) Exécuter enfin les cellules dans l'ordre d'apparition, de haut en bas et si votre code est correct alors les tests (sous forme d'`assert` seront validés (ils ne lanceront pas d'exception du type `AssertionError` ). Vous pouvez lancer plusieurs fois la même cellule cela ne pose pas de soucis.\n", + "3) Exécuter enfin les cellules dans leur ordre d'apparition, de haut en bas et si votre code est correct alors les tests (sous forme d'`assert` seront validés (ils ne lanceront pas d'exception du type `AssertionError` ). Vous pouvez lancer plusieurs fois la même cellule, cela ne pose pas de soucis.\n", " \n", "4) Vous pouvez créer de nouvelles cellules comme bon vous semble.\n", "\n", "**En cas de problème, une solution est de relancer les cellules depuis le début du notebook une par une.** Pensez à bien sauvegarder ce notebook et ne pas le remplacer par un notebook qui a le même nom.\n", - "\n", - "\n", - "## Chargement de fonctions\n", - "_Les fonctions ci-dessous seront nécessaire afin de mener à bien ce TD. Il faut donc les charger en exécutant leur cellulle. Ne pas les modifier._" + "</details>" ] }, { @@ -134,7 +134,7 @@ "outputs": [], "source": [ "class Node:\n", - " def __init__(self, value : int, left : Node = None, right : Node = None):\n", + " def __init__(self, value : int, left = None, right = None):\n", " self.value = value\n", " self.left = left\n", " self.right = right" @@ -716,18 +716,10 @@ "source": [ "## Pour aller plus loin\n", "\n", - "- Rajouter des tests dans les exemples ci-dessus avec des arbres plus complexes\n", - "- Inclure des Exceptions dans votre code\n", + "- Rajouter des tests dans les exemples ci-dessus avec des arbres plus complexes, des cas particuliers, etc.\n", + "- Inclure des Exceptions dans votre code afin de gérer par exemple l'accès à un index de liste inexistant, etc.\n", "- Créer une table de hachage afin de mémoriser les opérations déja réalisées pour l'arbre syntaxique" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9cbffdb0-7d54-4054-b13d-fd1dc1afd0f2", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": {