簡體   English   中英

在Java中表示上三角矩陣的最佳數據結構是什么?

[英]What is the best data structure for representing an upper triangular matrix in Java?

假設給出了一個上三角整數矩陣。 在Java中存儲它的最佳方法是什么? 天真的2d int數組顯然效率不高。 我提出的解決方案已移至答案部分。

如果你想節省內存,你的解決方案看起來很棒 - 它被稱為打包存儲矩陣 逐列,自上而下,您的數組將如下所示: 1 2 6 3 7 8 4 1 9 5

基於總和公式(n² + n) / 2基於零),我建議更簡單地計算指數。

list_index = (column^2 + column) / 2 + row;

實現可能如下所示:

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;
    }
}

還有另外一個關於SO討論(負面)性能影響的問題,盡管它與Fortran有關。

番石榴的Table怎么樣? 它使用HashMaps或TreeMaps(以及必要時的2D數組)實現,但它提供了比定義Map<Integer, Map<Integer, V>>更好的API。

如果矩陣總是對角線,我會使用:

List<List<Integer>> matrix = ...

如果是稀疏矩陣,我會使用地圖:

Map<Map<Integer>> = ...

在第二種情況下,您可能需要使用get和set操作將映射包裝在一個類中,以便管理對新行和列的訪問。

所有這些都取決於您的需求,記憶限制和矩陣大小。

我想我找到了解決方案。 這是我的解決方案:假設你有一個4X4上三角矩陣M.

1 2 3 4
0 6 7 1
0 0 8 9
0 0 0 5

如果您可以在1d數組中映射M的每個元素,那么這是最佳解決方案。 您需要知道的是知道哪個[row,col]矩陣對應於1d數組的哪個元素。 以下是你如何做到的魔力:

start_index=((col_index-1)+1)+((col_index-2)+1)+...+1
end_index=start_index + col_index

例如:如果我想查找矩陣的第3列上的元素在數組中:

start_index=((3-1)+1)+((3-2)+1)+((3-3)+1)=6
end_index=6+3=9

所以,我需要做的就是從我的數組的索引6開始,並讀取所有元素直到索引9(包括第9個元素)。 按照此過程,您可以在(n + n ^ 2)/ 2空間中存儲和檢索nXn矩陣的所有單元格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM