Thuật toán liệt kê tất cả các cây nhị phân có chiều cao cho trước


7

Tôi đã cố gắng tìm một thuật toán để liệt kê tất cả các cây nhị phân có chiều cao cho trước .h

Lưu ý rằng tôi không cố đếm chúng: số lượng cây như vậy được đưa ra trong OEIS ( A001699 ).

Tất cả các thuật toán mà tôi đã có thể thấy danh sách tất cả các cây nhị phân cho một số nút nhất định. Một cách giải quyết vấn đề rất không hiệu quả sẽ tiến hành bằng cách kiểm tra tất cả các cây với một số nút giữa và , nhưng điều này không tuyệt vời chút nào.h+12h+1-1

Bất kỳ con trỏ hoặc tài liệu tham khảo sẽ được nhiều đánh giá cao.


3
Các công thức lặp lại ngụ ý một thuật toán như vậy. (Trên thực tế, không phải bản thân các công thức, mà là bằng chứng của họ.)
Yuval Filmus

@YuvalFilmus Cảm ơn bình luận của bạn. Bạn có nghĩa là một bằng chứng như bằng chứng (sử dụng OGF) được cung cấp tại math.stackexchange.com/questions/1183643/ Lỗi ? Tôi hoàn toàn mới với lĩnh vực này - xin lỗi vì bị chậm.
Shiwen Yao

Liên kết của bạn có các công thức khác là tốt. Mỗi lần tái phát hợp lý sẽ làm việc.
Yuval Filmus

Câu trả lời:


2

Như được gợi ý trong các ý kiến, chỉ cần làm theo cấu trúc đệ quy của cây nhị phân.

Chúng tôi tạo ra một hàm listbt(h)liệt kê tất cả các cây nhị phân có chiều cao chính xác h.

type BTree = Leaf | Node(BTree, BTree)

def listbt 0 = { [Leaf] }
|   listbt h = {
  result = []
  for T in (listbt h-1) {
    for k in (0..h-1) {
      for t in (listbt k) {
         result += Node(T, t)
         result += Node(t, T) if k < h-1 || t != T
      }
    }
  }
  return result
}

Sự đúng đắn theo sau với một bằng chứng quy nạp cơ bản hơn h.

Nếu bạn ghi nhớ kết quả của listbtviệc này sẽ hiệu quả như nó có được; số lượng cây tuyệt đối và do đó số lượng séc t != Tchiếm ưu thế.

Lưu ý rằng nếu bạn sử dụng chia sẻ thuật ngữ (nghĩa là chỉ liên kết tTtrong Node(t, T)nhưng không sao chép chúng), bạn có thể giảm đáng kể kích thước của đầu ra. Điều đó chỉ có ý nghĩa nếu BTreeviệc thực hiện của bạn là bất biến.


-1

Suy nghĩ đầu tiên của tôi là điều này chỉ liên quan đến các cây được xây dựng từ các đường dẫn có độ dài h, là đẳng cấu của các số nguyên h-bit, nhưng chúng chỉ là một tập hợp con của những gì cần thiết. Tuy nhiên, bắt đầu với tất cả những gì cần thiết là điền vào từng nút trung gian không đầy đủ với các cây không đạt đến cấp độ lá.

Đó là: liệt kê 22h-1các tập hợp số không h-bit và chuyển đổi chúng thành cây. Sau đó, đối với mỗi cây T, đối với mỗi nút N không có lá đầy đủ (nghĩa là chỉ có một con, vì theo định nghĩa, nó đã có trên một đường dẫn đến ít nhất một lá), đính kèm tất cả các cây con có thể không đạt đến cấp độ lá (chiều cao <chiều cao (N) -1, bao gồm cả cây trống). Sau đó xuất sản phẩm cartesian trên tất cả các chữ N trong T.

Tôi khẳng định rằng điều này tạo ra tất cả các cây và không tạo ra bất kỳ hai lần nào, vì điều kiện không đạt tới mức độ lá khiến cho không thể bắt đầu với một T và chuyển đổi nó thành một T 'khác với độ sâu h khác.


1
Điều đó thực sự không hiệu quả.
Yuval Filmus
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.