2014-12-25 7 views
2

Вот пример кода, который можно задать с вопросом. Этот API пытается реализовать граф с представлением списка смежности в виде массива пакетов, индексированных каждой из вершин на графике.Каковы преимущества использования структуры данных Bag над другими, например, Set или Linkedlist для API-интерфейса графа.

public class Graph{ 

private final int V;   //no. of vertices 
private Bag<Integer>[] adj; // A bag for each vertex to store all adjacent vertices 
. 
. 
. 
} 

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

+2

Я не думаю, что это хорошее представление. График обычно реализуется либо матрицей смежности, либо списком смежности для каждой вершины. В списках соприкосновения не должно быть дубликатов, поэтому нет никакого реального преимущества для «Сумки», и он может вводить дубликаты, где они не должны существовать. – RealSkeptic

ответ

2

Сумка, скорее всего, реализована двоичным деревом поиска или хеш-таблицей, что дает нам поиск O (log n) или O (1). Связанный список будет выполнять поиск O (n).

A Набор позволяет использовать только уникальные элементы, поэтому, если вам нужно хранить дубликаты, вам нужна сумка. TreeSet или HashSet в библиотеке Java Collections даст нам O (log n) или O (1) поиск соответственно.

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

+0

Вот фактический код структуры данных [Graph] (http://algs4.cs.princeton.edu/41graph/Graph.java.html), так как код написан очень известными профессорами, поэтому вопрос имеет важное значение наблюдение. Я также изучаю и вижу, нахожу ли я что-то важное. – vivek

3

Каждая структура данных может быть использована при различных обстоятельствах:

Set (в частности HashSet) может быть список уникальных неупорядоченных элементов. С другой стороны, Bags являются мультимножествами (неупорядоченные коллекции, которые могут содержать повторяющиеся элементы).

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

+2

@nash_at Добавление элементов в определенных местах в связанном списке является постоянным, если у нас уже есть итератор в этом месте. Много раз нам придется перебирать место в линейное время. –

+0

@SteveM да, вы правы, поэтому я хотел подчеркнуть, что проще манипулировать ссылками :) –