У вас есть неориентированный граф. То, что существует множество узлов с соединениями между собой, и каждое соединение двунаправленное.
Существует четыре общих представления для графиков, которые можно найти здесь .
Вам необходимо решить, какое представление лучше всего соответствует вашим потребностям и можно ли его адаптировать для повышения производительности.
Я рекомендую использовать списки смежности, но каждый узел должен хранить один список всех узлов, на которые он ссылается, и другой список всех узлов, которые на него ссылаются.
например.
class Node {
Integer personID;
List<Integer> links;
}
// graph data type
Map<Integer, Node> graph;
Теперь, благодаря тому, как хранятся данные, выясните, сколько всего соединений у человека становится так просто:
Integer personID = ...;
Node n = graph.get(personID);
int totalConnections = n.links.size();
Все, что вам тогда нужно, это создать список объектов, в которых будет храниться как идентификатор человека, так и общее количество ссылок, которые у них есть, а затем отсортировать по общему количеству ссылок (что сгруппирует все большое количество ссылок в конце списка ).
Вы, конечно, должны убедиться, что данные графика правильно построены на этапе инициализации.
Следует иметь в виду, что это представление несколько увеличит сложность памяти вашего графа, но значительно уменьшит временную сложность вашего алгоритма. Что вы цените больше в своей программе, времени или памяти?
Однако, в зависимости от плотности соединений в вашем графике, матрица смежности может лучше соответствовать вашим потребностям.
Другие вопросы:
LinkedList в Java имеет довольно ужасную производительность для большинства задач по сравнению с ArrayList. По сравнению с ArrayList он лучше всего работает, когда вы делаете много вставок / удалений в середине списка с помощью ListIterator. Если вы не используете ListIterator, то производительность снова ужасна. Из-за реализации LinkedLists алгоритм сортировки по умолчанию в API java Collections имеет очень низкую производительность при сортировке LinkedLists;
Одновременные исключения доступа с API коллекций возникают при использовании цикла foreach и изменении коллекции во время цикла. Вам нужно перебрать коллекцию с помощью Iterator или ListIterator и добавить / удалить элементы через Iterator / ListIterator.