diff --git a/Tp6/associations/dicotrie.py b/Tp6/associations/dicotrie.py index b863fbbe9ed5fb6a7a277ad1cb226cf0794cfdc5..1dddbd4964db3625efeefe8feb50e9e36ac8f726 100755 --- a/Tp6/associations/dicotrie.py +++ b/Tp6/associations/dicotrie.py @@ -34,7 +34,7 @@ class DicoTrie: $$$ repr(DicoTrie([Association('c', 3), Association('a', 2), Association('b', 1)])) "DicoTrie([Association('a', 2), Association('b', 1), Association('c', 3)])" """ - ... + return f"DicoTrie({self.liste_assos}" def __eq__(self, autre) -> bool: """ @@ -48,7 +48,12 @@ class DicoTrie: $$$ d1 == {"a": 1, "b": 2} False """ - ... + if len(self.liste_assos)==len(autre.liste_assos)or type (self)==type(autre): + for elt in self.liste_assos: + for elem in autre.liste_assos: + return True + else: + return False def __setitem__(self, cle: C, valeur: V) -> NoneType: """ @@ -57,7 +62,7 @@ class DicoTrie: $$$ d1 DicoTrie([Association("a", 1), Association("b", 2), Association("c", 3)]) """ - ... + self.liste_assos[cle]=valeur def __getitem__(self, cle: C) -> V: """ @@ -69,7 +74,7 @@ class DicoTrie: $$e d1['c'] KeyError """ - ... + return self.liste_assos[cle] def __delitem__(self, cle: C) -> NoneType: """ @@ -80,8 +85,11 @@ class DicoTrie: $$e del d1['c'] KeyError """ - ... - + if isinstance(cle,str): + self.supprime(cle) + else: + return KeyError + def __contains__(self, cle: C) -> bool: """ $$$ d1 = DicoTrie([Association("a", 1), Association("b", 2)]) @@ -90,7 +98,9 @@ class DicoTrie: $$$ 'c' in d1 False """ - ... + if isinstance(cle,str): + return self.contains(cle) + return False if __name__ == '__main__': import apl1test diff --git a/Tp6/associations/recherches.py b/Tp6/associations/recherches.py index fa01a60edb5f127fa4c6fc39cec77b295811ac45..cf4a50e64c65d65e29ee0a253e377bccfd69e84e 100755 --- a/Tp6/associations/recherches.py +++ b/Tp6/associations/recherches.py @@ -50,35 +50,53 @@ def indice_seq(elem: C, liste: list[C], comp: Callable[[C, C], int]) \ i=index return trouve,i -# -# def indice_dicho(elem: C, liste: list[C], comp: Callable[[C, C], int]) \ -# -> tuple[bool, int]: -# """Renvoie un couple (trouve, i) tel que: -# - si elem est un élément de liste, -# * trouve = True -# * i est l'indice de première occurence de elem dans liste -# - si elem n'est pas un élément de la liste : -# * trouve = False -# * pour tout j < i, liste[j] < liste[i] -# * pour tout j > i, liste[j] > liste[i] -# -# Précondition : comp est une fonction de comparaison et liste est triée pour comp -# -# $$$ def compare(x, y): return 0 if x == y else 1 if x > y else -1 -# $$$ indice_dicho(0, [1, 3, 5], compare) -# (False, 0) -# $$$ indice_dicho(3, [1, 3, 5], compare) -# (True, 1) -# $$$ indice_dicho(4, [1, 3, 5], compare) -# (False, 2) -# $$$ indice_dicho(5, [1, 3, 5], compare) -# (True, 2) -# $$$ indice_dicho(6, [1, 3, 5], compare) -# (False, 3) -# $$$ indice_dicho(42, [], compare) -# (False, 0) -# """ -# + +def indice_dicho(elem: C, liste: list[C], comp: Callable[[C, C], int]) \ + -> tuple[bool, int]: + """Renvoie un couple (trouve, i) tel que: + - si elem est un élément de liste, + * trouve = True + * i est l'indice de première occurence de elem dans liste + - si elem n'est pas un élément de la liste : + * trouve = False + * pour tout j < i, liste[j] < liste[i] + * pour tout j > i, liste[j] > liste[i] + + Précondition : comp est une fonction de comparaison et liste est triée pour comp + + $$$ def compare(x, y): return 0 if x == y else 1 if x > y else -1 + $$$ indice_dicho(0, [1, 3, 5], compare) + (False, 0) + $$$ indice_dicho(3, [1, 3, 5], compare) + (True, 1) + $$$ indice_dicho(4, [1, 3, 5], compare) + (False, 2) + $$$ indice_dicho(5, [1, 3, 5], compare) + (True, 2) + $$$ indice_dicho(6, [1, 3, 5], compare) + (False, 3) + $$$ indice_dicho(42, [], compare) + (False, 0) + """ + debut=0 + i=len(liste) + trouvr=False + fin=len(liste)-1 + while debut<= fin: + + + milieu=(debut+fin)//2 + if comp (elem,liste[milieu])==0: + + trouve=True + i=milieu + elif comp(elem,liste[milieu])<0: + fin=milieu-1 + else: + debut=milieu+1 + return trouve,i + +