Древовидная структура данных и данные - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть база данных с таблицей, в которой хранятся все возможные комбинации субъекта, глаголов и дополнений.

Эта таблица выглядит как распределительная таблица, в которой столбцы Id сопоставляются с другими моими таблицами (таблица субъекта,таблица глаголов, дополняет таблицу).

В моей программе я использую древовидную структуру для представления соединительной таблицы, и поэтому каждый узел является просто объектом со свойством Id (subjectId или verbId ...).

Однако я не могу понять, куда поместить фактические данные, на которые отображается Id.Хотя у меня было два варианта:

  1. Сделать данные свойством каждого узла
  2. Сделать данные узлом

В первом случае единственной обработкой, которую я делаю, является загрузка таблицы комбинаций и создание дерева.И когда мне нужны данные, которые идут вместе с ними, я загружаю их по требованию.Но чтобы отслеживать положение данных в дереве, у данных есть свойство, которое указывает обратно на узел, к которому они принадлежат (очевидно, хак, чтобы избежать необходимости искать во всем дереве (даже если это только O (log (n)) операция). Кроме того, я буду иметь дело только с узлом во всей программе, поскольку это удобный способ добраться до потомков этого узла.

Во втором случае, если бы я былчтобы сделать фактические данные узлом , мне нужно было бы загрузить все данные сразу, прежде чем их использовать. Кроме того, мне все еще нужно создать копию данных, если «родные братья и сестры узла» используютте же данные.

Есть ли чистый способ добиться того, что я пытаюсь сделать? Ниже перечислены то, что у меня есть

public class Node<Word>{

    public Word Data { get; set; }

    public Guid ID { get; set; }

    ..... // other necessary tree like stuff

}

public class Word
{
    public Node NodeItem { get; set; }
}

или

public class Word : Node{}

IНадеюсь, что вопрос достаточно ясен. Дайте мне знать, если вам нужно больше деталей, и я обновлю вопрос с ним. Спасибо.

1 Ответ

0 голосов
/ 02 декабря 2010

Поиск в дереве, которое вы упоминаете, ни в коем случае не будет O (logn), потому что это дерево не является деревом двоичного поиска. Вы можете сказать, что это неориентированный граф, поэтому вам нужно искать с использованием BFS или DFS.

если я правильно представляю вашу ситуацию, то в пользовательском интерфейсе у вас есть дерево, предположим, что на левой панели вашего окна и на правой панели вы хотите показать детали узла.

если это пользовательский интерфейс или ваша ситуация, то

я бы сказал, не хранить данные в дереве, загружать по требованию, т.е. когда пользователь выбирает узел, тогда у вас будет идентификатор этого узла, извлекать данные с идентификатором и отображать.

таким образом, вы можете избежать возможной загрузки всех данных, которые могут не потребоваться сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...