Trường hợp tệ nhất trong Max-Heapify - Làm thế nào để bạn có được 2n / 3?


81

Trong CLRS, Ấn bản thứ ba, trên trang 155, nó được cho rằng ở MAX-HEAPIFY,

Mỗi cây con của trẻ em có kích thước tối đa là 2n / 3 — trường hợp xấu nhất xảy ra khi tầng dưới cùng của cây đã đầy một nửa.

Tôi hiểu tại sao điều tồi tệ nhất là khi tầng dưới cùng của cây đã đầy một nửa. Và nó cũng được trả lời trong câu hỏi này, trường hợp xấu nhất trong MAX-HEAPIFY: "trường hợp xấu nhất xảy ra khi tầng dưới cùng của cây đầy một nửa"

Câu hỏi của tôi là làm thế nào để có được 2n / 3?

Tại sao nếu mức dưới cùng đầy một nửa thì kích thước của cây con lên tới 2n / 3?

Làm thế nào để tính toán điều đó?

Cảm ơn


5
Một phép tính đơn giản được cung cấp tại blog này: bit.ly/138f43F .
akaHuman

Câu trả lời:


65

Trong một cây mà mỗi nút có đúng 0 hoặc 2 nút con, số nút có 0 nút con nhiều hơn số nút có 2 nút con là một. {Giải thích: số nút ở độ cao h là 2 ^ h, bằng công thức tổng của một chuỗi hình học bằng (tổng các nút từ độ cao 0 đến h-1) + 1; và tất cả các nút từ độ cao 0 đến h-1 là các nút có đúng 2 nút con}

    ROOT
  L      R
 / \    / \
/   \  /   \
-----  -----
*****

Gọi k là số nút trong R. Số nút trong L là k + (k + 1) = 2k + 1. Tổng số nút là n = 1 + (2k + 1) + k = 3k + 2 (gốc cộng với L cộng với R). Tỷ lệ là (2k + 1) / (3k + 2), được giới hạn trên 2/3. Không có hằng số nào nhỏ hơn 2/3 hoạt động, vì giới hạn khi k đi đến vô cùng là 2/3.


2
vâng, tôi hiểu rồi, ý bạn là L / n = 2/3
Jackson Tale

7
Chà. Đó là sâu. Bạn đã tự mình tìm ra nó như thế nào?
Lập trình Noob

37

Understand the maximum number of elements in a subtree happens for the left subtree of a tree that has the last level half full.Draw this on a piece of paper to realize this.

Một khi điều đó rõ ràng, giới hạn của 2N / 3 rất dễ đạt được.

Giả sử rằng tổng số nút trong cây là N.

Số nút trong cây = 1 + (Số nút trong Cây con bên trái) + (Số nút trong Cây con bên phải)

Đối với trường hợp của chúng ta khi cây đã đầy một nửa cấp cuối cùng, iF, chúng ta giả sử rằng cây con bên phải có chiều cao h, sau đó cây con bên trái nếu có chiều cao (h + 1):

Số nút trong Cây con bên trái = 1 + 2 + 4 + 8 .... 2 ^ (h + 1) = 2 ^ (h + 2) -1 ..... (i)

Số nút trong Cây con bên phải = 1 + 2 + 4 + 8 .... 2 ^ (h) = 2 ^ (h + 1) -1 ..... (ii)

Do đó, cắm vào:

Số nút trong cây = 1 + (Số nút trong Cây con bên trái) + (Số nút trong Cây con bên phải)

=> N = 1 + (2^(h+2)-1) + (2^(h+1)-1)

=> N = 1 + 3*(2^(h+1)) - 2

=> N = 3*(2^(h+1)) -1

=> 2^(h+1) = (N + 1)/3

Cắm giá trị này vào phương trình (i), chúng ta nhận được:

Number of nodes in Left Subtree = 2^(h+2)-1 = 2*(N+1)/3 -1 =(2N-1)/3 < (2N/3)

Do đó, giới hạn trên của số nút tối đa trong cây con đối với cây có N nút là 2N / 3.


Tôi vẫn không hiểu. Sẽ không xảy ra ngay cả khi nó đã đầy, tại sao nó phải đầy một nửa. ai đó giải thích - Tôi đang bối rối.
Sundar Rajan

1
@SundarRajan kiểm tra math.stackexchange.com/questions/181022/… Đặc biệt là phần nàyThis is the most the heap can get imbalanced; adding another node will either begin to rebalance the heap (by filling out the other, right, half of the last level) or break the heap's shape property of being a complete binary tree
momo

14

Đối với một cây nhị phân hoàn chỉnh về chiều cao h, số nút là f(h) = 2^h - 1. Trong trường hợp trên, chúng ta có cây nhị phân gần như hoàn chỉnh với nửa dưới đầy. Chúng ta có thể hình dung đây là bộ sưu tập của root + left complete tree + right complete tree. Nếu chiều cao của cây gốc là hchiều cao của trái h - 1và phải là h - 2. Vì vậy, phương trình trở thành

n = 1 + f(h-1) + f(h-2) (1)

Chúng tôi muốn giải quyết ở trên vì được f(h-1)thể hiện dưới dạngn

f(h-2) = 2^(h-2) - 1 = (2^(h-1)-1+1)/2 - 1 = (f(h-1) - 1)/2 (2)

Sử dụng ở trên trong (1) chúng ta có

n = 1 + f(h-1) + (f(h-1) - 1)/2 = 1/2 + 3*f(h-1)/2

=> f(h-1) = 2*(n-1/2)/3

Do đó O (2n / 3)


9
Đó không phải là f (h) = 2 ^ (h + 1) - 1?
a_fan

Câu trả lời xuất sắc. Vui lòng sửa f (h) như được đề cập bởi @afnrf
Ajay

2

Để thêm vào câu trả lời của swen. Làm thế nào (2k + 1) / (3k + 2) có xu hướng đến 2/3, khi k có xu hướng vô cùng,

Lim_ (k -> inf) (2k + 1) / (3k + 2) = Lim_ (k -> inf) k (2 + 1 / k) / k (3 + 2 / k) = Lim_ (k -> inf ) (2 + 1 / k) / (3 + 2 / k)

áp dụng giới hạn và bạn nhận được 2/3


2

Số lượng nút tại -

  • cấp 0 tức là gốc là 2 ^ 0
  • cấp 1 là 2 ^ 1
  • cấp 2 là 2 ^ 2
  • ...
  • cấp n là 2 ^ n

Tổng tất cả các nút từ cấp 0 đến cấp n,

  • S = 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ n

Từ quy tắc tổng hợp chuỗi hình học, chúng ta biết rằng

  • x ^ 0 + x ^ 1 + x ^ 2 + ... + x ^ (n) = (x ^ (n + 1) - 1) / (x-1)

Thay x = 2, ta được

  • S = 2 ^ (n + 1) - 1. tức là 2 ^ (n + 1) = S + 1

Vì 2 ^ (n + 1) là tổng số nút ở cấp n + 1, chúng ta có thể nói rằng số nút có 0 con nhiều hơn số nút có 2 con một.

Bây giờ, hãy tính số nút trong cây con bên trái, cây bên phải và tổng ..

  • Giả sử rằng số nút không phải là lá trong cây con bên trái của gốc = k.
  • Theo suy luận trên, số nút lá trong cây con bên trái hoặc gốc = k + 1. Số nút không phải lá trong cây con bên phải của gốc = k khi cây được cho là đầy một nửa.

  • Tổng số nút trong cây con bên trái của gốc = k + k + 1 = 2k +

  • Tổng số nút trong cây, n = (2k + 1) + k + 1 = 3k + 2.
  • Tỷ lệ các nút trong cây con bên trái và tổng số nút = (2k + 1) / (3k + 2) được giới hạn ở trên bằng 2/3.

Đó là lý do của việc nói rằng mỗi cây con của trẻ em có kích thước tối đa là 2n / 3.

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.