Tôi đã nhận thấy câu trả lời trên tràn ngăn xếp sử dụng các thuật ngữ như thế này, nhưng tôi không biết ý nghĩa của chúng. Họ được gọi là gì và có một nguồn tài nguyên tốt có thể giải thích chúng một cách đơn giản không?Nơi để tìm thấy những gì O (n^2) và O (n) vv có nghĩa là?
Trả lời
Đó ký hiệu được gọi là Big O notation, và được sử dụng như một kí hiệu để thể hiện độ phức tạp thuật toán (về cơ bản bao lâu một algorithim nhất định sẽ làm để chạy như kích thước đầu vào (n) phát triển)
Nói chung, bạn sẽ chạy thành các loại chủ yếu sau đây của algorithims:
- O (1) - liên tục - chiều dài của thời gian đó algorithim này cần để hoàn thành không phụ thuộc vào số lượng các mục mà algorithim có để xử lý.
- O (log n) - lôgarít - Khoảng thời gian mà thuật toán này cần để hoàn thành phụ thuộc vào số lượng mục mà thuật toán phải xử lý. Khi kích thước đầu vào trở nên lớn hơn, cần ít thời gian hơn cho mỗi đầu vào mới.
- O (n) - Tuyến tính - Khoảng thời gian mà thuật toán này cần để hoàn thành phụ thuộc trực tiếp vào số lượng mục mà thuật toán phải xử lý. Khi kích thước đầu vào tăng lên, thời gian cần tăng theo số lượng bằng nhau.
- O (n^2) - Đa thức - Khi kích thước đầu vào tăng, thời gian cần để xử lý đầu vào tăng lên bởi số lượng lớn hơn và lớn hơn - có nghĩa là kích thước đầu vào lớn trở nên khó giải quyết.
- O (2^n) - Số mũ - Các loại vấn đề phức tạp nhất. Thời gian để xử lý tăng dựa trên kích thước đầu vào đến một mức độ cực đoan.
Nói chung, bạn có thể nhận được đánh giá sơ bộ về độ phức tạp của thuật toán bằng cách xem cách nó được sử dụng. Ví dụ, nhìn vào phương pháp sau đây:
function sum(int[] x) {
int sum = 0;
for (int i = 0; i < x.length; i++) {
sum += x[i];
}
return sum;
}
Có một vài điều mà phải được thực hiện ở đây:
- Khởi tạo một biến gọi là tổng
- khởi tạo một biến gọi là i
- cho mỗi lần lặp của i: Thêm x [i] để tính tổng, thêm 1 vào i, kiểm tra nếu i nhỏ hơn x.chiều dài
- Return tổng
Có một vài hoạt động mà chạy trong thời gian liên tục ở đây (hai đầu tiên và cuối cùng), vì kích thước của x sẽ không ảnh hưởng đến bao lâu họ có được để chạy. Đồng thời, có một số hoạt động chạy trong thời gian tuyến tính (vì chúng được chạy một lần cho mỗi mục nhập trong x). Với Big O ký hiệu, các algorithim được đơn giản hóa đến phức tạp nhất, vì vậy tổng algorithim này sẽ chạy trong O (n)
Ryan, cho số 3 bạn có nghĩa là O (n). –
Cảm ơn vì đã bắt được :) –
Tôi nghĩ O (n * ln (n)) cũng không đáng tin cậy, vì đây là sự phức tạp của nhiều thuật toán phân loại –
Đọc khoảng Computational Complexity trước tiên, sau đó thử một số sách về các thuật toán như Introduction to Algorithms.
Từ trang Wikipedia:
Big O ký hiệu đặc trưng chức năng theo tốc độ tăng trưởng của họ
Nếu bạn không sẽ không để khoan sâu vào chi tiết, bạn có thể rất thường xuyên xấp xỉ thuật toán phức tạp bằng cách mã hóa mã của nó:
void simpleFunction(arg); // O(1) - if number of function instructions is constant and don't depend on number of input size
for (int i=0;i<n;i++) {simpleFunction(element[i]);} // O(n)
for (int i=0;i<n;i++) { // this one runs O(n^2)
for (int j=0;j<n;j++) {
simpleFunction(element[i]);
}
}
for (int i=0;i<n;i*=2) { // O(lgn)
simpleFunction(element[i]);
}
Đôi khi nó không đơn giản để ước tính hàm/thuật toán phức tạp ký hiệu O lớn trong suc h trường hợp amortized analysis được sử dụng. Mã trên chỉ nên phân phối nhanh hơn.
này được gọi là Big O notation và được sử dụng để định lượng mức độ phức tạp của thuật toán.
O (1) có nghĩa là thuật toán mất một thời gian liên tục bất kể có bao nhiêu dữ liệu để xử lý.
O (n) có nghĩa là tốc độ thuật toán tăng theo cách tuyến tính với lượng dữ liệu.
và cứ thế ...
Vì vậy, sức mạnh của n thấp hơn trong ký hiệu O, thuật toán của bạn càng tốt để giải quyết vấn đề. Trường hợp tốt nhất là O (1) (n = 0). Nhưng có một sự phức tạp vốn có trong nhiều vấn đề để bạn sẽ không tìm thấy một thuật toán lý tưởng như vậy trong gần như tất cả các trường hợp.
Câu trả lời là tốt cho đến nay. Thuật ngữ chính để tìm kiếm trên web là "Ký hiệu Big O".
Ý tưởng cơ bản đằng sau phép tính của "someformula là O (someterm)" là, khi biến của bạn đi đến vô cùng, "someterm" là một phần của công thức thống trị.
Ví dụ: giả sử bạn có 0.05*x^3 + 300*x^2 + 200000000*x + 10
. Đối với các kích thước rất thấp x (x == 1 hoặc x == 2), thì 200000000*x
sẽ là phần lớn nhất. Tại thời điểm đó một âm mưu của công thức sẽ trông tuyến tính. Khi bạn đi cùng, tại một số điểm, phần 300*x^2
sẽ lớn hơn. Tuy nhiên, nếu bạn tiếp tục làm x thậm chí lớn hơn, lớn như bạn quan tâm, phần 0.05*x^3
sẽ là lớn nhất, và cuối cùng sẽ hoàn toàn vượt qua các phần khác của công thức. Đó là nơi nó trở nên rõ ràng từ một đồ thị mà bạn đang xem xét một chức năng khối. Vì vậy, chúng tôi sẽ nói rằng công thức là O(x^3)
.
- 1. O (log (log (n)))) có nghĩa là gì?
- 2. Điều này có nghĩa là: các bước O (n) và không gian O (1)?
- 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. Tìm nếu một mảng là một chuỗi trong thời gian O (n) và O (1)
- 5. Biến bit là O (1) hoặc O (n)?
- 6. 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)
- 7. tùy chọn -O- có nghĩa là gì đối với wget?
- 8. O (log n) luôn luôn nhanh hơn O (n)
- 9. 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)?
- 10. Ký hiệu big-O là gì? Làm thế nào để bạn đưa ra con số như O (n)?
- 11. Ví dụ về O (n!)?
- 12. Tôi có nên xem xét memmove() O (n) hoặc O (1) không?
- 13. Big-O cho SQL là gì?
- 14. Ký hiệu Big Oh O ((log n)^k) = O (log n)?
- 15. Apple Mach-O Linker Cảnh báo Directory không tìm thấy
- 16. O (1) tìm kiếm băm?
- 17. Thuật toán O (n) để tìm ra phần tử xuất hiện nhiều hơn n/2 lần
- 18. tra cứu từ điển (O (1)) vs LINQ nơi
- 19. Đệ quy và Big O
- 20. Bị mắc kẹt với ký hiệu O
- 21. 1 (mod N) có nghĩa là gì?
- 22. C I/O chuẩn và UNIX cơ bản I/O
- 23. Chữ O được coi là có hại?
- 24. Tìm số tối thiểu cục bộ trong ma trận n x n trong thời gian O (n)
- 25. Hàm O lớn nhất của hàm oracles MAX là gì?
- 26. Làm thế nào để bạn tìm thấy khoảng cách lớn nhất trong một vector trong thời gian O (n)?
- 27. Thuật toán khoảng cách Levenshtein tốt hơn O (n * m)?
- 28. Tìm khoảng thời gian nhỏ nhất của chuỗi đầu vào trong O (n)?
- 29. Thêm cạnh mới vào biểu đồ và tìm cây bao trùm mới trong O (n)
- 30. Làm thế nào để tìm đỉnh mẹ trong biểu đồ được hướng trong O (n + m)?
Tôi sẽ không gọi nó là bản sao chính xác vì bạn đang yêu cầu ký hiệu được gọi là gì, nhưng hãy xem câu trả lời cho [Giải thích bằng tiếng Anh đơn giản của Big O] (http://stackoverflow.com/questions/487258/ plain-english-explain-of-big-o). –
Liên quan: http://stackoverflow.com/questions/107165, http://stackoverflow.com/questions/487258, et al. – Gumbo
Trang web này thật tuyệt vời. Tôi thích cách tôi nhận được câu trả lời tuyệt vời quá nhanh! – adam0101