давайте предположим, что у нас есть симметричная матрица.Сжатие симметричной матрицы в C++
A=
1 2 3
2 6 4
3 4 5
сейчас, так как это симметрично, нам не нужно запоминать все числа в нем. Предположим положить 0 в ячейки левого нижнего треугольника.
B =
1 2 3
0 6 4
0 0 5
, если я хочу, чтобы получить доступ к содержимому 0 элементу B все, что нужно сделать, это инвертировать строку и столбец заинтересованной ячейки:
if(i>j) val += L[j][i] // ex: B[1][0] is stored in B[0][1]
(давайте предположим, что цель состоит в том, чтобы суммировать все незарегистрированные элементы)
В этой точке мы используем только верхний правый треугольник, но на самом деле мы не сохраняем память, потому что неиспользуемые элементы по-прежнему выделяются значением 0.
один способ экономии памяти является использование вектор векторов:
vector<vector<int>> C;
и изменять размер каждой строки, соответственно.
C=
1 2 3
6 4
5
Делая это жестко, мы не можем использовать своп трюк больше, потому что, как вы можете заметить, что пустые элементы теперь в правом нижнем треугольнике матрицы.
Нераспределенные значения затем:
D=
x x x
x x 2
x 3 4
в этом случае элементы, которые мы заинтересованы в могут быть найдены с этим, если условие:
if(j >= size - i)
теперь проблема заключается в определении правильного содержания из 0 элементов. Другими словами:
if(j >= size - i) ans += L[?][?]
так, например, если я нахожусь в = 1 J = 2 я не должен получить доступ к элементу [1] [2], но вместо того, чтобы [0] [2] = 2 (и так далее [2] [1] -> [0] [2] = 3, [2] [2] -> [1] [1] = 4).
как это можно достичь?
В чем проблема? – Arnaud
Почему вы хотите сжать свой рабочий набор? Если вы не говорите об ограничениях на машины, выполняйте сжатие программного обеспечения только при сериализации (в файл, сеть и т. Д.). –