Như chúng ta đã biết [Cấu trúc dữ liệu heap][https. //www. prepbyte. com/blog/heap/applications-of-heap-data-structures/ “Cấu trúc dữ liệu heap”] đáp ứng hai thuộc tính, thuộc tính thứ nhất là cây nhị phân hoàn chỉnh và thuộc tính thứ hai là thuộc tính thứ tự heap
- Cây nhị phân hoàn chỉnh có tất cả các cấp được điền trừ cấp cuối cùng và tất cả các nút của cấp cuối cùng phải được căn chỉnh từ trái sang phải
Ví dụ về cây nhị phân hoàn chỉnh hoàn hảo. -
- Trọng tâm của cấu trúc dữ liệu heap là thuật toán Heapify, được sử dụng để duy trì thuộc tính thứ hai của cấu trúc dữ liệu heap i. e Thuộc tính đặt hàng đống. Theo thuộc tính thứ tự của heap trong min-heap, giá trị của mọi nút phải nhỏ hơn giá trị con của nó và trong max-heap, giá trị của mọi nút phải lớn hơn giá trị con của nó
Ví dụ
một đống tối đa
Phân tích độ phức tạp thời gian của việc xây dựng một đống. -
Sau mỗi lần chèn, thuật toán Heapify được sử dụng để duy trì các thuộc tính của cấu trúc dữ liệu heap. Vì vậy, trước tiên chúng ta sẽ thảo luận về độ phức tạp thời gian của thuật toán Heapify
Ví dụ
Mã giả
max_Heapify[A, i]{
left_child = 2*i;
right_child = 2*i +1;
if[left_child A[i]]
largest = l;
else largest = i;
if[right_child A[largest]]
largest = r;
if[largest != i]
swap[A[largest],A[i]]
max_Heapify[A,largest]
}
build_Max_Heap[A]{
A.heap_size ← A.length
for i ← A.length/2 downto 1
max_Heapify[A, i]
}
Từ ví dụ trên, chúng ta có thể kết luận rằng độ phức tạp thời gian của thuật toán Heapify bằng O[chiều cao của cây nhị phân hoàn chỉnh] i. e O[log N]
Phân tích tầm thường
Mỗi cuộc gọi đến MAX-HEAPIFY yêu cầu log[n] thời gian, chúng tôi thực hiện n cuộc gọi như vậy O[nlogn]
Ràng buộc chặt chẽ hơn
Mỗi lệnh gọi MAX-HEAPIFY yêu cầu thời gian O[h] trong đó h là độ cao của nút i. Do đó thời gian chạy là
Bài viết này đã cố gắng thảo luận về độ phức tạp về thời gian của việc xây dựng một đống. Hy vọng blog này giúp bạn hiểu và giải quyết vấn đề. Để thực hành nhiều vấn đề hơn, bạn có thể xem MYCODE. Lập trình cạnh tranh tại Prepbytes
Chúng ta có thể rút ra một giới hạn chặt chẽ hơn bằng cách quan sát rằng thời gian chạy của Heapify phụ thuộc vào chiều cao của cây 'h' [bằng lg[n], trong đó n là một số nút] và chiều cao của hầu hết các cây con . Chiều cao 'h' tăng lên khi chúng ta di chuyển lên dọc theo cây. Dòng 3 của Build-Heap chạy một vòng lặp từ chỉ mục của nút bên trong cuối cùng [heapsize/2] với chiều cao=1, tới chỉ mục của gốc[1] với chiều cao = lg[n]. Do đó, Heapify mất một khoảng thời gian khác nhau cho mỗi nút, tức là
Để tìm Độ phức tạp về thời gian của việc xây dựng một đống, chúng ta phải biết số nút có chiều cao h. Đối với điều này, chúng tôi sử dụng thực tế là, Một đống kích thước n có tối đa
a để lấy được độ phức tạp về thời gian, chúng tôi biểu thị tổng chi phí của Build-Heap dưới dạng-
Bước 2 sử dụng các thuộc tính của ký hiệu Big-Oh để bỏ qua hàm trần và hằng số 2[
Lấy đạo hàm cả hai vế rồi nhân với x ta được
Đưa kết quả thu được ở [3] vào đạo hàm [1], ta được
Do đó đã chứng minh rằng độ phức tạp về thời gian để xây dựng một đống nhị phân là
Bài viết này được đóng góp bởi Chirag Manwani. Nếu bạn thích GeeksforGeeks và muốn đóng góp, bạn cũng có thể viết một bài báo bằng cách sử dụng write. chuyên viên máy tính. org hoặc gửi bài viết của bạn tới review-team@geeksforgeeks. tổ chức. Xem bài viết của bạn xuất hiện trên trang chính của GeeksforGeeks và trợ giúp các Geeks khác. Vui lòng viết nhận xét nếu bạn thấy bất cứ điều gì không chính xác hoặc nếu bạn muốn chia sẻ thêm thông tin về chủ đề đã thảo luận ở trên