Một số thuật toán mà chúng ta sử dụng hàng ngày có O (1), O (n log n) và O (log n) phức tạp?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)
Trả lời
Nếu bạn muốn ví dụ về thuật toán/Nhóm các câu lệnh với Time phức tạp như được đưa ra trong câu hỏi, đây là một danh sách nhỏ - Index
O (1) thời gian
1. Truy cập Array (int a = arr [5];)
2. Chèn một nút trong danh sách liên kết
3. Đẩy mạnh và poping trên stack
4. Insertion and Removal từ Queue
5. Tìm hiểu phụ huynh hoặc trái con/phải một nút trong cây được lưu trữ trong Array
6. Nhảy đến yếu tố Tiếp theo/trước đó trong danh sách gấp đôi Linked
và bạn có thể tìm thấy một nhiều triệu ví dụ như vậy ...
O (n) thời gian
1. Vượt qua một mảng
2. Vượt qua một danh sách liên kết
3. tuyến Tìm
4. xóa một yếu tố cụ thể trong một danh sách liên kết (Không sắp xếp)
5. So sánh hai chuỗi
6. Kiểm tra Palindrome
7. đếm/Bucket Sắp xếp
.210 và đây quá bạn có thể tìm thấy một nhiều triệu ví dụ như vậy ....
Tóm lại, tất cả các thuật toán Brute Force, hoặc những người Noob mà yêu cầu tuyến tính, được dựa trên O (n) thời gian phức tạp
O (log n) thời gian
1. binary Search
2. Tìm lớn nhất/số nhỏ nhất trong một cây tìm kiếm nhị phân
3. một số thuật toán chia để trị dựa trên chức năng tuyến tính
4. Tính số Fibonacci - Phương pháp tốt nhất
Các tiền đề cơ bản ở đây KHÔNG sử dụng dữ liệu hoàn chỉnh và giảm kích thước vấn đề với mỗi lần lặp lại
O (nlogn) thời gian
1. Merge Sắp xếp
2. Heap Sắp xếp
3. Sắp xếp nhanh
4. Một số thuật toán chia để trị dựa trên việc tối ưu hóa O (n^2) thuật toán
Yếu tố của 'log n' được giới thiệu 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 gian
1. Phân loại Bubble
2. Insertion Sort
3.Lựa chọn Sắp xếp
4. Traversing một mảng 2D đơn giản
Đây là những nghĩa vụ phải được các thuật toán ít hiệu quả nếu O (nlogn) đối tác của họ có mặt. Ứng dụng chung có thể là Brute Force ở đây.
Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn tốt. Nếu người dùng có nhiều ví dụ để thêm, tôi sẽ hạnh phúc hơn :)
Còn n thì sao !? Tôi đã tự hỏi thuật toán phổ biến nào sử dụng n !? –
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 O (1) sử dụng HashMap và danh sách 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 thực hiện đệ quy của Fibonacci giảm theo N !. – ruralcoder
Ngoài ra, việc tìm^n là O (log n). Một ví dụ điển hình trong phần giới thiệu của liang về cuốn sách lập trình java – oiyio
Độ phức tạp của ứng dụng phần mềm không được đo và không được viết bằng ký hiệu big-O. Nó chỉ hữu ích để đo lường độ 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 tôi nói O (n), chúng tôi có nghĩa là "O (n) so sánh" hoặc "O (n) hoạt động số học". Đ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.
Điều đó không thực sự đúng. Nếu một thuật toán có độ phức tạp thời gian O (N), điều đó có nghĩa là thời gian chạy của nó bị giới hạn bởi các bước k * N đối với một số hằng số k. Nó không thực sự quan trọng cho dù "bước" là chu kỳ CPU, hướng dẫn lắp ráp, hoặc (đơn giản) C hoạt động. Chi tiết đó được ẩn bởi hằng số k. –
Chưa kể rằng trong nhiều trường hợp thực tế, "c" của một thuật toán O (logN) làm cho nó tồi tệ hơn một thuật toán O (N) đơn giản hơn. – Zed
Haha, có, và bởi N, chúng tôi sau đó có nghĩa là chiều dài của đầu vào trên một băng máy Turing - mà làm cho hình thức dọc của bộ phận mất thời gian theo cấp số nhân để thực hiện. :-) Mỗi tên miền có yêu cầu riêng của nó và khu vực riêng của nó trừu tượng. –
tôi có thể cung cấp cho bạn một số thuật toán chung ...
- O (1): Truy cập vào một phần tử trong một mảng (ví dụ int i = a [9])
- O (n log n) : nhanh hoặc mergesort (Trung bình)
- O (log n): tìm kiếm nhị phân
đây sẽ là câu trả lời ruột vì điều này nghe có vẻ giống như bài tập về nhà/phỏng vấn loại câu hỏi. Nếu bạn đang tìm kiếm một cái gì đó cụ thể hơn thì khó hơn một chút vì công chúng nói chung sẽ không có ý tưởng về việc thực hiện cơ bản (Sparing mã nguồn mở của khóa học) của một ứng dụng phổ biến, cũng không phải khái niệm này áp dụng chung cho một "ứng dụng"
Một ví dụ đơn giản là O(1)
có thể là return 23;
- bất kỳ đầu vào nào, điều này sẽ trả về trong một khoảng thời gian cố định, hữu hạn.
Ví dụ điển hình của O(N log N)
sẽ sắp xếp mảng đầu vào bằng thuật toán tốt (ví dụ: merg hợp).
Ví dụ điển hình nếu O(log N)
sẽ tìm kiếm một giá trị trong mảng đầu vào được sắp xếp bằng cách chia đôi.
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ả định một mô hình tính toán chuẩn và không cao song song).
O (1): tìm di chuyển tiếp theo tốt nhất trong Cờ vua (hoặc Chuyển cho vấn đề đó). Vì số trạng thái trò chơi là hữu hạn nên chỉ có O (1) :-)
Có, bạn thường có thể đổi thời gian cho 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 tiểu bang (ít hơn nếu bạn xử lý các vòng quay một cách thông minh). Cờ vua, tuy nhiên, có một số lượng lớn hơn một số tiểu bang :-) – paxdiablo
O (1) - hầu hết các quy trình nấu đều là O (1), nghĩa là phải mất một khoảng thời gian không đổi mọi người để nấu ăn (đến một mức độ, bởi vì bạn có thể chạy ra khỏi không gian trong nồi/chảo của bạn và cần phải phân chia các nấu ăn)
O (logn) - tìm một cái gì đó trong danh bạ điện thoại của bạn. Hãy suy nghĩ tìm kiếm nhị phân.
O (n) - đọc sách, trong đó n là số trang. Đó là khoảng thời gian tối thiểu để đọc một cuốn sách.
O (nlogn) - không thể ngay lập tức nghĩ ra điều gì đó mà người ta có thể làm hàng ngày, đó là ... trừ khi bạn sắp xếp thẻ bằng cách hợp nhất hoặc sắp xếp nhanh!
Bạn có thể thêm các thuật toán để danh sách của bạn như sau:
O(1)
- Xác định nếu một số là chẵn hoặc lẻ; Làm việc với HashMap
O(logN)
- máy tính x^N,
O(N Log N)
- dài nhất dãy con tăng
O (1) - Xóa một phần tử từ một danh sách gấp đôi được liên kết. ví dụ.
typedef struct _node {
struct _node *next;
struct _node *prev;
int data;
} node;
void delete(node **head, node *to_delete)
{
.
.
.
}
- 1. O (log n) luôn luôn nhanh hơn O (n)
- 2. Ví dụ về O (n!)?
- 3. Ký hiệu Big Oh O ((log n)^k) = O (log n)?
- 4. O (log (log (n)))) có nghĩa là gì?
- 5. 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)?
- 6. 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ì?
- 7. Tại sao độ phức tạp của container bản đồ C++ STL O (log (n))?
- 8. Điều này có nghĩa là: các bước O (n) và không gian O (1)?
- 9. Tôi có nên xem xét memmove() O (n) hoặc O (1) không?
- 10. Biến bit là O (1) hoặc O (n)?
- 11. Nơi để tìm thấy những gì O (n^2) và O (n) vv có nghĩa là?
- 12. Thuật toán khoảng cách Levenshtein tốt hơn O (n * m)?
- 13. f (n) = n^log (n) phức tạp đa thức hoặc mũ số
- 14. Cosine tương đồng của Vectors, với <O (n^2) phức tạp
- 15. Tìm nếu một mảng là một chuỗi trong thời gian O (n) và O (1)
- 16. Thuật toán O (n) để tìm ra phần tử xuất hiện nhiều hơn n/2 lần
- 17. Big Oh for (n log n)
- 18. Làm thế nào để tính toán thứ tự (lớn O) cho các thuật toán phức tạp hơn (ví dụ như quicksort)
- 19. Phân tích các thuật toán (phức tạp)
- 20. chứng minh n = Big-O (1) sử dụng cảm ứng
- 21. 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)?
- 22. Đếm chuỗi con xuôi ngược trong thời gian O (n)
- 23. Là nhật ký (n!) = Θ (n · log (n))?
- 24. Tại sao độ phức tạp của thuật toán này là O (1)
- 25. Tránh O (n^2) phức tạp cho phát hiện va chạm
- 26. Big O, độ phức tạp của việc tổng hợp một chuỗi số n là bao nhiêu?
- 27. độ phức tạp của Morris Traversal o (n) như thế nào?
- 28. Chuyển đổi heap thành BST trong thời gian O (n)?
- 29. Đơn giản hóa độ phức tạp Big-O của thuật toán số mũ này
- 30. Quan sát hành vi bậc hai với quicksort - O (n^2)
Làm cho nó trở thành một wiki. –
Tại sao lại là wiki? Nó không phải là một cuộc thăm dò hay chủ quan. Cô ấy muốn các ví dụ cụ thể về các thuộc tính big-O. – paxdiablo
Wiki vì nó không có câu trả lời đúng, nó có nhiều câu trả lời. –