Theo AVL tree wikiTại sao cây AVL trong Bản đồ OCaml sử dụng hệ số cân bằng (chiều cao chênh lệch) 2 thay vì 1?
Yếu tố cân bằng được tính như sau: balanceFactor = chiều cao (trái cây con) - Chiều cao (phải cây con). Đối với mỗi nút được chọn, nếu hệ số cân bằng vẫn −1, 0 hoặc +1 thì không cần quay.
Tuy nhiên, trong OCaml, có vẻ như nó sử dụng yếu tố cân bằng của 2
let bal l x d r =
let hl = match l with Empty -> 0 | Node(_,_,_,_,h) -> h in
let hr = match r with Empty -> 0 | Node(_,_,_,_,h) -> h in
if hl > hr + 2 then begin
match l with
Empty -> invalid_arg "Map.bal"
| Node(ll, lv, ld, lr, _) ->
if height ll >= height lr then
create ll lv ld (create lr x d r)
else begin
match lr with
Empty -> invalid_arg "Map.bal"
| Node(lrl, lrv, lrd, lrr, _)->
create (create ll lv ld lrl) lrv lrd (create lrr x d r)
end
end else if hr > hl + 2 then begin
match r with
Empty -> invalid_arg "Map.bal"
| Node(rl, rv, rd, rr, _) ->
if height rr >= height rl then
create (create l x d rl) rv rd rr
else begin
match rl with
Empty -> invalid_arg "Map.bal"
| Node(rll, rlv, rld, rlr, _) ->
create (create l x d rll) rlv rld (create rlr rv rd rr)
end
end else
Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))
Tại sao?
cảm ơn các giấy tờ được đề xuất của bạn. Tuy nhiên, trước khi tôi đọc những điều đó, ý của bạn là gì? Bằng cách làm như vậy họ thực sự đã tìm thấy một lỗi trong kế hoạch tái cân bằng'? –
Bằng cách thực hiện các chứng minh đúng đắn. Xem phần dưới cùng của p. 13. –