Lợi thế của đống trên các mảng được sắp xếp là gì?


7

Tôi còn khá mới đối với các đống và đang cố gắng che giấu lý do tại sao các đống tối thiểu và tối đa được biểu diễn dưới dạng cây khi một mảng được sắp xếp xuất hiện để cung cấp các thuộc tính tối thiểu / tối đa theo mặc định.

Và theo dõi: lợi thế của việc xử lý sự phức tạp của việc chèn vào một đống được đưa ra một thuật toán như sắp xếp nhanh xử lý sắp xếp rất tốt là gì?

Bối cảnh: Tôi đang làm việc thông qua CLRS / MIT 6,006 trong python và chỉ thấy các biểu diễn số nguyên của các giá trị lá. Điều này có thể áp dụng nhiều hơn trong một ngôn ngữ như C trong đó mỗi lá chứa một cấu trúc không thể dễ dàng sắp xếp?


2
Lưu ý rằng các đống thường được mô hình hóa dưới dạng cây nhưng được triển khai dưới dạng mảng, nếu không theo cách bạn đề xuất.
Raphael

Câu trả lời:


14

find-min (resp. ), (resp. ) và là ba hoạt động quan trọng nhất của heap tối thiểu (resp. max-heap) và chúng thường có độ phức tạp của , và nếu bạn triển khai một heap / max-heap bằng cây nhị phân.find-maxdelete-mindelete-maxinsertO(1)O(logn)O(logn)


Bây giờ, giả sử thay vì bạn thực hiện một heap nhỏ bằng một mảng được sắp xếp (không giảm) (Trường hợp cho heap tối đa là tương tự). và có độ phức tạp nếu không yêu cầu trong ứng dụng của bạn, vì bạn có thể duy trì một con trỏ luôn trỏ đến phần tử tối thiểu trong mảng của bạn. Khi phần tử tối thiểu được loại bỏ, bạn chỉ cần di chuyển một bước sang phần tử tiếp theo trong mảng.find-mindelete-minO(1)insertpp

Đối phó với việc chèn trong một mảng được sắp xếp không phải là chuyện nhỏ. Với một phần tử mới , chúng ta có thể sử dụng tìm kiếm nhị phân để xác định vị trí của nó trong mảng để chèn nó. Nhưng vấn đề là nếu bạn muốn chèn nó vào đó, bạn phải di chuyển rất nhiều phần tử cũ (có thể là ) xung quanh để tạo chỗ trống cho phần tử mới cư trú. Điều này khá không hiệu quả đối với hầu hết các ứng dụng. Bạn cũng có thể chọn sắp xếp lại mảng sau khi một phần tử được chèn, tuy nhiên điều này đòi hỏi thời gian .eO(n)O(nlogn)


Điểm cuối cùng, cách bạn thực hiện cấu trúc dữ liệu thực sự phụ thuộc vào ứng dụng của bạn. KHÔNG thực hiện duy nhất là tốt nhất cho tất cả các trường hợp. Phân tích ứng dụng của bạn, tìm ra các hoạt động thường xuyên nhất và sau đó quyết định thực hiện phù hợp.


1
Và việc thêm một phần tử mới không thể được thực hiện nhanh hơn O (n) trong một mảng liền kề bởi vì chỉ có tối đa n phần tử ở sai vị trí và phải được chuyển đến một vị trí khác, bất kể bạn làm gì.
gnasher729

Tôi hiểu rồi. @ NP-hard Vì vậy, lợi thế chính của việc biểu diễn một đống mảng được sắp xếp là thời gian truy cập của nó tới các giá trị tối thiểu / tối đa, nhưng nhược điểm là chèn do "tạo phòng". Ngược lại, một heap được biểu diễn dưới dạng một mảng chưa được sắp xếp có lợi thế của việc chèn vì nó chỉ cần hoán đổi các phần tử cho đến khi các thuộc tính của heap được thỏa mãn một lần nữa, nhưng lại có nhược điểm là find-min/ find-maxtại O (log n)?
Nick Olinger

1
@LindyHop Có. Đó là một sự đánh đổi. Nhưng chỉ yêu cầu thời gian; đó là yêu cầu thời gian . find-minO(1)delete-minO(logn)
PSPACEhard

5

Để trả lời câu hỏi của bạn, bạn phải xác định những hành động khác nhau mà bạn sẽ thực hiện và tần suất, và bạn phải đánh giá độ phức tạp thời gian của từng hành động.

Phương pháp nào đang thực hiện tổng thể tốt hơn sẽ phụ thuộc vào độ phức tạp riêng và tần suất mỗi hành động được thực hiện.

Sắp xếp một mảng có độ phức tạp thời gian rất cao; Các hoạt động heap rẻ đến mức chúng thực sự được sử dụng để thực hiện sắp xếp hợp lý. Sử dụng một đống để tìm phần tử nhỏ nhất chắc chắn nhanh hơn rất nhiều so với việc sắp xếp một mảng. Hai đống cho phần tử nhỏ nhất và lớn nhất vẫn nhanh hơn rất nhiều (nhưng tình huống đó khá hiếm; ví dụ trong một cuộc đua ngựa, mọi người đều muốn biết người chiến thắng, nhưng không ai quan tâm ai đến sau cùng).

Trong đó một đống hoàn toàn, hoàn toàn đánh bại các mảng sắp xếp là một tình huống trong đó một số lượng nhỏ các mục được loại bỏ hoặc thêm vào, và sau mỗi thay đổi, bạn muốn biết lại đó là phần tử nhỏ nhất.


Điều này giúp rất nhiều. Dường như việc triển khai yêu cầu nhiều tìm kiếm / chèn tối thiểu sẽ được triển khai tốt nhất dưới dạng một đống mảng được sắp xếp; tuy nhiên, một kịch bản có nhiều phần chèn thêm sẽ phù hợp nhất cho cây nhị phân / cây nhị phân chưa được sắp xếp.
Nick Olinger
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.