Nếu có 2 algorthims tính kết quả tương tự với độ phức tạp khác nhau, O (log n) có luôn nhanh hơn không? Nếu vậy hãy giải thích. BTW đây không phải là một câu hỏi chuyển nhượng.O (log n) luôn luôn nhanh hơn O (n)
Trả lời
No. Nếu một thuật toán chạy trong N/100
và một thuật toán khác trong (log N)*100
, thì thuật toán thứ hai sẽ chậm hơn đối với kích thước đầu vào nhỏ hơn. Sự phức tạp tiệm cận là về hành vi của thời gian chạy khi kích thước đầu vào đi đến vô cùng.
để O (n) có thể nhanh hơn O (log n) cho đầu vào cực nhỏ? – Varkolyn
1 * n là O (n). 10000000000000000000000000000000 * (log n) là O (log n). Trong trường hợp này, O (n) sẽ không chỉ nhanh hơn trên đầu vào cực nhỏ. Nhưng khi "n" phát triển theo hướng vô cùng, * cuối cùng * O (log n) sẽ nhanh hơn. –
@Varkolyn: Không nhất thiết * cực kỳ *. Tùy thuộc vào thuật toán, điểm giao cắt có thể rất lớn trong * n *! – kkm
Không, nó sẽ không phải lúc nào cũng nhanh hơn. NHƯNG, khi kích thước vấn đề lớn dần và lớn hơn, cuối cùng là bạn sẽ luôn đạt đến điểm mà thuật toán O (log n) nhanh hơn so với O (n).
Trong các tình huống thực tế, thường là điểm mà thuật toán O (log n) vượt qua thuật toán O (n) sẽ đến rất nhanh. Có sự khác biệt lớn giữa O (log n) và O (n), giống như có sự khác biệt lớn giữa O (n) và O (n^2).
Nếu bạn có cơ hội đọc Ngọc trai lập trình bởi Jon Bentley, có một chương tuyệt vời ở đó, trong đó có một thuật toán O (n) so với O (n^2) cho O (n^2) lợi thế. (Anh ta mã hóa thuật toán O (n^2) trong C trên Alpha và thuật toán O (n) trong diễn giải BASIC trên một Z80 cũ hoặc thứ gì đó, chạy ở khoảng 1MHz.) Thật đáng ngạc nhiên khi O (n) nhanh đến mức nào thuật toán vượt qua O (n^2) một.
Thỉnh thoảng, bạn có thể tìm thấy một thuật toán rất phức tạp có độ phức tạp tốt hơn một chút so với một thuật toán đơn giản hơn. Trong trường hợp như vậy, đừng mù quáng chọn thuật toán với một big-O tốt hơn - bạn có thể thấy rằng nó chỉ nhanh hơn trên các vấn đề cực lớn.
- 1. Ví dụ về các thuật toán có các phức tạp O (1), O (n log n) và O (log n)
- 2. Ký hiệu Big Oh O ((log n)^k) = O (log n)?
- 3. Sự khác biệt giữa O (n) và O (log (n)) - cái nào tốt hơn và chính xác là O (log (n)) là gì?
- 4. Làm thế nào để bạn hình dung sự khác biệt giữa O (log n) và O (n log n)?
- 5. O (log (log (n)))) có nghĩa là gì?
- 6. Ví dụ về O (n!)?
- 7. Biến bit là O (1) hoặc O (n)?
- 8. Thuật toán khoảng cách Levenshtein tốt hơn O (n * m)?
- 9. Nơi để tìm thấy những gì O (n^2) và O (n) vv có nghĩa là?
- 10. Tháp giải pháp Hà Nội tốt hơn O (2^n)?
- 11. Thuật toán O (n) để tìm ra phần tử xuất hiện nhiều hơn n/2 lần
- 12. Giá trị của RAND_MAX luôn luôn (2^n) -1?
- 13. Tại sao hợp nhất sắp xếp trường hợp xấu nhất thời gian chạy O (n log n)?
- 14. Tại sao độ dài trường SQL luôn luôn (2^n) -1 trừ khi nhỏ hơn 127?
- 15. Tại sao độ phức tạp của container bản đồ C++ STL O (log (n))?
- 16. Đếm chuỗi con xuôi ngược trong thời gian O (n)
- 17. Big Oh for (n log n)
- 18. Điều này có nghĩa là: các bước O (n) và không gian O (1)?
- 19. Tìm nếu một mảng là một chuỗi trong thời gian O (n) và O (1)
- 20. Tôi có nên xem xét memmove() O (n) hoặc O (1) không?
- 21. Là nhật ký (n!) = Θ (n · log (n))?
- 22. Tại sao tên miniKanren luôn kết thúc bằng `o`?
- 23. Thời gian chạy của thủ tục nối thêm O (n)?
- 24. Tại sao bong bóng sắp xếp O (n^2)?
- 25. chứng minh n = Big-O (1) sử dụng cảm ứng
- 26. Chuyển đổi heap thành BST trong thời gian O (n)?
- 27. Làm thế nào để viết một loại tồi tệ hơn O (n!)
- 28. Tìm số tối thiểu cục bộ trong ma trận n x n trong thời gian O (n)
- 29. Big O, độ phức tạp của việc tổng hợp một chuỗi số n là bao nhiêu?
- 30. Ký hiệu big-O là gì? Làm thế nào để bạn đưa ra con số như O (n)?
Sẽ luôn nhanh hơn nếu đủ lớn * n *. – Phonon