Để xây dựng một cây heap MAX, chúng tôi có thể siftDown
hoặc siftUp
, bằng cách chọn xuống chúng tôi bắt đầu từ gốc và so sánh nó với hai đứa con của nó, sau đó chúng tôi thay thế nó bằng phần tử lớn hơn của hai đứa trẻ, nếu cả hai trẻ nhỏ hơn sau đó chúng tôi dừng lại, nếu không chúng tôi tiếp tục chọn yếu tố đó cho đến khi chúng tôi đạt đến nút lá (hoặc tất nhiên một lần nữa, cho đến khi phần tử đó lớn hơn cả hai con của nó).Tại sao siftDown tốt hơn siftUp trong heapify?
Bây giờ chúng ta chỉ cần thực hiện điều đó n/2
lần, vì số lá là n/2
và lá sẽ thỏa mãn thuộc tính vùng heap khi chúng ta kết thúc phần tử cuối cùng trên mức trước dấu cuối cùng (trước lá) vì vậy chúng tôi sẽ để lại với các yếu tố n/2
để heapify.
Bây giờ nếu chúng ta sử dụng siftUp
, chúng ta sẽ bắt đầu với lá, và cuối cùng chúng ta sẽ cần phải heapify tất cả các yếu tố n
.
Câu hỏi của tôi là: khi chúng tôi sử dụng siftDown
, về cơ bản chúng tôi thực hiện hai so sánh (so sánh yếu tố với cả hai con), thay vì chỉ so sánh khi sử dụng siftUp
, vì chúng tôi chỉ so sánh phần tử đó với một phần tử ? Nếu có, điều đó không có nghĩa là chúng ta đang tăng gấp đôi sự phức tạp và thực sự kết thúc với sự phức tạp chính xác giống như chọn lọc xuống?
Tôi nghĩ rằng câu trả lời cho câu hỏi này sẽ được áp dụng. Có thể là một bản sao. https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity –