顺序表算法设计:数据采用顺序存储结构,利用顺序表的基本操作来求解任务。
【例1】:一直长度为n 的线性表,A采用顺序存储结构,设计一个时间复杂度为O(n),空间复杂度为O(1),的算法,改算法删除线性表中所有值为x的数据元素。
以下两种算法均不满足要求:
①:如果每删除一个值为x的元素,都进行移动,其时间复杂度为O(n2),空间复杂度为O(1).
②:如果借助一个新的顺序表,存放将A中所有不为x 的元素,其时间复杂度为O(n),空间复杂度为O(n)
解法一:设删除A中的所有值为x元素后的顺序表为A1,显然A1包括A中,为此A1重用A的空间
思路:扫描顺序表A,中间A只包含不等于x的元素
对应的算法为:
void delnode1(SqList *&A,ElemType x)
{
int k=0,i; //记录值不等于x的个数,i扫描A中的所有元素
for(i=0;i<A.length;i++)
{
if(A->data[i]!=x) //
{
A->data[k]=A->data[i];
k++; //不等于x的元素的值加1
}
}
A->length=k;
}
解法二:删除所有x=2的元素的个数,k记录删除元素的个数,初值为0
对应的算法如下:
void delnode2(SqList *&A,ElemTyp