Python heapq heapify thời gian phức tạp

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

  1. 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. -

  1. 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 

nút có chiều cao h.

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[

]. Tương tự như vậy trong Bước ba, giới hạn trên của tổng có thể tăng lên vô cùng vì chúng ta đang sử dụng ký hiệu Big-Oh. Tổng vô hạn G. P. [x < 1]

 

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

Độ phức tạp về thời gian của Heapify trong Python là gì?

Hàm heapify chạy theo thời gian tuyến tính. Vì chúng tôi đang đẩy n phần tử lên heap và chạy heapify , tổng thời gian phức tạp là O[n log[n]] .

Độ phức tạp về thời gian của Heapify là gì?

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] .

Heapq có nhanh không?

Heapq nhanh hơn so với sắp xếp trong trường hợp nếu bạn cần thêm các phần tử một cách nhanh chóng i. e. bổ sung và chèn có thể đến theo thứ tự không xác định. Thêm phần tử mới bảo toàn thứ tự bên trong bất kỳ đống nào nhanh hơn sử dụng mảng sau mỗi lần chèn.

Heapq Heapify trong Python là gì?

heapify – Hàm này chuyển đổi một danh sách thông thường thành một đống . Trong heap kết quả, phần tử nhỏ nhất được đẩy đến vị trí chỉ số 0. Nhưng phần còn lại của các phần tử dữ liệu không nhất thiết phải được sắp xếp. heappush – Chức năng này thêm một phần tử vào heap mà không làm thay đổi heap hiện tại.

Chủ Đề