История изменений
Исправление BruteForce, (текущая версия) :
Где я такое подаю? Но в практическом смысле таки победа - код получился намного прямее и читабельней сишной бажной лапши
Человек какие-то графы вычислял, и сначала реализовал на сишке. Всё по-красоте - списки на указателях и, вообще, оптимизировал как это полагается в сишке. Потом переписал на раст, и поначалу тоже закопался в RefCell-ах, не вывез, плюнул и переписал в лоб на хэшмапах вообще не задумываясь об оптимизации и … обошёл свою «оптимизированную» сишную версию процентов на 20-30 (точно не помню, но порядок такой).
Графы вычислял со списками на указателях — уже звучит странно. В «Алгоритмах» (3-е изд.) Кормена, Лейзерсона и Ко предлагают списки смежности для sparse графов и матрицы смежности для dense графов, проговаривая для первого случая, что нужен массив списков. При этом для любого графа известно, что для ориентированных графов сумма длин всех списков равна кол-ву вершин и в два раза больше для неориаентированного графа. Что также позволяет использовать один массив для представления «списков». На мой дилетантский взгляд, здесь не нужны ни списки (т.к. список смежности — это массив, два массива или массив массивов), ни указатели (т.к. для работы с массивами даже психически проще работать с индесками, а не с адресами и смещениями). При этом производить доп. аллокаций не нужно в обоих случаях, и даже у фанатов адресов+смещений указатели не «провиснут».
«Оптимизировал как это полагается в сишке» — я не очень понимаю, что это значит. В любом случае, похоже, что он оптимизировал очень неоптимальный выбор примитивов. Стоило ознакомиться со справочной литературой, ИМХО, прежде чем приступать к такому делу.
и переписал [списки] в лоб на хэшмапах вообще не задумываясь об оптимизации
Есть, на мой взгляд, относительно мало мест где классический список как набор нод со ссылками на след\пред быстрее хешмапов: например в каком-нибудь LRU кеше с небольшим кол-вом элементов. Поэтому мне и кажется потешным, что при замене неэффективного контейнера на более эффективный кто-то может испытывать удивление от роста производительности.
Я, кстати, не оч понимаю зачем тут хешмап? Что там у него было ключом?
UPD: Полистал википедию, вижу такое: https://en.wikipedia.org/wiki/Sparse_matrix#Storage , где
-
Coordinate list — это три массива
-
CSR/CSC и Ко — это 3 массива
-
DOK, где как раз нужна мапа, не приспособлен для вычислений
-
LIL, где как раз «списки», тоже «another format good for incremental matrix construction», а не для проведения рассчетов.
Исходная версия BruteForce, :
Где я такое подаю? Но в практическом смысле таки победа - код получился намного прямее и читабельней сишной бажной лапши
Человек какие-то графы вычислял, и сначала реализовал на сишке. Всё по-красоте - списки на указателях и, вообще, оптимизировал как это полагается в сишке. Потом переписал на раст, и поначалу тоже закопался в RefCell-ах, не вывез, плюнул и переписал в лоб на хэшмапах вообще не задумываясь об оптимизации и … обошёл свою «оптимизированную» сишную версию процентов на 20-30 (точно не помню, но порядок такой).
Графы вычислял со списками на указателях — уже звучит странно. В «Алгоритмах» (3-е изд.) Кормена, Лейзерсона и Ко предлагают списки смежности для sparse графов и матрицы смежности для dense графов, проговаривая для первого случая, что нужен массив списков. При этом для любого графа известно, что для ориентированных графов сумма длин всех списков равна кол-ву вершин и в два раза больше для неориаентированного графа. Что также позволяет использовать один массив для представления «списков». На мой дилетантский взгляд, здесь не нужны ни списки (т.к. список смежности — это массив, два массива или массив массивов), ни указатели (т.к. для работы с массивами даже психически проще работать с индесками, а не с адресами и смещениями). При этом производить доп. аллокаций не нужно в обоих случаях, и даже у фанатов адресов+смещений указатели не «провиснут».
«Оптимизировал как это полагается в сишке» — я не очень понимаю, что это значит. В любом случае, похоже, что он оптимизировал очень неоптимальный выбор примитивов. Стоило ознакомиться со справочной литературой, ИМХО, прежде чем приступать к такому делу.
и переписал [списки] в лоб на хэшмапах вообще не задумываясь об оптимизации
Есть, на мой взгляд, относительно мало мест где классический список как набор нод со ссылками на след\пред быстрее хешмапов: например в каком-нибудь LRU кеше с небольшим кол-вом элементов. Поэтому мне и кажется потешным, что при замене неэффективного контейнера на более эффективный кто-то может испытывать удивление от роста производительности.
Я, кстати, не оч понимаю зачем тут хешмап? Что там у него было ключом?