Tôi muốn biết điều gì là tốt nhất: Mảng hoặc cây tìm kiếm nhị phân trong (chèn, xóa, tìm tối đa và tối thiểu) và làm cách nào tôi có thể cải thiện cả hai?Sự khác nhau giữa cây tìm kiếm và cây nhị phân hiệu quả là gì?
Trả lời
An mảng cho phép random access cho từng phần tử trong đó. do đó bạn có được chèn, xóa và tìm kiếm một phần tử cụ thể trong O(1)
và tối đa/phút, xóa trong O(n)
. [bạn cũng có thể đặt tối đa/phút O(1)
và xóa O(n)
thay thế]. Nếu bạn sắp xếp mảng của mình, nó sẽ khiến chèn/xóa là O(n)
, nhưng bạn sẽ nhận được O(logn)
tìm và O(1)
phút/tối đa.
Một BST được sắp xếp theo định nghĩa, và cho một thường xuyên [không cân bằng] BST, bạn sẽ có được O(n)
hành vi trường hợp xấu nhất. Đối với cân bằng BST, bạn nhận được O(logn)
chèn/xóa/tìm. Bạn có thể nhận được O(1)
phút/tối đa bất kỳ cách nào cho cả hai.
Mảng cũng thường nhanh hơn để iterate [giả định thứ tự lặp lại không quan trọng] vì bạn có hiệu suất tốt hơn cache. Ngoài ra, không giống như BST - có kích thước không bị chặn bởi tự nhiên, một mảng yêu cầu phân bổ lại và sao chép dữ liệu khi mảng của bạn đầy.
Cải thiện BST có thể được thực hiện bằng cách đặt số balanced - như AVL hoặc red-black-trees.
Cái nào tốt hơn? Nó phụ thuộc vào ứng dụng. Thông thường khi bạn đang có kế hoạch chèn dữ liệu và giữ cho nó được sắp xếp, BST sẽ được ưu tiên hơn. Nếu truy cập ngẫu nhiên hoặc lặp lại là mục đích chính: bạn thường sử dụng một mảng.
Tại sao hoạt động liên tục 'findMin/findMax' 'O (1)' cho BST cân bằng? – Cratylus
@ user384706: Bất cứ khi nào bạn chèn/loại bỏ một phần tử từ một BST cân bằng, nó là 'O (logn)' và 'O (n)' cho BST không cân bằng. Bạn có thể duy trì thêm các con trỏ 'min' và' max', mà sẽ chỉ được sửa đổi khi bạn chèn/remvoe các phần tử từ BST. Tìm tối đa/tối thiểu mới là 'O (logn)' cho BST cân bằng và 'O (n)' không cân bằng - do đó không có tổn thất hiệu năng [lớn O] trong hoạt động này, và về O lớn, bạn có thể duy trì các con trỏ này cho "miễn phí" – amit
Ah, vì vậy bạn có nghĩa là sử dụng các con trỏ thừa. Nhưng trong trường hợp này, đây là một tối ưu hóa không liên quan trực tiếp đến các thuật toán BST.Đó không phải là nó hơi không nhất quán/gây nhầm lẫn để yêu cầu so sánh với cấu trúc dữ liệu khác (trong trường hợp này là một mảng) rằng 'max/min' là' O (1) 'vì nó không phải là mặc định? Người ta phải thực hiện nó sao cho nó là – Cratylus
Performance so sánh Mảng và cây tìm kiếm nhị phân:
Array Binary search tree
Unsorted Sorted Average Worst case
Space O(n) O(n) O(n) O(n)
Search O(n) O(log n) * O(log n) O(n)
Max/Min O(n) O(1) O(1) ** O(1) **
Insert O(1) O(n) O(log n) O(n)
Delete O(1) O(n) O(log n) O(n)
*
giả nhị phân tìm kiếm
**
đòi hỏi gợi ý thêm để chuẩn tối thiểu và tối đa, nếu không nó là O (log n)
Tại sao 'O (1)' tìm tối đa/phút của BST? – Cratylus
Bây giờ bạn hỏi, tôi không chắc nó có đúng không. Cây nhị phân tìm kiếm được sắp xếp theo định nghĩa, nhưng (tùy thuộc vào việc thực hiện?) Nó có thể không thể có được min/max trong O (1). Trong trường hợp đó, nó sẽ là O (log n) thay thế. – Peladao
Nó không phải là 'O (1)' trừ khi thực hiện của bạn giữ một con trỏ đến 'min' và' max' values.Check cũng bình luận trong câu trả lời của amit – Cratylus
- 1. Cây tìm kiếm nhị phân trên cây AVL
- 2. Cây tìm kiếm nhị phân đệ quy
- 3. Chuyển cây nhị phân
- 4. Sự khác biệt giữa cây AVL và cây trồng
- 5. kiểm tra xem cây có phải là cây tìm kiếm nhị phân không
- 6. Tìm hiểu về cấu trúc cây tìm kiếm nhị phân
- 7. Cây tìm kiếm nhị phân tích hợp trong Python?
- 8. Cây tìm kiếm nhị phân cân bằng hoàn hảo
- 9. C# Cây nhị phân và từ điển
- 10. Sự khác biệt giữa cây đỏ-đen và cây AVL
- 11. Xây dựng cây tìm kiếm nhị phân cân bằng
- 12. Tìm kiếm nhị phân Cây C thực hiện
- 13. đại diện cho cây tìm kiếm nhị phân trong python
- 14. Cây nhị phân có chứa cây khác không?
- 15. là gì sự khác biệt giữa bốn quả tìm kiếm File trong ASP.NET MVC
- 16. JAVA: cây nhị phân
- 17. Cây nhị phân từ cây chung
- 18. Tìm sự khác biệt giữa thân cây và nhánh?
- 19. Cách tạo cây nhị phân
- 20. Cây Suffix và Tries. Sự khác biệt là gì?
- 21. Sự khác biệt giữa cấu trúc dữ liệu Cây và đồ thị là gì?
- 22. OCaml: vẽ cây nhị phân
- 23. hiệu suất tìm kiếm nhị phân so với hiệu quả tìm kiếm tuyến tính trong fortran
- 24. Sự khác nhau giữa chế độ nhị phân MD5 và chế độ văn bản là gì?
- 25. Với 'N' không có nút nào, có thể có bao nhiêu Cây tìm kiếm nhị phân và nhị phân khác nhau?
- 26. Sự khác nhau giữa -rpath và -L là gì?
- 27. Bất kỳ sự khác biệt nào giữa các thuật ngữ phân tích cây và cây phái sinh?
- 28. Sự khác nhau giữa `ImmutableSortedSet` và fsharp` Set` là gì?
- 29. Là cây k-d hiệu quả cho tìm kiếm kNN. k gần nhất hàng xóm tìm kiếm
- 30. Tìm đường dẫn trong cây tìm kiếm nhị phân tổng hợp thành giá trị đích
Bạn thử tìm kiếm thông tin này? Nó phải dễ tìm. – Howard
Bạn có nghĩa là cấu trúc dữ liệu trừu tượng [danh sách liên kết] (http://en.wikipedia.org/wiki/Linked_list) và [cây tìm kiếm nhị phân] (http://en.wikipedia.org/wiki/Binary_search_tree)? – Gumbo
cải thiện theo cách nào? tốt nhất cho cái gì? đó là những cấu trúc dữ liệu hoàn toàn khác nhau, và mỗi cấu trúc có thể là 'tốt nhất' cho một ứng dụng nhất định. – amit