![]() |
|
|
![]()
|
|
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Имеется очень большой граф, кол-во вершин около 10^6, кол-во ребер - 10^6, Ребер раза в 1,5 больше, чем вершин, причем некоторые вершины имеют достаточно большое кол-во ребер (10, 20). В графе есть циклы.
Для поиска макс. пути можно запускать поиск в ширину из каждой вершины и смотреть, улучшился ли макс путь на этой итерации. Но это происходит ОЧЕНЬ долго. (O(n * (n + m)) = O(2 * 10^12)). За ночь работы программы ответ так и не был найден. Какие алгоритмы можно использовать для ускорения? Может быть, какие-нибудь эвристики, дающие достаточно хороший приближенный результат. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Гм... максимальный путь и циклы как-то не стыкуются... или ещё наложено требование однократности прохода? или двукратности?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Однократности прохода. Т.е. нужно найти максимальный простой путь в данном графе.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Значит, надо идти по пути упрощения графа... поскольку
то возможно, что граф состоит из "облаков", соединённых только одним ребром? Или он всё-таки больше напоминает сферу? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Возможно. Большинство вершин (около половины) кратности 1. А какие есть идеи? Найти мосты между этими "облаками" и далее уже искать наибольший путь в каждом таком кластере?
Но, в целом, хотелось бы узнать подходы для случайных графов - т.е. для "сфер". |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Измени формат хранения, графа. Храни не как матрицу смежности. А как вершина массив смежных вершин(ссылки). БУдет (O(n * (n + m)) = O(20 * 10^6)). Рекурсия заменить циклом. А стек представь динамическим массивом. |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Хм.
У меня и сейчас O(n * (n + m)). Рекурсию не использую - она не нужна для поиска в ширину. Граф представлен списком смежности. |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Stolzen,
Проверяйте код. Код в студию. Скорее всего где-то ошибка. Должно за несколько минут считаться. Это сообщение отредактировал(а) Pavia - 17.3.2011, 21:39 |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Задача NP-полная, поэтому за несколько минут при O(E) = 10^6 и O(V) = 10^6 точное решение не получить. Но, тем не менее, вод код:
|
|||
|
||||
| Silent |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 1 Всего: 9 |
Stolzen, а вы уверены, что формулировка задачи и приведенный код говорят об одном и том же? у меня закралось сомнение, что нет - в формулировке говорится о "пути максимальной длины" (при наличии циклов), а в решение заключается в поиске пары вершин с максимальным кратчайшим расстоянием, что не одно и то же. Поправьте, если я неправ в понимании формулировки. Пример для иллюстрации:
![]() Максимальный путь - 1 2 3 4 5 (или 1 3 2 4 5), длина 4 Решение программы - 1 2 4 5 (или 1 3 4 5), длина 3 Как бы то ни было, но в приведенном коде я бы не стал так активно использовать STL (хотя и профессионально - читабельно и ясно), плюс обязательно распараллелил, раз алгоритмически улучшить не получится. черновой вариант:
Для 10000 вершин со случайным количеством ребер (1-20) у меня работает 150с. Сколько работает Ваш код, засечь не получилось - элементарно не хватает толку откомпилировать )) |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Хорошо, спасибо, посмотрю получше предложенный код.
А пробовали свой алгоритм для 10^6 вершин со случайным кол-вом ребер? 10^4 это все-таки не 10^6. И можно попробовать ваш файлик с вершинами? STL активно используется из-за способа задания вершин - вместо порядкового номера каждой вершине присвоено 4 байта, поэтому и использую hash_map. (Которая, кстати, не STL, но входит в GNU C++) Это сообщение отредактировал(а) Stolzen - 5.4.2011, 12:30 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |