vấn đề giải thích thời gian chạy vòng lặp đơn


8

Tôi đang phân tích một số thời gian chạy của các vòng lặp khác nhau và khi tôi có thêm kiến ​​thức, tôi tò mò muốn hiểu vấn đề này mà tôi vẫn chưa tìm ra. Tôi có bài tập này tên là "Có bao nhiêu ngôi sao được in":

for (int i = N; i > 1; i = i/2) System.out.println("*");

Câu trả lời để chọn là A: ~log N B: ~N C: ~N log N D: ~0.5N^2

Vì vậy, câu trả lời nên là A và tôi đồng ý với điều đó, nhưng ở phía bên kia .. Hãy nói sau đó N = 500sẽ Log Nlà gì? Nó sẽ là 2,7. Vậy điều gì sẽ xảy ra nếu chúng ta nói điều đó N=500trong bài tập của chúng ta ở trên? Điều đó chắc chắn sẽ in nhiều hơn han 2,7 sao? Làm thế nào là liên quan?

Bởi vì thật hợp lý khi nói rằng nếu vòng lặp for trông như thế này:

for (int i = 0; i < N; i++)

Nó sẽ in Nsao.

Tôi hy vọng sẽ tìm thấy một lời giải thích cho vấn đề này ở đây, có lẽ tôi đang diễn giải tất cả những điều này sai và nghĩ về nó theo cách xấu. Cảm ơn trước.


Điều này khác với câu hỏi trước của bạn như thế nào? Thời gian chạy không triệu chứng của các vòng lặp
gnat

Điều này không có gì để làm với thời gian chạy tiệm cận.
owwyess

1
Tùy chọn đó chỉ có ý nghĩa nếu logarit cơ sở 2 có nghĩa, không phải logarit cơ sở 10.
Kilian Foth

3
Cơ sở nào bạn giả định để có được Log 500 = 2.7? và cơ sở đó xuất hiện bất cứ nơi nào trong mã của bạn? Nb bạn chỉ là một nhân tố bất biến khác nhau với nhật ký của các căn cứ khác nhau
Caleth

2
@Caleth hàm logarit cơ số không xuất hiện trong các mã: i = i/2cơ sở là hai vì vòng lặp được đảo ngược nhân lặp đi lặp lại bởi hai.

Câu trả lời:


34

Bạn đã bỏ qua đặc điểm chính của cơ sở logarit .

iđược chia cho 2 trong mỗi lần lặp, thời gian chạy là logarit với cơ sở 2. Và

log 2 (500) ~ 8,9

Những gì bạn đang nhìn là

đăng nhập 10 (500) ~ 2.7

(logarit với cơ sở 10)

Nhân tiện, lý do tại sao cơ sở thường bị bỏ qua trong các cuộc thảo luận về thời gian chạy (và máy tính của bạn có thể không có nút cho nhật ký 2 ) là do các cơ chế của toán học logarit, một cơ sở khác tương ứng với một yếu tố không đổi và do đó không liên quan khi bạn bỏ qua các yếu tố không đổi. Nó có thể được tính toán dễ dàng:

log a (x) = log b (x) / log b (a)


Điều này hoàn toàn có ý nghĩa, vì vậy thực sự chỉ là tôi thiếu kiến ​​thức về logarit. Cảm ơn câu trả lời đơn giản và rõ ràng.
owwyess

Cảm ơn @Michael Borgwardt. Bất kỳ cơ hội nào bạn có thể đưa ra ví dụ trên với N = 500. Làm thế nào tôi có thể tính toán điều đó trên một máy tính chỉ có cơ sở đăng nhập 10?
owwyess

2
@owwyess bạn chia kết quả log10 cho log10 (2)
ratchet freak

Xin lỗi tôi đã nhầm lẫn bản thân và chia cho log10 (10). Cảm ơn tất cả.
owwyess

2
Hệ số không đổi được đề cập trong đoạn cuối là khoảng 3.322 cho cơ sở 2. Tức là bạn cần ~ 3,3 chữ số nhị phân cho một chữ số thập phân. Hoặc nếu bạn nói đúng hơn, một nhị phân 33 chữ số là ~ 10 chữ số thập phân.
Thuyền trưởng Hươu cao cổ

8

Ngoài câu trả lời của Michael Borgwardt , ký tự dấu ngã trước mỗi câu trả lời nên được đọc là "tỷ lệ thuận". Vì vậy, nếu bạn nhân đôi N (giả sử, từ 500 lên 1000), bạn sẽ thấy thời gian chạy (hoặc, trong trường hợp này, số sao được in) sẽ tăng theo hệ số tương đương với (log1000 / log 500), đó là độc lập với cơ sở mà bạn sử dụng.


2
Tôi luôn hiểu dấu ngã có nghĩa là gần đúng, không tỷ lệ. Về cơ bản, ~là một tốc ký cho .
Thưởng thức Ždralo

1
Tỷ lệ thuậnbiểu tượng không ~! Nó ~được sử dụng để chỉ ra các mối quan hệ tương đương hoặc các đẳng thức gần đúng (xem trang của wikipedia về dấu ngã ).
Bakuriu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.