2015-01-04 3 views
1

Я никогда не видел учебника, использующего классы HashMap для классов Node или Graph.Использование HashMap для структур данных Node & Graph

Вот моя реализация классов узлов и графов. У них есть O (1) сложность времени для всех основных операций, таких как проверка узла, проверка соседа, получение расстояния между двумя узлами и т. Д.?

//T as the type of the content in each node 
//D as the type of the distance between the nodes 
class Node<T,D>{ 
    private T content; 
    private HashMap<T,D> neighbors; 
    private boolean marked; 

    //an example method 
    protected boolean hasNeighbor(T t){ 
     return this.neighbors.containsKey(t); 
    } 

    //another example method 
    protected D distanceTo(T t){ 
     return this.neighbors.get(t); 
    } 

    //this class also overrides equals() and hashCode() methods so that every two nodes 
    //equal to each other if and only if their content equal to each other 
} 

также, вот моя идея о классе графов

public class Graph<T,D>{ 
    private HashMap<T, Node<T,D>> nodes; 

    //an example method 
    public D distanceBetween(T a, T b){ 
     return this.nodes.get(a).distanceTo(b); 
    } 
} 

Так что, все может быть сделано в постоянная время, не так ли? Если да, почему мы не можем увидеть какой-либо учебник, использующий такую ​​реализацию?

+0

'distanceBetween' не является' O (1) 'в вашей реализации. Если вы используете матрицу смежности, 'isNeighbor' можно сделать в' O (1) '. Расстояние AFAIK между двумя узлами не может быть выполнено за постоянное время для общих графиков. – Bill

+0

@Bill почему 'distanceBetween()' не 'O (1)'? Оба 'get (...)' в хэш-картах являются постоянным временем, не так ли? –

ответ

0

Наихудшее время поиска для hashmap: O(n), если вы не предоставили хороший хэш-код, однако вы можете считать, что хэш-карты имеют асимптотическое постоянное время поиска.

Я думаю, что ваша реализация графика в порядке (я не уверен, что она семантически корректна, но в принципе я не понимаю, почему она не может быть реализована с использованием Hashmaps, когда у вас есть привязки клавиш/значений). Чтобы ответить на ваш основной вопрос, я думаю, в учебнике по компьютерной науке абстракция важнее фактической реализации. В реализации HashMap на Java есть определенные предположения о контрактах hashcode/равенства, и я думаю, что большинство учебников пытаются избежать таких деталей.

+0

Спасибо за ваш ответ! У меня все еще есть вопрос. Рассмотрим 'HashMap >' в классе 'Graph'. Во-первых, поскольку это hashmap, требуется почти постоянное время, чтобы получить объект Vertex для данного объекта T. Во-вторых, поскольку один и тот же объект 'T' является атрибутом объекта Vertex, он также принимает постоянное время, чтобы получить объект' T' для данного объекта Vertex. Хорошо ли обобщать эту идею, чтобы мы могли реализовать что-то, что работает как би-карта? –

0

Получение расстояния от одного узла до его непосредственных соседей редко является проблемой в алгоритмах на графиках. Рассмотрим, например, алгоритм Дейкстры для кратчайшего пути между A и некоторым другим узлом (не обязательно соседом) Z. Алгоритм исходит из текущего узла (изначально A) ко всем соседям, которые еще не были посещены. Любой контейнер, который может быть (быстро) повторен, будет делать; Карта (Хеш) даже для этого не является первым выбором.

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

И, наконец, если число соседей в среднем довольно мало (~ 10), даже немой последовательный поиск списка даст вам сосед на основе его содержимого. Более того, поскольку графики часто стабильны, даже большие числа могут эффективно обрабатываться путем сортировки и двоичного поиска.

И учебник предполагает, что читатели знают о структурах данных и могут выбирать импликацию в соответствии с их конкретными потребностями. Как отметил Али, абстракция важнее, чем реализация хаков.

+0

Большое спасибо за ваш ответ! Но у меня еще есть еще два вопроса. Во-первых, правда ли, что людям обычно не нравится идея получить более сложную временную сложность, занимая больше места для хранения? Во-вторых, существует ли реализация графиков, которые хорошо работают практически во всех разных случаях (т. Е. Существует библиотека, такая как java.ArrayList)? (Кстати, я только что узнал о структурах данных, таких как графики и алгоритмы на них в последнем семестре. Поэтому, пожалуйста, простите меня, если мои вопросы выглядят немыми) –

+0

Во-первых: Нет, не с людьми, которые узнали, что есть компромисс между временем выполнения и памятью требования. Во-вторых: JGraphT является одним, и Google найдет вас других. Вам придется судить сами. – laune

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