Öncelikle bahsettiğim durum en kötü durum için, yani aradığımız elemanın en sonda olma ihtimali. Bu yüzden aranan değere, dizinin sonunda bulunan değeri yazıyorum. l ve r değerlerine, arama yapılan dizinin baş ve son indis değerleri verilecek. Kodu şu şekilde düzelttiğim zaman, ben de gözle görülür bir fark oluşuyor.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import timeit
kod1 = """
def f1(arr, x):
for i in range(len(arr)):
if arr[i] == x:
return i
return -1
arr = [i for i in range(10 ** 6)]
f1(arr, 10**6-1)
"""
kod2 = """
def f2(arr, l, r, x):
if r >= l:
mid = int(l + (r - l)/2)
if arr[mid] == x:
return mid
elif arr[mid] > x:
return f2(arr, l, mid-1, x)
else:
return f2(arr, mid + 1, r, x)
return -1
arr = [i for i in range(10 ** 6)]
f2(arr, 0,10**6,10**6-1)
"""
print(timeit.timeit(stmt = kod1,number=2))
# 0.7054800316010079
print(timeit.timeit(stmt = kod2,number=2))
# 0.29855470813155927
Ek olarak, zamandan bağımsız bir şekilde iki fonksiyonun kaç kez karşılaştırma işlemi yaptığını da şöyle basit bir şekilde görebiliriz
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def f1(arr, x):
global comparison
for i in range(len(arr)):
comparison += 1
if arr[i] == x:
return i
return -1
def f2(arr, l, r, x):
global comparison
comparison += 1
if r >= l:
mid = int(l + (r - l)/2)
if arr[mid] == x:
return mid
elif arr[mid] > x:
return f2(arr, l, mid-1, x)
else:
return f2(arr, mid + 1, r, x)
return -1
arr = [i for i in range(10 ** 6)]
comparison = 0
f1(arr,10**6-1)
print("Comparison 1: {}".format(comparison))
# sonuç: 1000000
comparison = 0
f2(arr,0,10**6,10**6-1)
print("Comparison 2: {}".format(comparison))
# sonuç: 19