具有m和n个非零元素的矩阵M和N分别被以三元组表的形式存储在A和B当中。现假设A的空间足够大,请编写算法,在不增加额外辅助空间的情况下用0(m+n)的时间复杂度将B中值大于x的元素加到A的对应位置上去,并将结果存储在A中。矩阵的压缩存储采取以行序为主的方式。
strA=1,strB=1,strM=1;//定义指向A部分元素的指针(还未确定位置),B部分元素的指针(还未确定位置),已经被序好的部分的指针(A中的)
while(strA<=A.tu&&strB<=B.tu){
if(A.data[strA].i>B.data[strB].i){//B的行下标小
//B的元素大于x
if(B.data[strB].e>x){
//将strA和strB指向的元素交换位置
//并将strA,strM指针后移
swap(A.data[strA],B.data[strB]);
A.tu+=1;//A的元素个数增加
strA+=1;
strM+=1;
}else{//B的元素小于x
strB+=1;//后移
}
}else if(A.data[strA].i>B.data[strB].i) {//A的行下标小
//将strA,strM指针后移
strA+=1;
strM+=1;
}else{//A,B的行下标相等 ,比较列下标
if(A.data[strA].j<B.data[strB].j){//B的列下标小 和上面一样
//B的元素大于x
if(B.data[strB].e>x){
//将strA和strB指向的元素交换位置
//并将strA,strM指针后移
swap(A.data[strA],B.data[strB]);
A.tu+=1;//A的元素个数增加
strA+=1;
strM+=1;
}else{//B的元素小于x
strB+=1;//后移
}
}else if(A.data[strA].j>B.data[strB].j){//A的列下标小
//将strA,strM指针后移
strA+=1;
strM+=1;
}else{//同样大
//B的元素大于x
if(B.data[strB].e>x){
//并将strA,strB,strM指针后移
A.data[strM].e=A.data[strA].e+B.data[strB].e;
strA+=1;
strB+=1;
strM+=1;
}else{//B的元素小于x
strA+=1;
strB+=1;
strM+=1;
}
}
}
//将其余元素加进去
while(strA<=A.tu) {//这个循环应该不用写 只有可能
//将strA,strM指针后移
strA+=1;
strM+=1;
}
while(strB<=B.tu) {
//B的元素大于x
if(B.data[strB].e>x){
//将strA和strB指向的元素交换位置
//并将strA,strM指针后移
swap(A.data[strA],B.data[strB]);
A.tu+=1;//A的元素个数增加
strA+=1;
strM+=1;
}else{//B的元素小于x
strB+=1;//后移
}
}
}