contains_duplicates.py
def contains_duplicates(array):
for i, outer in enumerate(array):
for j, inner in enumerate(array):
if i != j and outer == inner:
return True
return False
array = [0, 2, 5, 8, 3, 5, 3, 1, 7, 9]
has_dupes = contains_duplicates(array)
# has_dupes = True
if
-Anweisungen vorkommen* Im Allgemeinen wird hier mit
i = i + 1 # O(1)
j = 10 * i # O(1)
n
: Komplexität des Schleifenkörpers mal Anzahl der Schleifendurchläufei = 0
while i < 10:
i = i + 1 # O(1)
# = O(n * 1) = O(n)
i = 0 # O(1)
while i < 10:
#do something... # O(...)
i = i + 1 # O(n)
j = 10 * i # O(1)
# = O(n) + O(1) + O(...)
i = 1
while i < 10:
i = i * 2 # O(1)
# = O(log(n)), da Inkrement exponentiell
element_in_list.py
def element_in_list(array, element):
for array_elem in array:
if array_elem == element:
return True
return False
array = [0, 2, 5, 8, 3, 4, 6, 1, 7, 9]
has_element = element_in_list(array, 4)
# has_element = True
0
→ list.insert(0, x)
fügt ein Element x
am Anfang einer Liste ein
Die Länge der Liste hat keine Auswirkung auf die Operation:
np.insert(arr, i, x)
fügt x
an der Position i
in ein Array ein
Die Länge des Arrays hat einen Einfluss auf die Operation:
Bildquelle: [Althoff 2021]
time_complexity_dft.ipynb
x = 1 # O(1)
n = 5 # O(1)
for i in range(1, n + 1): # range is like a generator (saves memory)
x = x * i # O(1), da x immer wieder überschrieben
# = O(1)
time_and_space_complexity_factorial.py
def factorial_iterative(n):
"""Iterative implementation of the factorial function with O(1)."""
result = 1
for i in range(1, n + 1):
result *= i
return result
def factorial_recursive(n):
"""Recursive implementation of the factorial function with O(n)."""
if n == 0:
return 1
else:
return n * factorial_recursive(n - 1)
2 * n * n + 1
O(n)