2013-11-22 3 views
1

У меня есть иерархические данные. что-то вроде:Иерархический дизайн структуры данных

enter image description here

Ниже приведены характеристики:

  1. Узел может иметь любое количество детей
  2. Узлы могут быть помечены как специальные. После того, как узел отмечен специальным, все поддерево, начиная с этого узла, становится особенным.

Ниже перечислены операции, которые я хочу выполнить:

  1. Tree.get("a.b.d.g") должен дать мне узел g
  2. Tree.set("a.b.d.g",value) которые устанавливают значение
  3. узла g «s в любом узле, я должен знать, кто корневой узел
  4. на любом узле я должен, если я являюсь частью специального поддерева
  5. Я должен иметь возможность копировать/перемещать поддерево в другое дерево
  6. Я могу добавить новые узлы или удалять новые узлы на каждом уровне
  7. я должен быть в состоянии сериализовать эти данные

я могу в настоящее время подумайте о структуре «хэшмапа хэшмапов». Я всегда могу кэшировать ответ на операции 3 и 4 на каждом узле. Конечно, мне нужно очистить этот кеш, когда я копирую или перемещаю и т. Д.

Есть ли другие способы реализации для достижения наилучшей производительности из-за вышеперечисленных операций с минимальным размером памяти.

+0

Не связанное с качанием, внедрение TreeNode всегда хорошее начало. Затем вы можете скопировать TreeNode и создать свой собственный интерфейс с помощью тех же методов. – MightyPork

+1

Может быть излишним, но как насчет использования [Neo4j] (http://www.neo4j.org/)? – bekce

+0

Что вы подразумеваете под «на любом узле, который должен знать, кто является корневым узлом»? Разве нет только одного корня? И ваше дерево сбалансировано? –

ответ

0

Для базового моделирования, вы должны использовать композитный шаблон:

public class TreeNode { 

    private String id; 
    private TreeNode parent; 
    private List<TreeNode> treeNodes = new ArrayList<>(); 

    ... 
} 

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

Для разбора пути представить себе что-то вроде:

public TreeNode get(final String path) { 
    if (!path.isEmpty()) { 
     for (TreeNode treeNode : treeNodes) { 
      if (path.startsWith(treeNode.getId())) { 
       return treeNode.get(path.substring(...)); 
      } 
     } 
    } 
    return this; 
} 

Теперь, если вы ищете способ хранения такого рода данные (график, как) и иметь производительные запросы на него, вы можете рассмотреть возможность использования как база данных @sebgymn: Neo4j - отличная база данных для Java.

Речь идет об использовании модели подключенных данных с NOSQL. Узлы хранят данные в свойствах, отношения также хранятся и явно указаны в Neo4j и действуют как ссылки между узлами. Затем вы можете выполнять запросы в узле (свойства, отношения с другими ...).

Вот ссылка на презентацию: http://fr.slideshare.net/neo4j/data-modeling-with-neo4j

Отличный учебник: http://technoracle.blogspot.fr/2012/04/getting-started-with-neo4j-beginners.html

тестовая база данных графа для выполнения запросов: http://www.neo4j.org/learn/cypher

Например: вы можете попробовать реализовать шаблон многоуровневую tree in neo4j (как в вашем случае важно проверить верхний корень: так кажется, ваша модель имеет разные уровни на дереве).

+1

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

+0

Что-то вроде этого у нас уже есть. Я просто ищу лучший вариант – anony

+0

@anony Я не понял ваш вопрос. Но если вы ищете производительность, вам следует серьезно подумать о базе данных графа, такой как Neo4j, о которой упоминается sebgymn, поскольку, кажется, вы хотите, чтобы график был постоянным. – zenbeni

Смежные вопросы