时间复杂度最小数组数
Time complexity min num of array
我刚开始在 Python 学习数据结构和算法,并遇到了以下问题:
"Write two Python functions to find the minimum number in a list. The first function should compare each number to every other number on the list. O(n^2). The second function should be linear O(n)."
from misc.decorator_timer import my_timer
def main():
"""
Finds the minimum number in a list
findMin1: O(n^2)
findMin2: O(n)
"""
findMin1(list(range(10**6)))
findMin1(list(range(10**7)))
findMin2(list(range(10**6)))
findMin2(list(range(10**7)))
@my_timer
def findMin1(array):
"""Finds min number in a list in O(n^2) time"""
for i in range(len(array)):
min_val = array[i]
for num in array:
if num < min_val:
min_val = num
return min_val
@my_timer
def findMin2(array):
"""Finds min number in a list in O(n) time"""
min_val = array[0]
for num in array:
if num < min_val:
min_val = num
return min_val
if __name__ == '__main__':
main()
我用下面制作的计时器装饰器对其进行了测试:
# ./misc/decorator_timer.py
import time
from functools import wraps
def my_timer(func):
"""Adds how long it took to run"""
@wraps(func)
def wrapper(*args, **kwargs):
t0 = time.time()
result = func(*args, **kwargs)
timedelta = time.time() - t0
print(f'\nfunction:\t"{func.__name__}"\nruntime:\t {timedelta:.08} sec')
return result
return wrapper
这是我得到的结果:
function: "findMin1"
runtime: 0.03258419 sec
function: "findMin1"
runtime: 0.35547304 sec
function: "findMin2"
runtime: 0.035234928 sec
function: "findMin2"
runtime: 0.33552194 sec
显然线性更好,但为什么 findMin1
呈线性增长,而不是预期的二次方增长?
return 语句在外循环中,因此您只执行一次外循环,然后立即return。因此,第一种方法的复杂度为 O(n)。
如果你取消缩进 return min_val
一次,将它移到外部 for 循环之外,你会得到二次复杂度。
我刚开始在 Python 学习数据结构和算法,并遇到了以下问题:
"Write two Python functions to find the minimum number in a list. The first function should compare each number to every other number on the list. O(n^2). The second function should be linear O(n)."
from misc.decorator_timer import my_timer
def main():
"""
Finds the minimum number in a list
findMin1: O(n^2)
findMin2: O(n)
"""
findMin1(list(range(10**6)))
findMin1(list(range(10**7)))
findMin2(list(range(10**6)))
findMin2(list(range(10**7)))
@my_timer
def findMin1(array):
"""Finds min number in a list in O(n^2) time"""
for i in range(len(array)):
min_val = array[i]
for num in array:
if num < min_val:
min_val = num
return min_val
@my_timer
def findMin2(array):
"""Finds min number in a list in O(n) time"""
min_val = array[0]
for num in array:
if num < min_val:
min_val = num
return min_val
if __name__ == '__main__':
main()
我用下面制作的计时器装饰器对其进行了测试:
# ./misc/decorator_timer.py
import time
from functools import wraps
def my_timer(func):
"""Adds how long it took to run"""
@wraps(func)
def wrapper(*args, **kwargs):
t0 = time.time()
result = func(*args, **kwargs)
timedelta = time.time() - t0
print(f'\nfunction:\t"{func.__name__}"\nruntime:\t {timedelta:.08} sec')
return result
return wrapper
这是我得到的结果:
function: "findMin1"
runtime: 0.03258419 sec
function: "findMin1"
runtime: 0.35547304 sec
function: "findMin2"
runtime: 0.035234928 sec
function: "findMin2"
runtime: 0.33552194 sec
显然线性更好,但为什么 findMin1
呈线性增长,而不是预期的二次方增长?
return 语句在外循环中,因此您只执行一次外循环,然后立即return。因此,第一种方法的复杂度为 O(n)。
如果你取消缩进 return min_val
一次,将它移到外部 for 循环之外,你会得到二次复杂度。