Я пишу программу на C++, которая использует генетические методы для оптимизации дерева выражений.Как структурировать это дерево узлов?
Я пытаюсь написать класс Tree
, который имеет в качестве элемента данных Node root
. Конструктор узла генерирует случайное дерево узлов с +
, -
, *
, /
как узлы и целые числа в виде листьев.
Я работаю над этим некоторое время, и я пока не понял, какая структура лучше. Поскольку мне нужно получить доступ к любому узлу в дереве, чтобы мутировать или скрещивать дерево, мне нужно сохранить dicionary узлов. Массив будет делать, но кажется, что вектор является рекомендуемым контейнером.
vector<Node> dict;
Так класс Дерево будет содержать вектор dict
со всеми узлами дерева (или указателей на тот же), корневой узел дерева, а также переменную для фитнес-мера для дерева.
class Tree
{
public:
typedef vector<Node>dict;
dict v;
Node *root;
float fitness;
Tree(void);
~Tree();
};
class Node
{
public:
char *cargo;
Node *parent;
Node *left;
Node *right;
bool entry;
dict v;
Node(bool entry, int a_depth, dict v, Node *pparent = 0);
};
Tree::Tree()
{
Node root(true, tree_depth, v);
};
Там, кажется, нет хорошего места, чтобы положить typedef vector<Node>dict;
, потому что, если он идет в определении дерева, он не знает о Node, и выдаст ошибку, говоря так. Я не смог найти место до typedef
.
Но я даже не уверен, является ли вектор лучшим контейнером. Узлы просто нужно индексировать последовательно. Контейнер должен расти, поскольку может быть от 200 до 500 узлов.
Почему бы не перенести определение узла раньше, что для Tree? также вы можете (или, возможно, нет, это трудно сказать) лучше обслуживать вектор указателей узлов. – 2010-07-11 14:56:47
@Neil: Это то, что я изначально думал (и удалял), но Node также имеет член 'dict' ... Который он передает по значению и сохраняет копию. Я не понимаю, почему это полезно (особенно для оптимизации), может быть, Питер может разработать? – Stephen
Каждый Узел должен добавить себя к диктону в качестве его интеллигентного. dict.push_back (this) Я думал, что если dict был членом Tree, мне пришлось бы передать его конструктору Node, который передал бы его каждому последующему конструктору узла. –