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

浙公网安备 33010602011771号