关于十字链表存储稀疏矩阵的时间复杂度问题,请高手指点
以下是关于数据结构中,数组的十字链表储存结构,在分析这个算法的时间复杂度时,遇到了这样一个问题。书中《数据结构(C语言版 严蔚敏)》介绍这个算法的时间复杂度是O(t*s),s=max{m,n}。可是我在分析过程中,觉得这个算法的时间复杂度是O(t*m*n),因为在矩阵非零元素的存储过程中,每建立一个节点,都要在行链表和列链表中寻找插入位置,而我们设想最坏的结果就是在 for(q=M.rhead[i];(q->right)&&q->right->j<j;q=q->right)这个循环遍历了M.rhead[i]所指行的所有的同行不同列的元素,for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down)这个循环遍历了M.chead[j]同列不同行的元素,而
这样,这个算法的时间复杂度就是O(t*m*n)。
伪码清单:
typedef struct OLNode
{
int i,j;
ElemTypr e;
struct OLNode *right,*down;
}OLNode; *OLink
typedef struct
{
OLink *rhead,*chead;
int mu,nu,tu;
}CrossList;
Status CreateSMatrix_OL(CrossList&M)
{
if(M) free(M);
scanf(&m,&n,&t);
M.mu=m; M.nu=n;M.tu=t;
if(!(M.rhead=(OLink*)malloc((m+1)*sizef(OLink)))) exit(OVERFLOW);
if(!(M.chead=(OLink*)malloc((n+1)*sizef(OLink)))) exit(OVERFLOW);
M.rhead[]=M.chead[]=NULL;
for(scanf(&i,&j,&e);i!=0;scanf(&i,&j,&e))
{
if(!(p=(OLNode *)malloc(sizef(OLNode)))) exit(OVERFLOW);
p->i=i;p->j=j;p->e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
p->right=M.rhead[i];M.rhead[i]=p;
}
else
{ for(q=M.rhead[i];(q->right)&&q->right->j<j;q=q->right);
p->right=q->right;
q->right=p;
}
if(M.chead[j]==NULL||M.chead[j]->i>i)
{
p->down=M.chead[j];M.chead[j]=p;
else{
for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);
p->down=q->down;
q->down=p;
}
}
return OK;
}//CreateSMatrix_OL