Trichotomie (ou pas)
This commit is contained in:
parent
76bb633de9
commit
c8f8de6a22
|
@ -127,3 +127,34 @@ for n in range(NB_ELEMENTS):
|
||||||
elements.append(LEXIQUE[randint(0, taille)])
|
elements.append(LEXIQUE[randint(0, taille)])
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def tricho(l, a, b, x):
|
||||||
|
"""
|
||||||
|
list, int, int, a → (bool, int)
|
||||||
|
Renvoie un tuple contenant un booléen indiquant si l'élément x est dans la liste l entre les
|
||||||
|
bornes [a, b[, ainsi que sa position le cas échéant, -1 sinon, par trichotomie.
|
||||||
|
CU : l une liste, a et b des ints tels que 0 ≤ a < b ≤ len(l)
|
||||||
|
"""
|
||||||
|
|
||||||
|
assert(type(l) == list), "l doit être une liste"
|
||||||
|
assert(type(a) == type(b) == int), "a et b doivent être des ints"
|
||||||
|
assert(0 <= a < b <= len(l)), "Il faut que 0 ≤ a < b ≤ len(l)"
|
||||||
|
|
||||||
|
d = a
|
||||||
|
f = b - 1
|
||||||
|
while d < f:
|
||||||
|
m1 = (d+f)//3
|
||||||
|
m2 = m1*2
|
||||||
|
if l[m1] < x:
|
||||||
|
d = m1+1
|
||||||
|
f = m2
|
||||||
|
elif l[m2] < x:
|
||||||
|
d = m2+1
|
||||||
|
else:
|
||||||
|
f = m1
|
||||||
|
est_dedans = x == l[d]
|
||||||
|
return (est_dedans, d if x == l[d] else -1)
|
||||||
|
|
||||||
|
|
||||||
|
print(dicho(LEXIQUE, 0, len(LEXIQUE), 'banane'))
|
||||||
|
print(tricho(LEXIQUE, 0, len(LEXIQUE), 'banane'))
|
Reference in a new issue