002.稀疏矩阵的转置

暴力方法复杂度太高,若能在转置时直接计算出转置后元素的下标,就可以把复杂度将为线性
具体方法是依赖数组\(cpot[]\),计算出转置前每一列首元素在转置后的位置,转移方程\(cpot[i+1]=cpot[i]+num[i]\)

// 矩阵转置
void TranTat(TSMatrix& tb)
{
    tb.rows = cols;
    tb.cols = rows;
    tb.nums = nums;

    if (nums == 0) {
        return;
    }

    tb.data = new TupNode<ElemType>[nums];

    // 计算每列的非零元素个数
    int* num = new int[cols + 1]();
    for (int i = 0; i < nums; i++) {
        num[data[i].c]++;
    }

    // 计算每列的起始位置
    int* cpot = new int[cols + 1]();
    cpot[1] = 0;
    for (int col = 2; col <= cols; col++) {
        cpot[col] = cpot[col - 1] + num[col - 1];
    }

    // 转置
    for (int i = 0; i < nums; i++) {
        int col = data[i].c;
        int pos = cpot[col];
        tb.data[pos].r = data[i].c;
        tb.data[pos].c = data[i].r;
        tb.data[pos].d = data[i].d;
        cpot[col]++;
    }

    delete[] num;
    delete[] cpot;
}
posted @ 2025-06-02 14:33  _P_D_X  阅读(22)  评论(0)    收藏  举报