Tôi đang cố gắng tìm ra độ phức tạp về thời gian (Big-O) của các hàm và cố gắng cung cấp lý do thích hợp.Độ phức tạp về thời gian của hàm
chức năng đầu tiên đi:
r = 0
# Assignment is constant time. Executed once. O(1)
for i in range(n):
for j in range(i+1,n):
for k in range(i,j):
r += 1
# Assignment and access are O(1). Executed n^3
như thế này.
Tôi thấy rằng đây là vòng lặp lồng nhau ba lần, vì vậy nó phải là O (n^3). nhưng tôi nghĩ lý do của tôi ở đây rất yếu. Tôi không thực sự có được những gì đang xảy ở bên trong vòng lặp lồng nhau triple đây
chức năng thứ hai là:
i = n
# Assignment is constant time. Executed once. O(1)
while i>0:
k = 2 + 2
i = i // 2
# i is reduced by the equation above per iteration.
# so the assignment and access which are O(1) is executed
# log n times ??
tôi phát hiện ra thuật toán này là O (1). Nhưng giống như chức năng đầu tiên, Tôi không thấy điều gì đang xảy ra trong vòng lặp while.
Ai đó có thể giải thích kỹ về độ phức tạp của hai hàm ? Cảm ơn!
vòng lồng nhau hầu như luôn là bậc hai trừ khi bạn đang thực hiện một số công việc liên tục, ví dụ thứ hai của bạn là 'log (n)'. –
Cảm ơn. Đối với ví dụ thứ hai, chúng ta có bỏ qua phần i = n không? – zakels
i = n chỉ là một nhiệm vụ, sau đó chúng ta chia đôi n mỗi lần lặp lại như bạn sẽ sử dụng tìm kiếm bisection –