Ví dụ về các thuật toán có độ phức tạp O (1), O (n log n) và O (log n)


114

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ì?


6
Tại sao wiki? Nó không phải là một cuộc thăm dò hay chủ quan. Cô ấy muốn có những ví dụ cụ thể về thuộc tính big-O.
paxdiablo

4
Wiki bởi vì nó không có câu trả lời đúng duy nhất, nó có nhiều câu trả lời.
Jason S

2
Wikipedia cũng có một danh sách tốt. vi.wikipedia.org/wiki/Time_complexity
Homer6

Câu trả lời:


234

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 gian

  • Truy cập chỉ mục mảng (int a = ARR [5];)
  • Chèn một nút trong Danh sách được Liên kết
  • Đẩy và bật lên trên ngăn xếp
  • Chèn và Xóa khỏi Hàng đợi
  • Tìm ra nút cha hoặc nút con trái / phải của một nút trong cây được lưu trữ trong Mảng
  • Chuyển đến phần tử Tiếp theo / Trước đó trong Danh sách được Liên kết Đôi

O(n) thời gian

Tó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)

  • Duyệt qua một mảng
  • Duyệt qua danh sách được liên kết
  • Tìm kiếm tuyến tính
  • Xóa một phần tử cụ thể trong Danh sách được Liên kết (Không được sắp xếp)
  • So sánh hai chuỗi
  • Kiểm tra hội chứng Pali
  • Đếm / Sắp xếp nhóm và tại đây bạn cũng có thể tìm thấy hàng triệu ví dụ khác như vậy ....

O(log n) thời gian

  • Tìm kiếm nhị phân
  • Tìm số lớn nhất / nhỏ nhất trong cây tìm kiếm nhị phân
  • Một số thuật toán Chia và Chinh phục nhất định dựa trên chức năng Tuyến tính
  • Tính toán số Fibonacci - Phương pháp tốt nhất Tiền đề cơ bản ở đây KHÔNG sử dụng dữ liệu đầy đủ và giảm kích thước vấn đề với mỗi lần lặp

O(n log n) thời gian

Hệ 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.

  • Hợp nhất Sắp xếp
  • Sắp xếp đống
  • Sắp xếp nhanh chóng
  • Một số thuật toán Chia và Chinh phục nhất định dựa trên việc tối ưu hóa các thuật toán O (n ^ 2)

O(n^2) thời gian

Nhữ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.

  • Sắp xếp bong bóng
  • Sắp xếp chèn
  • Sắp xếp lựa chọn
  • Duyệt qua một mảng 2D đơn giản

5
Còn n thì sao !? Tôi đã tự hỏi những gì thuật toán phổ biến sử dụng n !?
Y_Y

Truy cập giá trị HashMap cũng như các thuật toán phức tạp hơn như triển khai LRU đạt được O (1) bằng cách sử dụng HashMap và danh sách được liên kết kép hoặc triển khai ngăn xếp với chức năng PUSH / POP / MIN. Ngoài ra, việc triển khai đệ quy của Fibonacci cũng thuộc N !.
Ruralcoder

11
OCD của tôi muốn bạn chuyển 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 :)
Sam Eaton

4
Duyệt qua một mảng 2D thực sự là O (nxm) trừ khi nó là một ma trận vuông.
Simon Peck

1
Bài toán 'người bán hàng lưu động' là một ví dụ của n! (n giai thừa) cũng vậy
Ju66ernaut

28

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.


28

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!


2
Nó mất nhiều thời gian rất nhiều để nấu một rang hơn một mini-rang :-)
paxdiablo

4
nhưng thường thì mất thời gian như nhau để nướng hai lò nướng nhỏ và một lò nướng nhỏ, miễn là lò nướng của bạn đủ lớn để vừa lò nướng!
Chii

1
Rất sâu sắc! Tôi cho rằng nhiệm vụ biên soạn một cuốn sách điện thoại hoặc địa chỉ từ một danh sách tên / số có thể là O (n log n)
squashed.bugaboo

10

Tôi có thể cung cấp cho bạn một số thuật toán chung ...

  • O (1): Truy cập một phần tử trong một mảng (tức là int i = a [9])
  • O (n log n): nhanh chóng hoặc hợp nhất (Trung bình)
  • O (log n): Tìm kiếm nhị phân

Đâ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"


4

Ô (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) :-)


5
Có, bạn thường có thể đánh đổi thời gian để lấy không gian. Tôi thực sự đã làm điều này cho một trò chơi tic-tac-toe vì chỉ có 3 ^ 9 trạng thái (ít hơn nếu bạn xử lý các phép quay một cách thông minh). Cờ, tuy nhiên, có một số hơi lớn của các quốc gia :-)
paxdiablo

1
Vấn đề là tôi sẽ chỉ sống O(1)nano giây, và bạn chắc chắn biết được O(1)sẽ xảy ra đầu tiên ...
zardav

3

Độ 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.


1
Điều đó không thực sự đúng. Nếu một thuật toán có độ phức tạp về thời gian là O (N), điều đó có nghĩa là thời gian chạy của nó bị giới hạn bởi k * N bước đối với k hằng số nào đó. Nó không thực sự quan trọng cho dù "các bước" là chu kỳ CPU, hướng dẫn lắp ráp, hoặc hoạt động C (đơn giản). Chi tiết đó được ẩn bởi hằng số k.
Igor ostrovsky

Chưa kể rằng trong nhiều trường hợp thực tế, chữ "c" của thuật toán O (logN) làm cho nó tệ hơn thuật toán O (N) đơn giản hơn.
Zed

Haha, vâng, và theo N thì chúng ta có nghĩa là độ dài của đầu vào trên băng máy Turing - điều này làm cho dạng phân chia theo chiều dọc mất thời gian theo cấp số nhân để thực hiện. :-) Mỗi ​​miền có các yêu cầu riêng và khu vực trừu tượng hóa riêng.
P Shved

3

O (1) - Xóa một phần tử khỏi danh sách được liên kết kép. ví dụ

typedef struct _node {
    struct _node *next;
    struct _node *prev;
    int data;
} node;


void delete(node **head, node *to_delete)
{
    .
    .
    .
}

2

Bạn có thể thêm các thuật toán sau vào danh sách của mình:

O(1)- Xác định xem một số là số chẵn hay lẻ; Làm việc với HashMap

O(logN) - tính toán x ^ N,

O(N Log N) - Hệ số tăng dài nhất


1

O (n log n) nổi tiếng là giới hạn trên về tốc độ bạn có thể sắp xếp một tập hợp tùy ý (giả sử mô hình tính toán chuẩn và không song song cao).


0

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.


0

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 Hanoisẽ là một ví dụ tốt hơn.
Ashish Duklan
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.