|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Привет. В продолжне архивариуса https://www.sql.ru/forum/1282300/chetvergovyy-arhivarius Возникла прикладная задача из двух частей. Часть 1. Схлопывание мостов. Дано: орграф произвольного вида. 50 тысяч вершин и примерно 260 тысяч рёбер. По статистике которую я собирал каждая вершина имеет примерно 5 исходящих ребер. Необходимо: программно удалить рёбра типа (4)->(5) как на картинке. После удаления ребра - вершины (4) и (5) схлопываются и создаётся новая вершина с новым идентификатором из свободных. Например (50000). При этом входящие связи в (4) и исходящие из (5) сохраняются. Часть 2. Разгон Оптимизировать этот-же алгоритм с учотом мультипоточности. Исходные данные. Еще не готовы. Но я опубликую чуть позже набор ребер со связями в текстовом виде (CSV) Картинке соотвествует примерно такой файл. Код: sql 1. 2. 3. 4. 5. 6. 7.
Ребра имеют ориентацию поэтому 1,4 и 4,1 это разные рёбра. Приветствуется - любая реализация на Java / Kotlin / Scala. - мультипоточка, стримы, коллекции - примитивы синхронизации Go-go писать код. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:03 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
mayton, Схлопывать только вершины соединенные одной веткой? А какая скорость обработки должна быть по ТЗ? 50 тысяч вершин довольно небольшой объем там особо мультипоточность даром не упала так как все разместится в памяти все можно через хештейбл реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:48 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Попробуем. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:49 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Данные готовы. Первый том. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:54 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Второй ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:54 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Хопа. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:55 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Еще ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:55 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
И еще ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:55 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Фух. Последний. Пробуйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 21:56 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
UP. Any updates? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 19:00 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
mayton UP. Any updates? можно по подробней, какой файл финальный и сколько там данных? На мой взгляд там довольно прозрачная структура данных намечается, все вершины где входящий один будут всхлопнуты, что довольно быстро определяется. по О натации алгоритм должен сработать за O(N+m) времени где m - число точек всхлапывания, N - все точки. Не совсем ясно допускаются ли паралельные дуги и петли т.е. когда две точки графа соединены двумя одинаково ориентированными ребрами и когда дуга (ребро с направлением) делает петлю т.е. к примеру 4,4 Но вцелом очень козырная задача... редкая находка в наши дни борьбы за деньзнаки. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 00:31 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Я опубликовал финальный файл. В нем 48955 вершин и 258215 связей между ними. Я пытался решать эту задачу используя матрицу смежности. В родительском топике. Но мне не хватило памяти для массива. Произведения 50000 на 50000 давало величину в штуках больше чем индекс массива в Java. И это только первое ограничение. И если массив я просто преодолел разбивая матрицу на слои как торт. То второе ограничение - медленная скорость поиска смежных вершин по матрице - я не преодолел. Это - слабое место структуры данных и я полностью отказался от матрицы. Заменил ее на список вершин где для каждой вершины есть списки входящих и исходящих ребер. Фрагмент вершины Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 11:41 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
По алгоритму. Что я еще не учел? Возможно кейсов схлопывания больше чем я нарисовал на картинке. Возможно петли и циклы не запрещают нам это сделать. Я чуть позже приаттачу еще одну картинку где есть частные случаи. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 11:49 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Базистам эту задачу решать можно? Сделать таблицу WAR_AND_SEC(A number, B number), залить туда CSV, наделать апдейтов и выгрузить обратно. Для H2 DB создание+загрузка выглядит так: Код: plsql 1.
Кандидаты на схлопывание: Код: plsql 1.
Схлопывание - это обновление A и B новыми значениями плюс удаление записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 12:20 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Да. Да. Базистам это решать можно. Всем можно. Но я просто по инерции продолжал тему оптимизации текстовых литературных графов. Просто сама постановка была настолько интересно что я решил ее очистить от ненужной шелухи и выдать отдельным топиком как чистую алгоритмизацию на Java. Реляционки обычно плохо справляются с графовыми задачами но если вы это сделаете - то у нас будет еще и повод просто сравнить время отклика для двух одинаковых исходных данных в Pure-Java и H2-Java. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 12:27 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Еще несколько кейсов. На картинке. Case (1) Одно-направленная цепочка смежных вершин (chain) должна быть схлопнута в 1 вершину если нет прочих входящих и исходящих ребер в середине этой цепочки. Case (2) Дву-направленная цепочка не схлопыватеся. Case (3) Вот такой вод ориентированный подграф схлопывает цепочки { 1->2->3 } и создает новую вершину 9 Это простой случай. А вот с {3 -> 4 -> 5 -> 6 } несмотря на то что образуют цикл тем не менее могут быть схлопнуты в части {4 -> 5-> 6 } т.к. топологически мы не нарушаем структуру которая была. Просто выбрасываем лишнее. И на рисунке (4) - результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:45 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Ну что. Идей нету? Брейншторм? Algorithm: GraphEdgeSimplification-alg-0.1 1.Дано. Орграф. G(V,E), 2.Для всех ребер. Ei={Vin,Vout}, удалить ребро если вершины входящие в Vin и исходящие из Vout дают в пересечении пустое множество. 3.Повторять пункт (2) для всех ребер пока граф изменяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 21:06 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Сидение на этом форуме несет два смысла. Первое - это решать продуктовые проблемы. Чем ты занят. И второе - это просто for fun. То чем занят я. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 22:55 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Zzz79, Тебя просто к нормальным задачам не подпускают. Хотя ты прав в том что такие задачи достаются меньшинству. Но чтобы их получить нужно иметь некий уровень знаний. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 00:09 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Zzz79 и охота тебе этой дичью заниматься) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 07:07 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
забыл ник просто к нормальным задачам не подпускают. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 07:08 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Может я чего не понял, но если ноды схлопываются только в том случае, когда между ними единственный маршрут, то для каждой пары нод нужно искать путь из одной ноды в другую. Сложность "тупого рекурсивного" поиска маршрута прикидочно может достигать 50 000 (кол-во нод) x 5 (путей из каждой ноды) => до 50 - 250 тысяч рекурсий/циклов, и отжирать примерно столько же стека. Теоретически возможно тут нужно было бы 50 000 возводить в степень 5-ки, но это если искать все маршруты. Нам же нужен только факт, что такой маршрут есть, т.е. если мы повторно входим в ноду, то поиск сразу же прекрашаем. Результат работы массив из 5 ячеек, есть ли (сколько) маршрутов в соседние ячейки. Плюс временный массив на 50 000 элементов, где хранится были ли мы уже в этой ноде. Таких поисков нужно запускать 50 000 раз. Поскольку схлопывание может быть рекурсивным (например граф вырождается в банальное кольцо), алгоритм возможно рекурсивно запускать до 50 000 раз. Время работы одного прогона на Java (при оптимизации), я бы оценил от 10 000 секунд, т.е. где-то 3-10 часов (железо уровня AWS tiny instance) для одного прогона. Но это без рекурсивного схлопывания. При многопроцессорности кратно меньше. Для рекурсивном схлопывание, наверное, нужно посчитать один раз матрицу N x N ( 50 x 50 = 2 500 000 000 элементов) кол-во маршрутов из A в B. Т.к. при схлопывание кол-во марщрутов из A и B изменится не должно (мне так кажется), то не нужно будет перевычислять маршруты. Кол-во маршрутов из A в B нам интересно только 0 - нет маршрута, 1 - толкьо один маршрут, 2 - два и _более_ маршрута (схлопывать нельзя). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 14:03 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
mayton ... Фрагмент вершины Код: java 1. 2. 3. 4. 5.
Крайне не оптимально. Я бы вершины кодировал бы просто целым числом в массиве (т.е. до 2 млр. вершин), сответственно outgoingEdges, incomingEdges можно сделать просто int[] outgoingVertex; Аналогично и хранение результатов в стеке, все возвраты - тупо int. Объекты даром не нужны. Коллекции - только оптимизированные (не стандартные!) для работы с примитивными типами. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 14:04 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev mayton ... Фрагмент вершины Код: java 1. 2. 3. 4. 5.
Крайне не оптимально. Я бы вершины кодировал бы просто целым числом в массиве (т.е. до 2 млр. вершин), сответственно outgoingEdges, incomingEdges можно сделать просто int[] outgoingVertex; Аналогично и хранение результатов в стеке, все возвраты - тупо int. Объекты даром не нужны. Коллекции - только оптимизированные (не стандартные!) для работы с примитивными типами. Разумно. Согласен. Я сейчас сразу менять код не буду. Иначе у меня 80% кода надо будет срочно переписать. Но я ставлю. Код: java 1.
В чем был поинт хранения ребер как объектов. В базовой постановке https://www.sql.ru/forum/1282300/chetvergovyy-arhivarius ребро хранило вес. Тоесть количество пробегов по нему. И здесь в этой задаче оптимизации оно стало рудиментом. Хотя я планировал и вертексы и рёбра сделать генериками чтобы внутрь еще что-то кодкладывать. Разные метки для алгоритмов типа дейсктры и возможно признак блокировки для мультипоточки. При объектах (references) накладные расходы на храение - одинаковы что для вершин что для ребер. Идентификатор vertex у меня был строковый. String. Он хранил токен. Или строку из литературного произведения. А для данной постановки я просто искусственно очистил все id-шники и заменил их на sequence целых чисел. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 14:15 |
|
Java :: Пятничное схлопывание толстых графов.
|
|||
---|---|---|---|
#18+
mayton, На скорую рука как-то так. Правда цепочки типа 1->2->3->4 коллапсируют в пустое множество Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 15:15 |
|
|
start [/forum/topic.php?fid=59&msg=39998162&tid=2120682]: |
0ms |
get settings: |
15ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
31ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
454ms |
get tp. blocked users: |
0ms |
others: | 279ms |
total: | 790ms |
0 / 0 |