2011-12-21 2 views
0

У меня есть сеть «сущностей» (Объекты), каждая из которых содержит информацию о том, что представляют собой «следующие» (следующие) сущности, которые могут быть любыми, что между ними нет. Кроме того, «следующие» объекты содержат информацию для своих «следующих объектов» (которая может быть совершенно новой или предыдущей, которая только что связана с ней).В Java, какая коллекция наиболее эффективна для сети данных?

Значит, A знает, где B a C, B знает, где A, D и E ist и так далее. Обратите внимание на двустороннее направление A и B. Нет ограничений на количество или направление соединений.

Какова будет самая лучшая (наиболее эффективная) коллекция для имитации такой сети, если мне придется искать объекты очень часто (много тысяч раз)? Какая была бы лучшая коллекция, если бы я искал строки вместо объектов? Есть ли разница? Будет ли другой тип сущности быстрее?

Спасибо всем!

Редактировать: То, что я пытаюсь сделать, - это сохранить огромное количество «воспоминаний» (исторических событий в симуляции) в сети/графике, затем найти определенную память и следовать соединениям соседей и соседей соседей и т. д., ища «комбинации» воспоминаний, которые соответствуют моему шаблону поиска. Например, я проверяю, существуют ли сущности «A, B, C и снова A» в этом порядке.

+0

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

+0

Ну ... совершенно разные действия, на самом деле. Я хочу иметь возможность искать определенный узел (используя его имя/ключ), а затем перейти к его непосредственным соседям («nextEntity») и соседям соседей. Пока я делаю это, мне нужно проверить «расстояния» между узлами, что, скорее всего, будет атрибутом, прикрепленным к списку «соседей», который имеет каждый узел. Ad Я также хочу сравнить атрибуты узлов. Проблема в том, что это не «дерево», которое в конечном итоге заканчивается, поскольку взаимосвязь между узлами позволяет кругам - узлы А и В могут быть связаны в обоих направлениях, нет отношений родитель-потомок. – Cos

+0

Попробуйте Map >, чтобы сопоставить узел своим детям. В качестве альтернативы вы можете иметь Узел со списком детей внутри класса Node. Затем вы можете выполнять всевозможные операции над ними. – Adrian

ответ

1

Это звучит для меня, как будто у вас есть «граф» -типа проблему. Возможно, вы могли бы использовать neo4j (http://neo4j.org/) в качестве способа представления своих отношений, а затем использовать свой API для выполнения ваших поисков?

+0

Вау, это выглядит очень многообещающе.Я определенно посмотрю на это подробнее. Благодаря! – Cos

+0

Привет, я тестировал Neo4J последние 2 дня, и это казалось очень многообещающим, но в тот момент, когда я смоделировал создание 1000 узлов, я понял, насколько медленным этот процесс был ... потребовалось несколько секунд. Я что-то делаю неправильно или действительно так? – Cos

3

Ваш вопрос довольно расплывчатый, поскольку он стоит. Если вы можете каким-то образом определить «ключ» для своих условий поиска, вы можете использовать структуру данных HashMapjava.util) как очень быструю таблицу поиска.

В худшем случае вы должны использовать поиск глубины (DFS) или поиск по ширине (BFS) для поиска по всей сети (технический термин - «график»).

+0

То, что я пытаюсь сделать, - это сохранить огромное количество «воспоминаний» (исторических событий в симуляции) в сети/графике, затем найти определенную память и следовать соединениям соседей и соседей соседей и так далее, ища «комбинации» воспоминаний, которые соответствуют моему шаблону поиска. Например, я проверяю, существуют ли сущности «A, B, C и снова A» в этом порядке. – Cos

+0

Сделайте первый поиск по ширине, начиная с буквы 'A'. – tskuzzy

+0

«Breadth first» подразумевает, что у меня есть какая-то коллекция деревьев, но у меня нет отношений «родитель-ребенок». Круги возможны. – Cos

1

насчет:

Map<Entity, List<Entity>> 

?

В карте хранится сама сущность плюс список всех преемников (следующий и/или предыдущий). Доступ к значениям карт с использованием ключа всегда равен O (1), что означает, что к элементу обращаются в течение определенного времени (он не зависит от того, сколько элементов хранится на карте)

Если у вас есть ограничение, объекты должны быть размещены в специальном порядке (позиции), этот подход, безусловно, не будет работать.

+0

Но разве это не означает, что каждый объект хранится несколько раз (один раз в карту, а затем несколько раз в разных списках)? – Cos

+0

Вы сохраните только ссылку на объект (так что выделена память в стеке). Сам объект хранится только один раз в куче. – Dennis

+0

Отлично, я попробую! Спасибо! – Cos

1

Нужно ли искать объекты самостоятельно? Если это так, то в качестве общего решения вы можете создать HashMap, где есть ключи, соответствующие вашим критериям поиска. Объекты будут значениями.

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

Ex1: объекты имеют числовые атрибуты и критерии поиска, когда атрибут> конкретный порог - RBTReeMap будет решением.

Ex2: вы ищете последовательности объектов - могут быть рассмотрены алгоритмы поиска графика.

Ex3: Структура ваших объектов очень похожа на FSA (Finate State Automatons). В этом случае поиск выполняется по языку ввода (не самим сущностям). Решениями являются минимизация автомата и детерминирование.

+0

Я ищу только одну сущность, а затем проверяю последовательность объектов, начиная с этого. Графические алгоритмы поиска звучат интересно. – Cos

1

Я хотел бы сосредоточиться на том, что такое Сущность, и определить для него класс. Если вам нужно найти Entity, просто зарегистрируйте его на карте при создании.

Что-то вроде этого:

public class Entity { 
    static Map<String, Entity> map = new HashMap<String, Entity>(); 

    String id; 
    Set<Entity> nextEntities = new HashSet<Entity>(); 
    Set<Entity> prevEntities = new HashSet<Entity>(); 

    public Entity (String id) { 
     this.id = id; 
     map.put(id, this); 
    } 

    public static forId(String id) { 
     return map.get(id); 
    } 
} 
+0

Дело в том, что у меня нет «начальной позиции», сначала мне нужно искать объект, который нужно начинать с каждого раза. И тут алгоритм должен двигаться быстро. Итак, я ищу объект «xyz», а затем проверил его соседей и соседей его соседей и т. Д. – Cos

+0

@Cos см. Отредактированный ответ – Bohemian

+0

Спасибо, это выглядит неплохо, я отдам его. Является ли «Карта» быстрее, чем предлагалось «HashMap» tskuzzy? – Cos

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