数据结构问答题.docx
《数据结构问答题.docx》由会员分享,可在线阅读,更多相关《数据结构问答题.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构问答题
数据结构问答题
问答题
1、当你为解决某一问题而选择数据结构时,应从哪些方面考虑
答:
通常从两方面考虑:
第一是算法所需的存储空间量;第二是算法所需的时间。
对算法所需的时间又涉及以下三点:
(1)程序运行时所需输入的数据总量。
(2)计算机执行每条指令所需的时间。
(3)程序中指令重复执行的次数。
2、简述逻辑结构与存储结构的关系.
答:
数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联方式或“邻接关系”),数据的存储结构是数据结构在计算机中的表示,包括数据元素的表示及其关系的表示。
3、数据运算是数据结构的一个重要方面,试举例说明两个数据结构的逻辑结构和存储方式完全相同,只是对于运算的定义不同,因而两个结构具有显著不同的特性,则这两个数据结构是不同的.答:
栈和队列的逻辑结构相同,其存储表示也可相同(顺序存储和链式存储),但由于其运算集合不同而成为不同的数据结构。
数据结构复习题:
线性表
问答题
1、线性表有两种存储结构:
一是顺序表,二是链表。
试问:
(1)两种存储表示各有哪些主要优缺点
(2)如果有n个线性表同时并存,并且在处理过程中各表的长度会动态发生变化,线性表的总数也会自动地改变。
在此情况下,应选用哪种存储结构为什么
(3)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么,应采用哪种存储结构为什么
答:
(1)顺序存储是按索引(隐含的)直接存取数据元素,方便灵活,效率高,但插入、删除操作时将引起元素移动,因而降低效率;链接存储内存采用动态分配,利用率高,但需增设指示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作十分简单。
(2)应选用链接表存储结构。
其理由是,链式存储结构用一组任意的存储单元依次存储线性表里各元素,这里存储单元可以是连续的,也可以是不连续的。
这种存储结构,在对元素作插入或删除运算时,不需要移动元素,仅修改指针即可。
所以很容易实现表的容量扩充。
(3)应选用顺序存储结构。
其理由是,每个数据元素的存储位置和线性表的起始位置相差一个和数据元素在线性表中的序号成正比的常数。
由此,只要确定了起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
而链表则是一种顺序存取的存储结构。
2、用线性表的顺序结构来描述一个城市的设计和规划合适吗为什么
不合适。
因为一个城市的设计和规划涉及非常多的项目,很复杂,经常需要修改、扩充和删除各种信息,才能适应不断发展的需要。
有鉴于此,顺序线性表不能很好适应其需要,故是不合适的。
3、在单链表和双向表中,能否从当前结点出发访问到任一结点
在单链表中只能由当前结点访问其后的任一结点,因为没有指向其前驱结点的指针。
而在双向链表中,既有指向后继结点的指针又有指向前驱结点的指针,故可由当前结点出发访问链表中任一结点。
4、对链表设置头结点的作用是什么(至少说出两条好处)
-1-
答:
(1)对带头结点的链表,在表的任何结点之前插入结点或删除表中任何结点,所要做的都是修改前一结点的指针域,因为任何元素结点都有前驱结点。
若链表没有头结点,则首元素结点没有前驱结点,在其前插入结点或删除该结点时操作会复杂些。
(2)对带头结点的链表,表头指针是指向头结点的非空指针,因此空表与非空表的处理是一样的。
5、在单链表、双链表和单循环表中,若仅知道指针p指向某结点,不知道头指针,能否将结点某p从相应的链表中删去?
若可以,其时间复杂度各为多少?
答:
1.单链表。
当我们知道指针p指向某结点时,能够根据该指针找到其直接后继,但是由于不知道其头指针,所以无法访问到p指针指向的结点的直接前趋。
因此无法删去该结点。
2.双链表。
由于这样的链表提供双向链接,因此根据已知结点可以查找到其直接前趋和直接后继,从而可以删除该结点。
其时间复杂度为O
(1)。
3.单循环链表。
根据已知结点位置,我们可以直接得到其后相邻的结点位置(直接后继),又因为是循环链表,所以我们可以通过查找,得到p结点的直接前趋。
因此可以删去p所指结点。
其时间复杂度应为O(n)。
6、简述顺序表和链表存储方式的特点。
答:
顺序表可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率;而链表内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序表方便,但结点的插入、删除操作较简单。
数据结构复习题:
栈和队列
问答题
1、试述栈的基本性质
答:
由栈的定义可知,这种结构的基本性质综述如下:
(1)集合性。
栈是由若干个元素集合而成,当没有元素的空集合称为空栈;
(2)线性结构。
除栈底元素和栈顶元素外,栈中任一元素均有唯一的前驱元素和后继元素;(3)受限制的运算。
只允许在栈顶实施压入或弹出操作,且栈顶位置由栈指针所指示;
栈是允许在同一端进行插入和删除操作的特殊线性表。
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。
栈也称为后进先出表(LIFO--LatINFirtOut表)。
5、对于一个栈,给出输入项A,B,C。
如果输入项序列由A,B,C所组成,试给出全部可能的输出序列。
ABC,BAC,CBA
6、有字符串次序为3某y-a/y↑2,试利用栈给出将次序改变为3y-某ay2↑/-的操作步骤。
(可用某代表扫描该字符串函数中顺序取一字符进栈的操作,用S代表从栈中取出一个字符加到新字符串尾的出栈的操作)。
例如:
ABC变为BCA,则操作步骤为某某S某某。
某:
进栈S:
出栈某S某某某SSS某某S某某S某某SSSS7、跟踪以下代码,显示每次调用后队列中的内容。
InitQueue(qu);EnQueue(qu,'A');EnQueue(qu,'B);
-2-
EnQueue(qu,'C);EnQueue(qu,某;EnQueue(qu,某;EnQueue(qu,'D);EnQueue(qu,'E);EnQueue(qu,'F);EnQueue(qu,某)EnQueue(qu,'G);EnQueue(qu,某)EnQueue(qu,某)EnQueue(qu,某)
答:
InitQueue(qu);队列为空EnQueue(qu,'A');队列为AEnQueue(qu,'B);队列为ABEnQueue(qu,'C);队列为ABCEnQueue(qu,某;队列为ABC某EnQueue(qu,某;队列为ABC某某EnQueue(qu,'D);队列为ABC某某DEnQueue(qu,'E);队列为ABC某某DEEnQueue(qu,'F);队列为ABC某某DEFEnQueue(qu,某)队列为ABC某某DEF某EnQueue(qu,'G);队列为ABC某某DEF某GEnQueue(qu,某)队列为ABC某某DEF某G某EnQueue(qu,某)队列为ABC某某DEF某G某某EnQueue(qu,某)队列为ABC某某DEF某G某某某
8、假设Q[0..10]是一个线性队列,初始状态为front=rear=0,画出做完下列操作后队列的头尾指针的状态变化情况,若不能入队,请指出其元素,并说明理由。
d,e,b,g,h入队d,e出队i,j,k,l,m入队n,o,p入队
解答:
d,e,b,g,h入队debghFrd,e出队
bghFri,j,k,l,m入队
bghijklmFrn,o,p入队
bghijklmnop
Fr所有元素均正好能入队,共有11个存储空间,恰好11个元素
-3-
9、假设CQ[0..10]是一个环形队列,初始状态为front=rear=0,画出做完下列操作后队列的头尾指针的状态变化情况,若不能入队,请指出其元素,并说明理由。
d,e,b,g,h入队d,e出队i,j,k,l,m入队b出队n,o,p入队
解答:
图略
p不能入队,共有11个地址,p为第12个元素,故不能入队
10、有5个元素,其进栈次序为A、B、C、D、E,在各种可能的出栈次序中,以元素C、D最先出栈(即C第一个且D第一个出栈)的次序有哪几个答:
三个:
CDEBA,CDBEA,CDBAE
11、设输入元素为1、2、3、P和A,入栈次序为123PA,元素经过栈后到达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名
答:
一般说,高级语言的变量名是以字母开头的字母数字序列。
故本题答案是:
AP321,PA321,P3A21,P32A1,P321A。
12、简要叙述栈和队列的特点.
答:
栈和队列都是插入和删除操作的位置受限制的线性表。
栈是限定仅在表尾进行插入和删除的线性表,是后进先出的线性表,而队列是限定在表的一端进行插入,在另一端进行删除的线性表,是先进先出的线性表
数据结构复习题:
树和二叉树
问答题
1、对于二叉排序树,当所有结点的权都相等的情况下,最佳二叉排序树有何特点。
其特点是只有最下面的二层结点可以小于2,其它结点的度数必须为2
3、已知一组元素为(46、25、78、62、18、34、12、40、73),试画出按元素排列顺序输入而生成的一棵二叉排序树。
解答:
得到的二叉排序树如下图所示。
46
2578
183462
124073
4、已知一棵树的边的集合表示为:
(L,N),(G,K),(G,L),(G,M),(B,E),(B,F),(D,G),(D,H),(D,I),(D,J),(A,B),(A,C),(A,D))画出这棵树,并回答下列问题:
(1)树根是哪个结点?
哪些是叶子结点?
哪些是非终端结点?
(2)树的度是多少?
各个结点的度是多少?
(3)树的深度是多少?
各个结点的层数是多少?
以结点G为根的子树的深度是多少?
(4)对于结点G,它的双亲是哪个结点?
它的祖先是哪些结点?
它的孩子是哪些结点?
它的子孙是哪些结点?
它的兄弟和堂兄弟分别是哪些结点?
-4-
解答:
(1)树的根是A,而E、F、C、H、I、J、K、M、N是叶子结点,其它为非终端结点。
(2)树的度为4。
deg(A)=3,deg(B)=2,deg(D)=4,deg(G)=3,deg(L)=1,其它各叶子结点的度均为0。
(3)树的深度为5(设根结点的深度为1)。
level(A)=1,level(B)=2,level(C)=2,…,level(G)=3,…,level(K)=4,…,level(N)=5。
(4)D是G的双亲;A、D是G的祖先;K、L、M是G的孩子;K、L、M和N是G的子孙;H、I、J是G的兄弟;E、F是G的堂兄弟。
5、设高度为h的二叉树上只有度为0和度为2的结点,问该二叉树的结点数可能达到的最大值和最小值。
解答:
最大值(高度为h的满二叉树)20+21+22+…+2h-1=2h-1
最小值:
第一层只有一个结点,其余的h-1层各有2个结点,所以最小值为2h-1个。
6、设二叉树BT的存储结构如下:
12345678910┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓Lchild┃0┃0┃2┃3┃7┃5┃8┃0┃10┃1┃┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫data┃J┃H┃F┃D┃B┃A┃C┃E┃G┃I┃┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫Rchild┃0┃0┃0┃9┃4┃0┃0┃0┃0┃0┃┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛
(1)画出图。
(2)写出前序、中序、后序遍历次序。
解答:
(1)见下图。
A
B
CD
EFG
HI
J
(2)前序遍历:
ABCEDFHGIJ中序遍历:
ECBHFDJIGA后序遍历:
ECHFJIGDBA
7、已知一棵二叉树先序遍历结果为ABCDEFGHIJ,中序遍历的结果为CBEDAHGIJF,试画出该二叉树。
解答:
由前序遍历结果可知该二叉树的根结点为A。
由此及中序遍历结果可知,该二叉树在中序遍历下的左、右子树为
CBED和HGIJF
依此可推出前序遍历的左、右子树的结点序列为BCDE和FGHIJ
B和F又分别为左、右子树的根结点,进而又可推出以B为根结点的左、右子树,以及以F为根结点的左、右子树。
依此类推,可推出二叉树见下图。
A
-5-
第6趟:
61,87,170,275,462,503[897,908,653,512]第7趟:
61,87,170,275,462,503[512,653]897[908]第8趟:
61,87,170,275,462,503,512,[653]897[908]第9趟:
61,87,170,275,462,503,653,897[908]第10趟:
61,87,170,275,462,503,653,897,908
11、己知序列{503,87,512,61,908,170,897,275,653,462},请给出采用的基数排序法对该序列作升序排序时的每一趟的结果。
解答:
依题意,采用基数排序法排序的各趟的结果如下:
初始:
503,87,512,61,908,170,897,275,653,4621趟(按个位排序):
170,61,462,512,503,653,275,87,897,9082趟(按十位排序):
503,908,512,653,61,462,170,275,87,8973趟(按百位排序):
61,87,170,275,462,503,512,653,897,908
12、己知序列{70,83,100,65,10,32,7,9},请给出采用直接插入排序法对该序列作升序排序时的每一趟的结果。
解答:
原始序列:
70,83,100,65,10,32,7,9第1趟结果:
70,83,100,65,10,32,7,9第2趟结果:
70,83,100,65,10,32,7,9第3趟结果:
65,70,83,100,10,32,7,9第4趟结果:
10,65,70,83,100,32,7,9第5趟结果:
10,32,65,70,83,100,7,9第6趟结果:
7,10,32,65,70,83,100,9第7趟结果:
7,9,10,32,65,70,83,100
13、己知序列{10,18,4,3,6,12,1,9,18,8},请给出采用希尔排序法对该序列作升序排序时的每一趟结果。
解答:
原始序列:
10,18,4,3,6,12,1,9,18,8
分成5个子序列的结果:
10,1,4,3,6,12,18,9,18,8再分为2个子序列的结果:
10,1,4,3,6,12,18,9,18,8最后结果:
1,3,4,6,8,9,10,12,18,18
14、己知序列{10,18,4,3,6,12,1,9,18,8},请给出采用归并排序法对该序列作作升序排序时的每一趟的结果。
解答:
采用2路归并排序的结果如下:
初始状态:
10,18,4,3,6,12,1,9,18,8第1趟归并后:
10,18,3,4,6,12,1,9,8,18第2趟归并后:
3,4,10,18,1,6,9,12,8,18第3趟归并后:
1,3,4,6,9,10,12,18,8,18
最后1趟归并得结果:
1,3,4,6,8,9,10,12,18,18
15、在冒泡排序过程中,有的关键字在某趟排序中朝着与最终排序相反的方向移动。
试举例说明之。
快速排序过程中有没有这种现象
在逆序时排序码会朝着与最终位置相反的方向移动。
例如(5,4,2,1),第一趟冒泡排序后为(4,2,1,5),关键字4的位置被移动到首位,朝着与最终排序相反的方向移动。
快速排序没有这种现象。
16、如果在10^6个记录中找到两个最小的记录,你认为可采用下列方法中的什么关的排序方法所需的关键字比较次数最少共计多少
根据堆排序的特点,每次都是输出一个堆顶元素,然后对堆进行再调整,保证堆顶元素总是当前剩下元素的最大或最小,从而可知,欲在一个大量数据的文件中,如10^6个记录中找到两个最小的记录,可采用堆排序。
17、如果只想得到一个序列中第k个最小元素之前的部分排序序列,最好采用什么排序方法为什么如由这样的一个序列:
{57,40,38,11,13,34,84,75,25,6,19,9,7}得到其第4个最小元素之前的部分序列{6,7,9,11},使用所
-11-
选择的算法实现时,要执行多少次比较
解答:
采用堆排序最合适,依题意可知只需取得第k个最小元素之前的排序序列时,堆排序的时间复杂度Ο(n+klog2n),若k≤nlog2n,则得到的时间复杂性是Ο(n)。
对于上述序列得到其前4个最小元素,使用堆排序实现时,执行的比较次数如下:
初始建堆:
比较20次,得到6;第一次调整:
比较5次,得到7;第二次调整:
比较4次,得到9;第三次调整:
比较5次,得到11。
18、对于快速排序的非递归算法,可以用队列(而不用栈)实现吗若能,说明理由;若不能,也要说明理由。
可以用队列来代替。
在快速排序的过程中,通过一趟划分,可以把一个待排序区间分为两个子区间,然后分别对这两个子区间施行同样的划分。
栈的作用是在处理一个子区间时,保存另一个区间的上界和下界。
这个功能利用队列可以实现,只不过是处理子区间的顺序有所变动而已。
19、己知下列各种初始状态(长度为n)的元素,试问当利用直接插入法进行排序时,至少需要进行多少次比较(要求排序后的文件按关键字从小到大顺序排列)
解答:
依题意,最好情况下的比较次数即为最少比较次数。
⑴插入第i(2≤i≤n)个元素的比较次数为1,因此总的比较次数为:
1+1+……+1=n-1⑵插入第i(2≤i≤n)个元素的比较次数为i,因此总的比较次数为:
2+3+……+n=(n-1)(n+2)/2⑶比较次数最少的情况是所有记录关键码按升序排列,总的比较次数为:
n-1⑷在后半部分元素的关键码均大于前半部分元素的关键码时需要的比较次数最少,总的比较次数为:
n-120、若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:
(1)查找不成功,即表中无关键字等于给定值k的记录.
(2)查找成功,即表中有关键字等于给定值k的记录.答:
(1)有序和无序都是n+1
(2)有序和无序都是(n+1)/2
21、己知一个有序表为{12,18,20,25,29,32,40,62,83,90,95,98},当二分查找法为29和90的元素时,分别需要多少次比较才能查找成功若采用顺序查找时,分别需要多少次比较才能查找成功
答:
二分法查29时,需要比较3次才能查找成功。
二分法查90时,需要比较3次才能查找成功;顺序查找29时,需要比较5次才能查找成功。
顺序查找90时,需要比较10次才能查找成功。
22、关键字序列{7,4,1,14,100,30,5,9,20,134},设哈希函数为h(key)=KeyMod13,试给出表长为13的哈希表(用线性探测开放定址法处理冲突),并求出在等概率情况下,查找成功时和查找不成功时的平衡查找长度.答:
k74114100305920134k6411945974
散列地址0123456789101112关键字11443075201009134
成功到位次数1212132128
不成功到位次数1321987654321查找成功的平均查找长度为(1+2+1+2+1+3+2+1+2+8)/10=23/10
查找不成功的平均查找长度为(1+3+2+1+9+8+7+6+5+4+3+2+1)/13=4
-12-
23、比较直接插入排序和希尔排序的不同点.
答:
直接插入排序:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
希尔排序:
是针对直接插入排序算法的改进,该方法又称缩小增量排序。
该方法实质上是一种分组插入方法24、给出关键字序列{17,8,21,35,32,15,21,25,12,23}的直接插入排序过程.答:
(8,17)21,35,32,15,21,25,12,23(8,17,21)35,32,15,21,25,12,23(8,17,21,35)32,15,21,25,12,23(8,17,21,32,35)15,21,25,12,23(8,15,17,21,32,35)21,25,12,23(8,15,17,21,21,32,35)25,12,23(8,15,17,21,21,25,32,35)12,23(8,12,15,17,21,21,25,32,35)23(8,12,15,17,21,21,23,25,32,35)25、指出堆和二叉排序树的区别
答:
在二叉排序树中,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序序列。
所以,二叉排序树是结点之间满足一定次序关系的二叉树;堆是一个完全二叉树,并且每个结点的值都大于或等于其左右孩子结点的值(这里的讨论以大根堆为例),所以,堆是结点之间满足一定次序关系的完全二叉树。
26、堆排序是否是一种稳定的排序方法为什么试举例说明。
答:
堆排序不是稳定的排序方法。
因为堆排序再调整堆时,有可能使原来键值相等的元素的相对位置改变,所以是不稳定排序。
例如对键值序列{7,4,2,2},建小根堆由小到大排序的结果是{2,2,4,7},两个2的相对位置改变了。
27、对于n个元素组成的线性表进行快速排序,所需要进行的比较次数与这n个元素的初始排列有关。
问:
(1)当n=7时,最好情况下需进行多少次比较?
请说明理由。
(2)当n=7时,给出一个最好情况的初始排列的实例。
(3)当n=7时,在最坏情况下需进行多少次比较?
请说明理由。
(4)当n=7时,给出一个最坏情况的初始排序的实例。
答:
(1)在最好情况下,假设每次划分能得到两个长度相等的子文件,文件的长度n=2k-1,那么第一遍划分得到两个长度均为n/2的子文件,第二遍划分得到4个长度均为n/4的子文件,以此类推,总共进行k=log2(n+1)遍划分,各子文件的长度均为1,排序完毕。
当n=7时,k=3,在最好情况下,第一遍需比较6次,第二遍分别对两个子文件(长度均为3,k=2)进行排序,各需2次,共10次即可。
(2)在最好情况下快速排序的原始序列实例:
4,1,3,2,6,5,7。
(3)在最坏情况下,若每次用来划分的记录的关键字具有最大值(或最小值),那么只能得到左(或右)子文件,其长度比原长度少1。
因此,若原文件中的记录按关键字递减次序排列,而要求排序后按递增次序排列时,快速排序的效率与冒泡排序相同,其时间复杂度为O(n2)。
所以当n=7时,最坏情况下的比较次数为21次。
(4)在最坏情况下快速排序的初始序列实例:
7,6,5,4,3,2,1,要求按递增排序。
28、已知{503,87,512,61,908,170,897,275,653,462},采用二路归并排序法对该序列作升序排序时的每一趟的结果。
答:
初始关键字:
503,87,512,61,908,170,897,275,653,462一趟归并之后:
87,503,61,512,170,908,275,897,462,653两趟归并之后:
61,87,503,512,170,275,897,908,462,653三趟归并之后:
61,87,170,275,503,512,897,908,462,653四趟归并之后:
61,87,170,275,462,503,512,653,897,908
-13-
29、在堆排序、快速排序和归并排序中:
(1)若只从存储空间考虑,则应首先选取哪能种排序方法,其次选取哪种排序方法,最后选取哪种排序方法?
(2)若只从排序结果的稳定性考虑,则应选取哪种排序方法?
(3)若只从平均情况下排序最快考虑,则应选取哪种排序方法?
(4)若只从最坏情况下排序最快并且要节省内存考虑,则应选取哪种排序方法?
答:
(1)堆排序,快速排序,归并排序
(2)归并排序(3)快速排序(4)堆排序
30、有一个有序表R[1..13]={1,3,9,12,32,41,45,62,7