其他分享
首页 > 其他分享> > 【认证】线性表的顺序表示【408统考】

【认证】线性表的顺序表示【408统考】

作者:互联网

顺序表的定义

一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻

顺序表的特点

逻辑顺序与其物理顺序相同

线性表L存储的起始位置为LOC(A),sizeof(ElemType)是每个数据元素所占用存储空间的大小,则表L所对应的顺序存储

线性表的顺序存储结构是一种随即存取的存储结构

通常用高级程序设计语言中的数组来描述线性表的顺序存储结构

查看代码
#define MaxSize 50            //定义线性表的最大长度
typedef struct{
    ElemType data[MaxSize];   //顺序表的元素
    int length;               //顺序表的当前长度
}SqList;                      //顺序表的类型定义

 

一维数组可以静态分配,也可以是动态分配

静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃

动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性地划分所有空间。

动态分配并不是链式存储,它同样属于顺序存储结构,物理结构没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时动态决定。

#define InitSize 100          //表长度的初始定义
typedef struct{
    ElemType *data;           //指示动态分配数组的指针
    int MaxSize,length;       //数组的最大容量和当前个数
}SqList;                      //动态分配数组顺序表的类型定义

C的初试动态分配语句为

L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

C++的初始动态分配语句为

L.data=new ElemType[InitSize];

 

顺序表最主要的特点是随机访问,即通过首地址和元素序号可在时间0(1)内找到指定的元素。

顺序表的存储密度高,每个结点只存储数据元素。

顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。

顺序表上基本操作的实现

插入操作

在顺序表L的第i (1<=i<=L. 1ength+1)个位置插入新元素e。

bool ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=MaxSize)
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

最好情况:在表尾插入(即i=n+ 1),元素后移语句将不执行,时间复杂度为0(1)。

最坏情况:在表头插入(即i= 1),元素后移语句将执行n次,时间复杂度为0(n)。

平均情况:假设pi (pr= 1/(n+ 1)是在第i个位置上插入一个结点的概率,则在长度为n的线性表中插入-个结点时,所需移动结点的平均次数为n/2

删除操作

删除顺序表L中第i (1<=i<=L. length)个位置的元素,用引用变量e返回。

bool ListDelete(SqList &L,int i,Elemtype &e){
    if(i<1||i>L.length)
        return false;
    e=L.data[i-1];
    for(int j=i,j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
}

最好情况:删除表尾元素(即i=n),无须移动元素,时间复杂度为0(1)。

最坏情况:删除表头元素(即i= 1),需移动除表头元素外的所有元素,时间复杂度为O(n)。

平均情况:假设pi (p= 1/n)是删除第i个位置上结点的概率,则在长度为n的线性表中删除一个结点时,所需移动结点的平均次数为n-1/2

按值查找【顺序查找】

在顺序表L中查找第一个元素值等于e的元素,并返回其位序

int LocateElem(SqList L,ElemType e){
    int i;
    for(i=0;i<L.length;i++)
        if(L.data[i]==e)
            return i+1;    //下标为i的元素值等于e,返回其位序1+1
        return 0;          //退出循环,说明查找失败
}

最好情况:查找的元素就在表头,仅需比较一-次, 时间复杂度为0(1)。

最坏情况:查找的元素在表尾(或不存在)时,需要比较n次,时间复杂度为O(n)。

平均情况:假设p; (p;= 1/n)是查找的元素在第i (1<=i<=L. length)个位置上的概率,则在长度为n的线性表中查找值为e的元素所需比较的平均次数为n+1/2

 因此,线性表按值查找算法的平均时间复杂度为O(n)。

试题精选

单项选择题

1.下述()是顺序存储结构的优点。

A.存储密度大

B.插入运算方便

C.删除运算方便

D.方便地运用于各种逻辑结构的存储表示

2.线性表的顺序存储结构是一种( ).

A.随机存取的存储结构

B.顺序存取的存储结构

C.索引存取的存储结构

D.散列存取的存储结构

3.一个顺序表所占用的存储空间大小与( )无关.

A.表的长度

B.元素的存放顺序

C.元素的类型

D.元素中各字段的类型

4.若线性表最常用的操作是存取第i个元素及其前驱和后继元素的值,为了提高效率,应采用( )的存储方式。

A.单链表

B.双向链表

C.单循环链表

D.顺序表

5.一个线性表最常用的操作是存取任一指定序号的元素并在最后进行插入、删除操作,则利用( )存储方式可以节省时间。

A.顺序表

B.双链表

C.带头结点的双循环链表

D.单循环链表

6.在n个元素的线性表的数组表示中,时间复杂度为0(1)的操作是( )。

I. 访问第i(1≤i≤n)个结点和求第i (2≤i≤n)个结点的直接前驱

II.在最后一个结点后插入一个新的结点

II. 删除第1个结点

IV. 在第i(1≤i≤n)个结点后插入一个结点

A. I

B. II、III

C. I、II

D. I、II、 III

7.设线性表有n个元素,严格说来,以下操作中,( ) 在顺序表上实现要比在链表上实现的效率高。

I. 输出第i(1≤i≤n)个元素值

II.交换第3个元素与第4个元案的值

III.顺序输出这n个元素的值

A. I

B. I、III

C. I、II

D. II、III

8.在一个长度为n的顺序表中删除第i(1≤i≤n)个元素时,需向前移动( )个元素。

A. n

B. i-1

C. n-i

D. n-i+ 1

9.对于顺序表,访问第i个位置的元素和在第i个位置插入-一个元素的时间复杂度为( )。

A.O(n),O(n)

B.O(n), O(1)

C.O(1),O(n)

D. O(1), O(1)

10.若长度为n的非空线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,贝i的合法值应该是( ).

A. l≤i≤n

B.1≤i≤n+ 1

C. 0≤i≤n-l

D.0≤i≤n

11. 顺序表的插入算法中,当n个空间已满时,可再申请增加分配m个空间,若申请失败,则说明系统没有()可分配的存储空间。

A. m个

B. m个连续

C. n+m个

D. n+m个连续

综合应用题

1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为0(1)。

3.对长度为n的顺序表L,编写一个时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为x的数据元素.

4.从有序顺序表中删除其值在给定值s与1之间(要求s<1)的所有元素,若s或1不合理或顺序表为空,则显示出错信息并退出运行。

5.从顺序表中删除其值在给定值s与1之间(包含s和1,要求s<1)的所有元素,若s或1不合理或顺序表为空,则显示出错信息并退出运行。

6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

7.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

8. 已知在一维数组A【m + n】中依次存放两个线性表(a1, Q2, .... am)和(b1, b2, b... bn). 试编写一个函数,将数组中两个顺序表的位置互换,即将(b|, b2, b..", bn)放在(a1, a2, a,"", am)

的前面。

9.线性表(a1, a2, a,-. a,)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序.

10. 【2010统考真题】设将n (n> 1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X, x.,.. Xx_ )变换为(Xp xp+1). 要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

3)说明你所设计算法的时间复杂度和空间复杂度。

11. 【2011 统考真题】一个长度为L (L≥1)的升序序列S,处在第【L/27个位 置的数称为S 的中位数。例如,若序列S=(11, 13,15, 17,19),则S|的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8, 20),则Si和S2的中位数是11.现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。.

3)说明你所设计算法的时间复杂度和空间复杂度。

12. 【2013统考真题】已知一个整数序列A= (ao, a.,.",an-1), 其中0≤a<n (0≤i<n)。若存在ap1=ap2= ... =apm=x 且m>n/2 (0≤px<n,1≤k≤m),则称x为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7), 则A中没有主元素。假设A中的n个元素保存在一个一-维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素;否则输出-1.要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

3)说明你所设计算法的时间复杂度和空间复杂度。

13. 【2018 统考真题】给定一个含n (n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4.要求:

1)给出算法的基本设计思想.

2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。

3)说明你所设计算法的时间复杂度和空间复杂度。

14. 【2020 统考真题】定义三元组(a,b,c) (a、b、 c均为正数)的距离D=|a-b|+|b-c|+|c-a|。给定3个非空整数集合S小、S2和S,"按升序分别存储在3个数组中。请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a, b,c) (a∈S,b∈S, c∈s;) 中的最小距离。例如Si={-1,0,9}, Sz={-25,-10, 10,11}, S3= {2,9, 17, 30,41},则最小距离为2,相应的三元组为(9, 10, 9)。要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C语言或C++语言描述算法,关键之处给出注释。

3)说明你所设计算法的时间复杂度和空间复杂度。

标签:结点,顺序,线性表,复杂度,元素,算法,统考,408
来源: https://www.cnblogs.com/yyyyfly1/p/16063978.html