Nếu bạn muốn phân tích các thuật toán này, bạn cần xác định // do do, vì điều đó thực sự có thể thay đổi kết quả. Giả sử các công cụ đòi hỏi một số lượng hoạt động O (1) không đổi.
Dưới đây là một số ví dụ với ký hiệu mới này:
Ví dụ đầu tiên của bạn, truyền tải tuyến tính: điều này là chính xác!
TRÊN):
for (int i = 0; i < myArray.length; i++) {
myArray[i] += 1;
}
Tại sao nó là tuyến tính (O (n))? Khi chúng ta thêm các phần tử bổ sung vào đầu vào (mảng), số lượng hoạt động xảy ra sẽ tăng tỷ lệ thuận với số lượng phần tử chúng ta thêm vào.
Vì vậy, nếu phải mất một thao tác để tăng một số nguyên ở đâu đó trong bộ nhớ, chúng ta có thể mô hình hóa công việc mà vòng lặp thực hiện với f (x) = 5x = 5 thao tác bổ sung. Đối với 20 yếu tố bổ sung, chúng tôi thực hiện 20 hoạt động bổ sung. Một vượt qua duy nhất của một mảng có xu hướng tuyến tính. Các thuật toán như sắp xếp xô, có thể khai thác cấu trúc dữ liệu để thực hiện sắp xếp trong một lần truyền của một mảng.
Ví dụ thứ hai của bạn cũng sẽ đúng và trông như thế này:
Ô (N ^ 2):
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray.length; j++) {
myArray[i][j] += 1;
}
}
Trong trường hợp này, với mỗi phần tử bổ sung trong mảng đầu tiên, i, chúng ta phải xử lý TẤT CẢ j. Thêm 1 vào i thực sự thêm (độ dài của j) vào j. Như vậy, bạn đã đúng! Mẫu này là O (n ^ 2) hoặc trong ví dụ của chúng tôi thực sự là O (i * j) (hoặc n ^ 2 nếu i == j, thường là trường hợp với các hoạt động ma trận hoặc cấu trúc dữ liệu vuông.
Ví dụ thứ ba của bạn là nơi mọi thứ thay đổi tùy thuộc vào đồ dùng; Nếu mã như được viết và làm công cụ là một hằng số, thì thực tế nó chỉ là O (n) vì chúng ta có 2 lượt của một mảng có kích thước n và 2n giảm xuống n. Các vòng lặp nằm ngoài nhau không phải là yếu tố chính có thể tạo ra mã 2 ^ n; đây là một ví dụ về hàm có 2 ^ n:
var fibonacci = function (n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return (fibonacci(n-2) + fibonacci(n-1));
}
}
Hàm này là 2 ^ n, bởi vì mỗi lệnh gọi đến hàm tạo ra HAI cuộc gọi bổ sung cho hàm (Fibonacci). Mỗi lần chúng ta gọi hàm, số lượng công việc chúng ta phải làm tăng gấp đôi! Điều này phát triển siêu nhanh, như cắt đầu một con hydra và có hai cái mới mọc lên mỗi lần!
Đối với ví dụ cuối cùng của bạn, nếu bạn đang sử dụng một loại nlgn như sắp xếp hợp nhất, bạn đúng rằng mã này sẽ là O (nlgn). Tuy nhiên, bạn có thể khai thác cấu trúc dữ liệu để phát triển các loại nhanh hơn trong các tình huống cụ thể (chẳng hạn như trong phạm vi giá trị giới hạn đã biết, như từ 1-100.) Tuy nhiên, bạn đã nghĩ đúng rằng mã thứ tự cao nhất chiếm ưu thế; vì vậy nếu một loại O (nlgn) bên cạnh bất kỳ thao tác nào mất ít thời gian hơn O (nlgn), thì độ phức tạp tổng thời gian sẽ là O (nlgn).
Trong JavaScript (ít nhất là trong Firefox), sắp xếp mặc định trong Array.prototype.sort () thực sự là MergeSort, vì vậy bạn đang xem O (nlgn) cho kịch bản cuối cùng của mình.