If you want to save memory, your solution looks great - it is called a packed storage matrix . Column by column, from top to bottom, your array will look like this: 1 2 6 3 7 8 4 1 9 5
I would suggest a simpler calculation of your indices based on the sum formula (n² + n) / 2 (row and column are based on zero value).
list_index = (column^2 + column) / 2 + row;
The implementation may look like this:
public class TriangularMatrix { private final int[] list; public TriangularMatrix(int size) { list = new int[sumFormula(size)]; } public int set(int row, int column, int value) { validateArguments(row, column); int listIndex = getListIndex(row, column); int oldValue = list[listIndex]; list[listIndex] = value; return oldValue; } public int get(int row, int column) { validateArguments(row, column); return list[getListIndex(row, column)]; } private void validateArguments(int row, int column) { if (row > column) { throw new IllegalArgumentException("Row (" + row + " given) has to be smaller or equal than column (" + column + " given)!"); } } private int getListIndex(int row, int column) { return sumFormula(column) + row; } private int sumFormula(int i) { return (i*i + i) / 2; } }
There is another question about SO that discusses the (negative) impact of performance, although this applies to Fortran.
source share