2015-02-07 32 views
6

checkIfBalanced() phương pháp trong mã dưới đây trả về giá trị true nếu cây được cân bằng và sai khác. Tuy nhiên trong mỗi đệ quy nó tạo ra đối tượng TreeData. Trong sự phức tạp của không gian ý kiến ​​của tôi là O (1) như sau mỗi khung ngăn xếp được xuất hiện, tham chiếu của đối tượng được tạo trên khung ngăn xếp đó bị mất và thu thập rác. Tôi có đúng không?Sự phức tạp của không gian khi tạo đối tượng trên đệ quy

Xin lưu ý:

  1. Tôi không tìm kiếm gợi ý để cải thiện/thay đổi mã của tôi. Ví dụ sau về mã được thiết kế riêng để đặt câu hỏi của tôi.

  2. Ngoài ra, please ignore space-complexity adding stack frames. Tôi đang tìm kiếm sự phức tạp về không gian của các đối tượng 'TreeData' số được tạo. Có vẻ với tôi rằng tại bất kỳ thời điểm nào, sẽ chỉ có 3 đối tượng TreeData. Đó là những gì tôi muốn xác minh. Cảm ơn.

private static class TreeData { 
     private int height; 
     private boolean isBalanced; 

     TreeData(int height, boolean isBalanced) { 
      this.height = height; 
      this.isBalanced = isBalanced; 
     } 
    } 

    public boolean checkIfBalanced() { 
     if (root == null) { 
      throw new IllegalStateException(); 
     } 
     return checkBalanced(root).isBalanced; 
    } 

    public TreeData checkBalanced(TreeNode node) { 
     if (node == null) return new TreeData(-1, true); 

     TreeData tdLeft = checkBalanced(node.left); 
     TreeData tdRight = checkBalanced(node.right); 

     if (tdLeft.isBalanced && tdRight.isBalanced && Math.abs(tdLeft.height - tdRight.height) <= 1) { 
      return new TreeData(Math.max(tdLeft.height, tdRight.height) + 1, true); 
     } 

     return new TreeData(Math.max(tdLeft.height, tdRight.height) + 1, false); 
    } 

Trả lời

5

Trong phức tạp không gian quan điểm của tôi là O (1) như sau mỗi stack frame được popped, tài liệu tham khảo của đối tượng được tạo ra trên rằng ngăn xếp khung là mất và thu gom rác thải. Tôi có đúng không?

Không, bạn sai khi giả định điều đó. Ray Toal đã giải thích rất rõ điều này. Tại bất kỳ điểm nào trong đệ quy, bạn phải đếm tất cả các khung chồng bên trong đang được lưu vào bộ nhớ, vì Space-Complexity xem xét đến tất cả không gian phụ (khoảng trống thừa) cùng với đầu vào (không được nhấn mạnh ở đây).

Tiếp theo,

Tôi đang tìm kiếm phức tạp không gian của số 'TreeData' đối tượng tạo.

Không gian tối đa được tiêu thụ bởi một chương trình đệ quy là tỷ lệ đến độ sâu tối đa của cây đệ quy đóng khung. Độ sâu tối đa của cây đệ quy được định nghĩa là chiều dài của con đường dài nhất trong cây.

Đối với chương trình đã cho, chương trình sẽ bắt đầu từ gốc cây và bắt đầu tạo cây con bên trái và sau đó kiểm tra cây con phải. Cuối cùng, nó sẽ trả về độ dài của con đường dài nhất và liệu cây có cân bằng HOẶC không.

Dường như với tôi rằng tại bất kỳ thời điểm nào, sẽ chỉ có 3 đối tượng TreeData . Đó là những gì tôi muốn xác minh.

Không, tại bất kỳ thời điểm thực hiện cụ thể nào, đầu tiên tất cả các subtrees trái được xác minh và sau đó các phụ đề bên phải được xác minh, do đó số đối tượng của TreeData trong bộ nhớ sẽ chỉ là 1. Mỗi lần kiểm tra cho nó là trái hoặc phải con. Và, do đó, tất cả những thứ đó (log n --- trong trường hợp cây cân bằng, HOẶC n --- trong trường hợp cây bị thoái hóa), ngoại trừ một nút sẽ tiếp tục xếp chồng lên nhau trong bộ nhớ. Tại một thời điểm cụ thể, chỉ 1 đối tượng TreeData sẽ ở trạng thái hoạt động, các đối tượng khác sẽ bị tạm dừng và xếp chồng lên nhau trong bộ nhớ và đợi đến lượt chúng bật ra.

+0

để số lượng đối tượng của TreeData trong bộ nhớ sẽ chỉ là 1 - vì vậy, nếu tôi "bỏ qua không gian ngăn xếp" , độ phức tạp sẽ là O (1)? Các đối tượng đó có bị thu gom rác nếu các tham chiếu được bật lên không? – JavaDeveloper

+0

@ JavaDeveloper- 1. Nếu bạn bỏ qua không gian ngăn xếp và chỉ xem xét tham chiếu hiện tại, thì sẽ chỉ có 1 đối tượng TreeData hoạt động. 2. *** Có thể/Có thể không ***, ngay sau khi ngăn xếp bật ra tất cả các nút, các đối tượng có thể HOẶC có thể không được thu thập rác, nó phụ thuộc vào JVM để đoán liệu chúng sẽ được tái sử dụng trong Tương lai. Đối với surity, bạn cần phải làm điều đó bằng tay bằng cách thiết lập những đối tượng để 'null' để họ có thể nhận được rác thu thập. Trả lời câu trả lời (đặc biệt là câu trả lời của Stephen C) -> http://stackoverflow.com/questions/27781116/garbage -collection-in-java-với-đệ quy-chức năng –

1

Tuy nhiên, trong mỗi đệ quy nó tạo ra đối tượng TreeData.

Không đúng sự thật. Bạn chỉ tạo đối tượng TreeData mới tại trường hợp cơ sở của đệ quy của bạn. Nếu bạn lo lắng về điều này, tại sao bạn không chỉ có một phiên bản TreeData cuối cùng tĩnh được khai báo một lần trong lớp mà bạn có thể sử dụng. Xét cho cùng, điều duy nhất bạn đang truyền lại từ nút này là giá trị boolean là isBalanced.

Bạn cũng có thể chỉ truyền giá trị boolean sao lưu trực tiếp nếu bạn thay đổi chữ ký phương thức của mình để trả lại boolean.

2

Bạn không sử dụng đệ quy đuôi ở đây và bạn đang xây dựng các khung xếp chồng khi bạn recurse lên cây. Để công bằng, hãy đếm những khung xếp chồng đó. Nếu cây của bạn được cân bằng thì bạn sẽ tạo khung ngăn xếp nhật ký khi bạn recurse. Trong trường hợp xấu nhất, với một cây bị thoái hóa hoàn toàn, bạn có thể có tối đa n khung ngăn xếp.

+1

Được giải thích rõ ràng! Tôi ước tôi có thể chia các điểm thưởng giữa bạn và Am_I_Helpful – JavaDeveloper

Các vấn đề liên quan