【数据结构复习】408数据结构中线性表大题整理

两个有序顺序表的中位数)一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为S的中位数。例如列S1=(11,13,15,17,19),则S1中的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若92=(2,4,6,8,20),则.S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。

要求: (1)给出算法的基本设计思想。 

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

    (3)说明你所设计时间复杂度和空间复杂度

(1)①先分别求出两个升序序列A,B的中位数,a,b

   ②若a=b,则两序列的中位数相同,a,b即为所求,算法结束

   ③若a

   ④若a>b,则舍弃A中较大的一半,同时舍弃B中较小的一半,舍弃的长度相同

    在保留的两个序列中,重复①②③步,直到两个序列中均只有一个元素为止,较小的那个元素即为中位数

(3)时间复杂度O(log2n),空间复杂度O(1)


数组中元素的整体调换)设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面尽可能高效的算法。将R中的序列循环左移P(0

要求: (1)给出算法的基本设计思想。(5分)

    (2)根据设计思想,用程序设计语言描述算法,关键之处给出注释。(7分)

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

(1)①将数组按P划分为两个部分,第一部分a长度为P,第二部分b长度为n-p,数组形为ab

   ②将数组中第一部分a进行逆置,数组变为a-1b

   ③在将数组的第二部分b进行逆置,数组变为a-1b-1

   ④最后将数组整体的进行逆置,数组变为(a-1b-1)-1=ba,达到循环左移P个位置的效果

(3)对于逆置长度为L的数组,时间复杂度为O(L/2)。所以本算法的时间复杂度为O(P/2)+O((n-P)/2)+O(n/2)=O(n),空间复杂度为O(1)


数组中的众数)已知一个整数序列A=(a0,a1,…,an-1),其中0≤ain/2(0≤pk

假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素;否则输出-1。

要求: (1)给出算法的基本设计思想。

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

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

(1)①首先假设序列的第一个元素为主元素m,遍历数组,统计其出现的次数记为count,count初始值为1

   ②遍历数组的过程中,若遍历到的数与假定的主元素相同,则count加1,否则减1

   ③若count等于0,则将主元素假定为当前遍历到的元素,继续向后遍历

   ④遍历一遍数组结束后,得到假定的主元素c,再遍历一遍数组,检查c出现的次数是否大于n/2,若大于则即为所求,若小于则没有主元素

(3)时间复杂度O(n),空间复杂度O(1)


找到链表某一特定位置的数)已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0,

要求: (1)描述算法的基本设计思想; 

    (2)描述算法的详细实现步骤; 

    (3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C++或Java语言实现),关键之处请给出简要注释。

(1)①用2个指针p和q从头结点开始遍历链表,p先向后遍历而q不遍历

   ②当p遍历除了头结点外的k个结点后,q和p同时向后遍历;若p没有遍历到k个结点,没有找到其位置,算法结束

   ③当p遍历到链表尾部时,输出q所指的结点的data值,算法结束


查找两个链表的公共子链表)假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间。例如,“loading”和“being”的存储映像如下图所示。

设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为。请设计一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)。

要求: (1)给出算法的基本设计思想。 

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

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

(1)①先遍历两个链表分别得到其长度l1,l2

   ②假设长度较短的为l2,str1从l2-l1+1的位置开始遍历,str2从l2开始遍历

   ③当两个链表遍历到结点的next相同时,及找到共同的后缀的起始位置,算法结束

(3)时间复杂度为O(l1+l2)


删除链表中重复元素)用单链表保存m个整数,结点的结构为:[data][link],且|data|≤n(n为正整数)。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。例如,若给定的单链表head如下:

则删除结点后的head为:

要求: (1)给出算法的基本设计思想。

    (2)使用C或C++语言,给出单链表结点的数据类型定义。

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

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

(1)①因为|data|≤n(n为正整数),故选择一个长度为n的数组来统计链表中所出现的data的绝对值。例arr[m-1]=0,表示m没有出现;arr[m-1]=1,表示m出现过。并使数组的初值均为0.

   ②遍历整个链表中data的值,若arr[data-1]=0,则将其置位1;若arr[data-1]=1,则不做改变

   ③再次遍历整个列表中data的值,若arr[data-1]=1,则保留该节点,并将arr[data-1]置为0;所arr[data-1]=0,则删除该节点。

(4)时间复杂度O(m),空间复杂度O(n)

你可能感兴趣的:(考研)