2016-01-10 170 views
-2

我有Java決策樹代碼要通過C++。 當我嘗試構建樹時,我不太記得邏輯內部指針。 Java代碼:將Java代碼轉換爲C++

public class Node { 
Node parent; 
Node children[]; 
List<Instance> instances; 
.... 
}; 

Node(Node parent, List<Instance> instances) { 
     this.parent = parent; 
     children = new Node[Instance.FTSVALUERANGE]; 
     this.instances = instances; 
     .... 
} 

對於樹生成:

public class ID3 { 
Node root; 
... 

public static Node generate(List<Instance> instances) { 
     Node root = new Node(null, instances); 
     expand(root, 0); 
     return root; 
    } 
static void expand(Node node, int depth) { 
      ... 
      ArrayList<ArrayList<Instance>> ts = new ArrayList<ArrayList<Instance>>(); 
      ... 
      /* Grow the tree recursively */ 
     for (int i = 0; i < Instance.FTSVALUERANGE; i++) { 
      if (ts.get(i).size() > 0) { 
       node.children[i] = new Node(node, ts.get(i)); 
       expand(node.children[i], depth + 1); 
      } 
}}} 

,在這裏我的C++實現;節點:

class Node 
{ 
    public: 
     Node(); 
     Node(Node* parent, std::vector<Instance>& instances); 
     Node* parent; 
     Node** children; 
     std::vector<Instance> instances; 

    .... 
}; 

Node::Node() 
{ 
    parent=NULL; 
    children=NULL; 
} 
Node::Node(Node* parent, std::vector<Instance>& instances) { 
     this->parent = parent; 
     this->children = new Node*[Instance::FTSVALUERANGE]; 
     this->instances = instances; 
     ... 
}; 

對於樹生成:

class ID3{ 
    Node* root; 
    static void expand(Node* node, int depth); 
    static Node* generate(vector<Instance> instances); 
    ... 
    }; 
    Node* ID3::generate(vector<Instance> instances) { 
    Node* root = new Node(NULL, instances); 
    expand(root, 0);// when use ID3.chi_square_100// there is no prunning, 
    return root; 
} 
void ID3::expand(Node* node,int depth){ 
... 
     for (int i = 0; i < Instance::FTSVALUERANGE; i++) { 
      if (ts[i].size() > 0) { 
       node->children[i] = new Node(node, ts[i]); 
       expand(node->children[i], depth + 1); 
      } 
    }}} 

當我嘗試運行的東西不工作與兒童。 完整的實現在這裏:https://courses.cs.washington.edu/courses/cse446/12wi/ps/hw4/ID3.java
我爲我的目的做了一些改變。
在此先感謝。
朱塞佩。

+1

爲什麼你實現你自己的數據結構?我建議你使用Java和C++中已有的數據結構,或者至少閱讀這些實現,以便了解它們的工作原理。當你不瞭解它們時從頭開始編寫它們將會浪費大量時間(和錯誤)如果你的程序中有一個錯誤,我建議使用你的調試器來找到它。 –

+0

不要使用'NULL',而應使用'nullptr'。不要使用指向指針的指針,並使用'unique_ptr'之類的智能指針,並將'std :: vector'用於動態列表。 –

+0

你好@GuillaumeRacicot,謝謝你的幫助。 「不要使用指向指針的指針,並使用諸如unique_ptr之類的智能指針」是什麼意思? –

回答

0

感謝Guillaume Racicot的建議!
這是代碼:
在Node.cpp:

class Node 
{ 
public: 
    Node(); 
    Node(Node* parent, std::vector<Instance>& instances); 
    Node* parent; 
    std::vector<Node*> children; 
    .... 
}; 

Node::Node(Node* parent, std::vector<Instance>& instances) { 

    this->parent = parent; 
    this->children= std::vector<Node*>(Instance::FTSVALUERANGE); 
    ... 
}