Một số thuật toán mà chúng ta sử dụng hàng ngày có độ phức tạp O (1), O (n log n) và O (log n) là gì?
Một số thuật toán mà chúng ta sử dụng hàng ngày có độ phức tạp O (1), O (n log n) và O (log n) là gì?
Câu trả lời:
Nếu bạn muốn các ví dụ về Thuật toán / Nhóm câu lệnh có độ phức tạp về thời gian như đã cho trong câu hỏi, đây là một danh sách nhỏ:
O(1)
thời gianO(n)
thời gianTóm lại, tất cả các Thuật toán Brute Force, hoặc các thuật toán Noob yêu cầu tuyến tính, đều dựa trên độ phức tạp thời gian O (n)
O(log n)
thời gianO(n log n)
thời gianHệ số của 'log n' được đưa vào bằng cách xem xét Chia và Chinh phục. Một số thuật toán này là những thuật toán được tối ưu hóa tốt nhất và được sử dụng thường xuyên.
O(n^2)
thời gianNhững thuật toán này được cho là những thuật toán kém hiệu quả hơn nếu có mặt đối tác O (nlogn) của chúng. Ứng dụng chung có thể là Brute Force ở đây.
O(log n)
danh sách thành trước O(n)
danh sách để danh sách theo thứ tự từ tốt nhất đến tệ nhất. haha :)
Một ví dụ đơn giản về O(1)
có thể là return 23;
- bất kể đầu vào là gì, điều này sẽ trả về trong một thời gian cố định, hữu hạn.
Một ví dụ điển hình O(N log N)
là sắp xếp một mảng đầu vào với một thuật toán tốt (ví dụ: hợp nhất).
Một ví dụ điển hình nếu O(log N)
sẽ tìm kiếm một giá trị trong một mảng đầu vào được sắp xếp theo đường phân giác.
O (1) - hầu hết các quy trình nấu ăn là O (1), tức là phải mất một khoảng thời gian không đổi ngay cả khi có nhiều người hơn để nấu (ở một mức độ nào đó, vì bạn có thể hết dung lượng trong nồi / chảo của mình và cần phải chia nhỏ việc nấu ăn)
O (logn) - tìm thứ gì đó trong danh bạ điện thoại của bạn. Hãy suy nghĩ về tìm kiếm nhị phân.
O (n) - đọc sách, với n là số trang. Đây là khoảng thời gian tối thiểu để đọc một cuốn sách.
O (nlogn) - không thể nghĩ ngay đến điều mà người ta có thể làm hàng ngày đó là nlogn ... trừ khi bạn sắp xếp các thẻ bằng cách hợp nhất hoặc sắp xếp nhanh!
Tôi có thể cung cấp cho bạn một số thuật toán chung ...
Đây sẽ là những câu trả lời ruột vì điều này nghe giống như một dạng câu hỏi phỏng vấn / bài tập về nhà. Nếu bạn đang tìm kiếm thứ gì đó cụ thể hơn thì sẽ khó hơn một chút vì công chúng nói chung sẽ không có ý tưởng về việc triển khai cơ bản (Tất nhiên là mã nguồn mở ít) của một ứng dụng phổ biến, cũng như khái niệm nói chung không áp dụng cho một "ứng dụng"
Ô (1): tìm nước đi tiếp theo tốt nhất trong Cờ vua (hoặc cờ vây). Vì số lượng trạng thái trò chơi là hữu hạn nên chỉ có O (1) :-)
O(1)
nano giây, và bạn chắc chắn biết được O(1)
sẽ xảy ra đầu tiên ...
Độ phức tạp của ứng dụng phần mềm không được đo lường và không được viết bằng ký hiệu big-O. Nó chỉ hữu ích khi đo độ phức tạp của thuật toán và so sánh các thuật toán trong cùng một miền. Rất có thể, khi chúng ta nói O (n), chúng ta muốn nói rằng đó là "phép so sánh O (n) " hoặc "phép toán số học O (n)". Điều đó có nghĩa là, bạn không thể so sánh bất kỳ cặp thuật toán hoặc ứng dụng nào.
0 (logn) -Tìm kiếm nhị phân, phần tử đỉnh trong một mảng (có thể có nhiều hơn một đỉnh) 0 (1) -in python tính độ dài của một danh sách hoặc một chuỗi. Hàm len () mất 0 (1) lần. Việc truy cập một phần tử trong mảng mất 0 (1) thời gian. Thao tác đẩy trong một ngăn xếp mất 0 (1) lần. 0 (nlogn) -Sắp xếp hợp nhất. sắp xếp trong python mất nlogn thời gian. vì vậy khi bạn sử dụng listname.sort () sẽ mất nlogn thời gian.
Lưu ý-Tìm kiếm trong bảng băm đôi khi mất nhiều thời gian hơn là liên tục do va chạm.
O (2 N )
O (2 N ) biểu thị một thuật toán có tốc độ phát triển tăng gấp đôi với mỗi bổ trợ cho tập dữ liệu đầu vào. Đường cong tăng trưởng của một hàm O (2 N ) là hàm mũ - bắt đầu từ rất nông, sau đó tăng lên theo địa lý. Ví dụ về hàm O (2 N ) là phép tính đệ quy các số Fibonacci:
int Fibonacci (int number)
{
if (number <= 1) return number;
return Fibonacci(number - 2) + Fibonacci(number - 1);
}
Tower of Hanoi
sẽ là một ví dụ tốt hơn.