это мой первый раз с CGAL, некоторые из вас могут спорить, почему я должен изучать CGAL из чего-то подобного, но это новый проект, который я должен (и ... да, я должен использовать CGAL и Java в сочетании):/Длинный рассказ короткий ... У меня есть только:Java/CGAL проверить, подключен ли граф (некоторые ограничения в описании)
- Два двойных массива, представляющих координаты x и y моих вершин. Назовем их
double[] x, y;
. - Оба массива имеют
S
случайных значений. - Две вершины,
u
иw
подключены, еслиdistance(x[u], y[u], x[w], y[w]) < CONSTANT
(из. I dodistanceSquared(x[u], y[u], x[w], y[w]) < CONSTANT_SQUARED
, поэтому я избегаю вызова sqrt()). x
иy
заполнены со значениями от0
доUPPER_LIMIT
, никакая другая информация не указана.
Вопрос, do x
и y
описывает связанный граф?
Сейчас у меня есть два: Алгоритмы
Алгоритм 1:
- Построить смежности списка (
Arraylist<Integer>[] adjLists;
) для каждой вершины (только верхняя треугольная матрица изучены). СложностьO(|V|^2)
(V = набор вершин). - Рекурсивное исследование графа, маркировка вершин и подсчет, если посещенная вершина равна
S
В моем графе есть только один компонент, связанный с моим графиком. СложностьO(|E|)
(E = набор ребер).
- Построить смежности списка (
Алгоритм 2:
private static boolean algorithmGraph(double[] x, double[] y) { int unchecked, inside = 0, current = 0; double switchVar; while (current <= inside && inside != S - 1) { unchecked = inside + 1; while (unchecked < S) { if ((x[current] - x[unchecked]) * (x[current] - x[unchecked]) + (y[current] - y[unchecked]) * (y[current] - y[unchecked]) <= CONSTANT_SQUARED) { inside++; // switch x coordinates | unchecked <-> inside switchVar = x[unchecked]; x[unchecked] = x[inside]; x[inside] = switchVar; // switch y coordinates | unchecked <-> inside switchVar = y[unchecked]; y[unchecked] = y[inside]; y[inside] = switchVar; } unchecked++; } current++; } return inside == S - 1; }
Забавно второй медленнее, я не использую структуры данных, код является повторяющимся и на месте, но интенсивное использование стрелочных марок это медленно, как черт.
Спецификация проблемы изменилась, и теперь я должен сделать это с CGAL и Java, я прочитаю все «https://github.com/CGAL/cgal-swig-bindings», чтобы узнать, как использовать CGAL внутри Java ... но я хотел бы получить некоторую помощь об этом конкретном экземпляр кода CGAL ... Существуют ли более быстрые алгоритмы, реализованные в CGAL?
Спасибо за ваше время, ребята! Счастливое кодирование!
Не только это трудно понять, что ваш второй алго пытается достичь, но доказуемо глючит. Протестируйте его с помощью 'double x [] = {1,2,3}', 'double y [] = {0,0,0}', 'S = 2' и' CONSTANT_SQUARED = 4' - возвращаемое значение равно 'false 'даже если никакая пара точек не разделена расстоянием> 2. ** Счастливая отладка, Vento ** - научиться писать чистый код, это увеличит ваши шансы написать хороший код. –
Увы, извините, я забыл написать 'inside ++' в if-блоке перед switchVar. Тай, чтобы указать на это. Btw 'S' - длина массива, поэтому в вашем примере должно быть 3. – Vento
Второй alg попытается создать подключенный подграф, вершины из индекса' 0' в 'inside' содержатся в подграфе. Если узел не в моем подграфе (индекс 'unchecked', от' inside + 1' до 'S'), должен быть подключен к моему подграфу (проверка диапазона, если блок), я перемещаю этот новый узел внутри мой подграф, переключив координаты. Условия while - это только проверки границ и способ ускорения вычислений (если 'inside == S - 1' мой подграф - это весь граф, так что граф связан -> первый, когда он может остановиться). – Vento