数据结构学习笔记(六)链表算法题

来源:互联网 发布:cs1.6 for mac 编辑:程序博客网 时间:2024/06/14 11:19

第一题

问题

设顺序表用数组A[]表示,表中元素存储在数组下标1~m+n的范围内,前m个元素递增有序,后n个元素递增有序,设计一个算法,使得整个顺序表有序。
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。

解答

(1)算法基本设计思想:
将数组A[]中的m+n个元素(假设元素为int型)看成两个顺序表,表L和表R。将数组当前状态看做起始状态,即此时表L由A[]中前m个元素构成,表R由A[]中后n个元素构成。要使A[]中m+n个元素整体有序只需将表R中的元素逐个插入表L中的合适位置即可。插入过程:取表
R中的第一个元素A[m+1]存入辅助变量temp中,让temp逐个与A[m],A[m-1],…,A[1]进行比较,当temp<A[j](1≤j≤m)时,将A[j]后移一位;否则将temp存入A[j+1]中。重复上述过程继续插入A[m+2],A[m+3],……,A[m+n],最终A[]中元素整体有序。

(2)算法描述

void Insert(int A[],int m,int n){    int i,j;    int temp;    //辅助变量,用来暂存待插入元素。    for(i=m+1;i<=m+n;i++) {    //将A[m+1…m+n]插入到A[1…m]中。    temp=A[i];    for(j=i-1;j>=1&&temp<A[j];j--)        A[j+1]=A[j];    //元素后移,以便腾出一个位置插入temp。    A[j+1]=temp;    //在j+1位置插入temp。    }}

(3)算法时间和空间复杂度
①本题的规模由m和n共同决定。取最内侧循环中A[j+1]=A[j];这一句作为基本操作,其执行次数在最坏的情况下为:f(m,n)=(m+m+n-1)n/2=mn+n2/2–n/22
②算法额外空间中只有一个变量temp,因此空间复杂度为O(1)。

第二题

问题

已知递增有序的单链表A,B(A,B中元素个数分别为m,n且A,B都带有头结点)分别存储了一个集合,请设计算法以求出两个集合A和B的差集A-B(即仅由在A中出现而不在B中出现的元素所构成的集合)。将差集保存在单链表A中,并保持元素的递增有序性。

(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度。

解答

(1)算法基本设计思想:
只需从A中删去A与B中共有的元素即可。由于两个链表中元素是递增有序的所以可以这么做:设置两个指针p, q开始时分别指向A和B的开始结点。循环进行以下判断和操作,如果p所指结点的值小于q所指结点值,则p后移一位;如果q所指结点的值小于p所指结点的值,则q后移一位;如果两者所指结点的值相同,则删除p所指结点。最后p与q任一指针为NULL的时候算法结束。

(2)算法描述:

void Difference(LNode *&A, LNode *B) {    LNode *p = A->next, *q = B->next; //p和q分别是链表A和B的工作指针。    LNode *pre = A;    LNode *r;    while(p != NULL && q != NULL) {        if(p->data < q->data) {            pre = p;   //pre 为A中p所指结点的前驱结点的指针。            p = p->next;  //A链表中当前结点指针后移。        }        else if (p->data > q->data)            q = q->next;        else {            pre->next = p->next;    //B 链表中当前结点指针后移。            r = p;    //处理A,B中元素值相同的结点,应删除。            p = p->next;            free(r);    // 删除结点。        }    }}

(3)算法时间复杂度分析:
由算法描述可知,算法规模由m和n共同确定。算法中有一个单层循环,循环内的所有操作都是常数级的,因此可以用循环执行的次数作为基本操作执行的次数。可见循环执行的次数即为p, q两指针沿着各自链表移动的次数,考虑最坏的情况,即p, q都走完了自己所在的链表,循环执行m+n次。即时间复杂度为O(m+n)。

0 0
原创粉丝点击