数据结构错题总结

选择题

  • 算法原地工作:辅助空间相对于输入数据是常数
  • 同一个算法,实现语言的级别越高,执行效率就越低(√)
  • 算法+数据结构=程序
  • 确定性:每条指令必须有确切的含义,对于相同的输入应只能得到相同输出
  • 可行性:算法描述操作都可以通过已经实现的基本运算执行有限次来实现
  • 存储结构分为:顺序存储;索引存储;链式存储;散列存储
  • 数据元素处理数据的基本单位
  • 数据项:最小单位
  • 静态链表中指针表示的是【数组下表】——下一个元素的下标
  • ((x>0)?x*f(x-1):2)若x>0为真,取f(x-1),若x<0为假,取2
  •  用链接方式存储的队列,在进行删除运算时候:头尾指针都可能要修改【假设队列只有一个元素,则头尾都要设空】

已知输入序列为abcd经过输出受限的双向队列得到的输出序列有

Dacb、cadb、dbca、以上答案都不对

若以1234作为双端序列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是 1234、4231、4132、4213

  • 最大容量为n的循环队列,队尾指针是rear,对头是front,则队空的条件是rear=front
  • 三对角矩阵:根据三对角矩阵压缩方法,将A[1~n][1~n]压缩至B[0,3n-3]时,aij与bk对应关系k=2i+j-3,压缩至B[1,3n-2],aij与bk对应关系为k=2i+j-2
  • 广义表head去掉括号,tail不去掉
  • 广义表深度即看有多少个括号长度就是看第一层括号里,逗号有几个
  • 广义表的表头可以是原子项,也可以是广义表
  • 一个算术表达式有中缀和后缀,让算前缀表达式,直接画出二叉树,P19
  • 树:结点数=分支数+1
  • N0=n2+1
  • 哈弗曼树是完全二叉树,叶节点即权值点,剩余全是度为2的点。
  • 若二叉树采用二叉链表存储结构,要交换其所有分支节点左、右子树的位置,利用后序遍历方法最合适
  • 一个n个顶点的连通无向图,其边的个数至少为n-1
  • 一个n个结点的图,至少有1个连通分量,最多有n个连通分量
  • 所谓连通分量,指的是无向图中的极大连通子图
  • 无论是有向图还是有向图,深度遍历皆可以使用
  • 求指定源点到其余各顶点的迪杰斯特拉最短路径算法中弧上权不能为负的原因是【负的无法求出最短路径】
  • 利用迪杰斯特拉求每一对不同顶点之间的最短路径的算法是O(n^3)
  • 弗洛伊德求每对不同顶点对的算法中允许弧上的权为负,但不能有权和为负的回路
  • 求最短路径的弗洛伊德算法的时间复杂度为O(n^3)
  • 若一个有向图的邻接矩阵中,主对角线以下的元素均为0,则该图的拓扑有序序列存在【aij 有边,aji无边,没有环,所以拓扑序列一定存在,当aij和aji都有时,容易出现环】
  • 若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为(N+1)/2
  • 文件局部有序或者文件长度较小的情况下,最佳内部排序的方法是直接插入排序
  • 用直接插入排序方法对以下的四个序列进行排序(由小到大),元素比较次数最少的【找基本有序的。and每一个元素离最终位置不远】
  • 对下列关键字序列用快速排序法进行排序时候,速度最快的情形时【找基元,每一次的基元正好将序列分成两半】
  • 将两个各有n个元素的有序表归并成一个有序表其最少的比较次数是n
  • 在含有n个关键字的小根队中,关键字最大的记录可能存储在n/2向下取整+2【从1 开始,非叶应该是n/2向下取整+1】
  • 基于比较方法的n个数据的内部排序,最坏情况下的时间复杂度能达到的最好的下界是O(nlogn)【从n/2向下取整+1开始一直到n都是叶子结点,叶子结点可能会是Max】
  • 采用简单选择排序,比较次数和移动次数为O(n*n),O(n)
  • 对n个记录的线性表进行快速排序为减少算法的递归深度,每次分区后,先处理较短的部分
  • 插入排序:直接插入、折半插入、希尔排序
  • 交换:冒泡、快速排序
  • 选择:简单选择、堆排序
  • 在排序算法中每一项都与其他各项进行比较,计算出小于该项的项的个数,以确定该项的位置叫做枚举排序

判断题

顺序存储无需存储元素之间的关系

顺序存储插入和删除操作效率很低

数据逻辑结构和存储结构无关

算法+数据结构=程序

在顺序存储结构中,有时候也存储数据结构中的元素之间的关系(×)【物理上的相邻便理解为它的逻辑关系】

数据结构的基本操作的设置的最重要的准则是,实现应用程序和存储结构的独立(√)

链表中的头结点仅起到标识的作用(×)【不仅有标识作用,还有其插入、删除操作都变成一类了,不需要分开】

线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的(×)【结点内部各个成员的域是连续的】

为了很方便的插入和删除数据,可以使用双向链表存放数据(√)

消除递归不一定需要使用栈,此说法(√)【如果是伪递归,便可以使用循环来完成,例如n!=n(n-1)!,0!=1】

有n个数顺序(依次)进栈,出栈序列有Cn中,Cn=( )

任何一个递归过程都可以转换成非递归过程(√)

只有那种使用了局部变量的递归过程在转换成非递归过程时才必须使用栈(×)【是由递归还是伪递归来决定的,不是局部变量】

广义表()和(())。前者是长度为0的空表,对其不能做求表头和表尾的运算。而后者是长度为1的非空表(只不过该表中唯一的一个元素是空表),对其可进行分解,得到的表头和表尾均是空表

循环队列的通过用指针来实现队列的头尾相接(×)【循环队列用来解决假满的问题,但是其使用取余运算来实现。rear=(rear+1)%m】

数组不适合作为任何二叉树的存储结构(×)

稀疏矩阵压缩存储后,必会失去随机存取功能(√)

数组是同类型值的集合(×)【应该是同类型 数据 的集合】

数组可看成线性结构的一种推广,因此与线性表一样,可以对它进行插入、删除等操作(×)【对于二维数组来说,其实是多对多的关系】

一个稀疏矩阵A m*n采用三元组形式表示,若把三元组中有关行下标和列下标的值互换,并把m和n的值进行互换,则就完成了A m*n的转置运算(×)【排列的时候行列值,行由小到大,然后列由小到大,调整之后,没有改变顺序,不符合三元组的要求,所以错啦】

广义表中的元素或者是一个不可分割的原子,或者是一个非空的广义表(×)【可以是空的广义表。或者这样说非空的广义表中的元素或者是一个不可分割的原子,或者是一个非空的广义表】

二维以上的数组其实是一种特殊的的广义表(√)

广义表的取表尾运算,其结果通常是个表,但有时候也是个单元素值(×)【表尾不去掉括号】

若一个广义表的表头为空表,则此广义表亦为空表(×)【(())此是有一个空表,但是长度为1的广义表】

广义表的同级元素(直属于同一个表中的各元素)具有线性关系(√)

一个广义表可以为其他广义表所共享(√)

串是一种数据对象和操作都特殊的线性表(√)

二叉树是度为2的有序树(×)【是小于等于2的有序树】

对于有n的结点的二叉树,其高度为 (×)【应为 (完全二叉树),也可以单分支】

【二叉树常考性质:

  1. 设非空二叉树中度为0、1、2的节点个数分别为n0、n1、n2,则n0=n2+1
  2. 结点数=分支数+1
  3. 二叉树的第i层至多有 (i≥1)
  4. M叉树第i层至多有 (i≥1)
  5. 高度为h的二叉树至多有个结点(满二叉树)
  6. 高度为h的m叉树至多有

【完全二叉树

  1. 具有n个(n>0)结点的完全二叉树的高度h为
  2. 完全二叉树最多只会有一个度为1的结点】

树可用投影法进行中序遍历(×)【二叉树可以用投影法进行前序中序的遍历,不是树】

二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该树的根节点是哪一个,则可以确定这棵二叉树(×)【需要有中序才行】

树【先、后】森林【先、中】二叉树【先、中】

用树的前序遍历和中序遍历可以导出树的后序遍历(×)【树是先根、后根,没有先序、后序这种说法】

用一维数组存储二叉树时,总是以前序遍历顺序存储结点(×)【层次遍历】

【三种线索化特点:

  1. 前序线索化二叉树:不用栈就能遍历二叉树
  2. 中序线索化二叉树:所有非空线索均指向其祖先结点
  3. 后续线索化二叉树:不是完备的线索化二叉树,遍历要借助栈来实现】

中序遍历二叉链存储的二叉树时,一般要用堆栈(√);

中序遍历检索二叉树时,也必须使用堆栈(×)【可以直接得到排好的队列】

中序遍历一棵二叉排序树的结点就可得到排好序的节点序列(√)

给定一棵树,可以找到唯一的一棵二叉树与之对应(×)【不同的规则可以对应到不同的二叉树,不是惟一的,但是一定可以找到一棵二叉树与之对应】

任何二叉树的后序线索树进行后序遍历时都必须使用栈(×)【假设只要根,但其也为二叉树,并且不需要用栈】

任何一棵二叉树都可以不用栈实现前序线索树的前序遍历(√)

二叉树只能用二叉链表表示(×)【完全二叉树和满二叉树可以用顺序存储来表示】

一棵有n个结点的二叉树(完全二叉树),从上到下,从左到右用自然数依次给予编号,则编号为i的结点的左儿子的编号为2i(2i<n),右儿子是2i+1(2i+1<n)(×)【如果是从1开始,应该是≤ n】

二叉树中每个结点至多有两个子节点,而对一般树则无此限制,因此,二叉树是树的特殊情形(×)【二叉树是有序的,树是无序的,二叉树不是树的特殊】

必须把一般树转换成二叉树后才能进行存储(×)【树可以自己存储,转成二叉树只是因为简单】

树与二叉树是两种不同的树形结构(√)

在中序线索二叉树中,线索每一非空的线索均指向其祖先结点(√)

线索二叉树的优点是便于在中序下查找前驱结点和后继结点。(√)

二叉树中序线索后,不存在空指针域(×)【第一个结点无前驱】

非空的二叉树一定满足:某结点若有左孩子,则其中序前驱一定没有右孩子(√)

在n个结点的无向图中,若边数大于n-1,则该图必是连通图(×)【必要不充分条件】

强连通分量是无向图的极大强连通图(×)【强连通分量是描述有向图的术语】

连通分量指的是有向图中的极大连通子图(×)【是无向图】

邻接多重表是无向图和有向图的链式存储结构(×)【邻接矩阵是有、无向图均可以存储。有向图在邻接表存储时,因为其存储的是出度,所以存入度还必须要在画一个逆邻接表,所以就比较麻烦。十字链表的引用就是为了解决有向图的一种存储结构】

十字链表是无向图的一种存储结构(×)【是有向图】

用邻接矩阵法存储一个图所需的存储数目与图的边数有关(×)【O(n*n)是一定的】

有向图的邻接矩阵是对称的(×)【是无向图】

用邻接矩阵存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小与图中结点个数有关,而与图的边数无关(√)

广度遍历生成树描述了从起点到各顶点的最短路径(×)【需要说明当各权值相等】

任何无向图都存在生成树(×)【生成树:n个结点要n-1边连起来】

带权无向图的最小生成树必是唯一的(×)

最小代价生成树是唯一的(×)

最小生成树的KRUSKAL算法是一种贪心法(√)

求最小生成树的普利姆(prim)算法中边上的权可正可负(×)【正的,但是运行的时候正负不影响】

即使有向无环图的拓扑序列唯一,也不能唯一确定该图(√)

对一个AOV网,从源点到终点的路径最长的路径称作关键路径(×)【AOV:拓扑排序】

关键路径是AOE网中从源点到终点的最长路径(√)

AOE网一定是有向无环图(√)

在表示某工程的AOE网中,加速其关键路径上的任意关键活动均可缩短整个工程的完成时间(×)【一个延长都延长,但是缩短需要一套组合拳,关键活动都缩短才可以】

任何有向图的结点都可以排成拓扑排序,而且拓扑序列不唯一(×)【必须得是有向无环图才能排成拓扑】

AOV网的含义是以边表示活动的网(×)【顶点表示活动,边表示活动的相关顺序】

散列法的平均检索长度不随表中结点数目的增加而增加,而是随负载因子的增大而增大(√)

哈希表的结点中只包含数据元素自身的信息,不包含任何指针(×)【如果是拉链法,则需要指针】

用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度(×)【折半查找需要用顺序存储】

就平均查找长度而言,分块查找最小,折半查找次之,顺序查找最大(×)【分块介于折半查找和顺序查找之间,折半最小】

对无序表用二分法查找比顺序查找快(×)【二分必须有序,且顺序存储】)

对于大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找成功长度是相同的,而对于查找失败,他们的平均查找长度是不同的(√)【利用顺序查找进行查找有序表和无序表时,查找成功时的平均长度是相同的,查找失败的时,有序表会提前结束,而无需表不会提前结束】

最佳二叉树是AVL树(平衡二叉树)(√)

完全二叉树肯定是平衡二叉树(×)【从平衡因子定义看,完全二叉树任一结点的平衡因子的绝对值确实是小于等于1。但是,平衡二叉树本质上是二叉排序树,完全二叉树不一定是排序树。故不能说完全二叉树是平衡二叉树。】

二叉树中除叶节点外,任一节点X,其左子树根节点的值小于该节点的(X)的值;其右子树根节点的值≥ 该节点X的值,则此二叉树一定是二叉排序树(×)

N个结点的二叉排序树有多种,其中树高最小的二叉排序树是最佳的(√)【变为平衡二叉树】

将线性表中的节点信息组织成平衡的二叉树,其优点之一是总能保证任意检索长度均为 量级(n为线性表中的结点数目)(√)

在9阶B-树中,除叶子以外的任意节点的分支数介于5和9之间(×)【分支数 ~m,应该还除了根】

B+树既能索引查找也能顺序查找(√)【B+树中,所有的叶子结点中包含了全部关键码的信息,即指向含有这些关键码记录的指针,且叶子结点本身依关键码的大小自小而大的顺序链接】

当待排序的元素很大时,为了交换元素的位置,移动元素要占用较多的时间,这是影响时间复杂度的主要因素(×)

在执行某个排序算法过程中,出现了排序码朝着最终排序序列位置的相反方向移动,则该算法是不稳定的(×)

两分法插入排序所需比较次数与待排序记录的初始排列状态相关(×)【两分法—折半查找法,应该是无关的】

堆肯定是一棵平衡二叉树(×)【堆属于二叉排序树,左右子树和根有关系】

堆是满二叉树(×)【完全二叉树】

在用堆排序算法排序时,如果要进行增序排序,则需要采用“大根堆”(√)【递减,用小根堆】

在分配排序时,最高位优先分配法比最低位优先分配法简单(×)

冒泡排序和快速排序都是基于交换两个逆序元素的排序方法,冒泡排序算法是最坏时间复杂度是O(N*N),而快速排序的最坏时间复杂度是O( ),所以快速排序比冒泡排序算法效率更高(×)【快速排序得最坏的时间复杂度是O(n*n)】

冒泡排序算法在最好情况下的时间复杂度是O(n)(√)

填空题

线性表L用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数为(n-1)/2

根据线性表的链式存储结构的中每一个结点包含的指针个数,将线性链表分为单链表和多重链表,而又根据指针的连接方式,链表又可分成为静态链表和动态链表

链接存储的特点是利用指针来表示数据元素之间的逻辑关系

顺序存储结构是通过物理上的相邻表示元素之间的关系的,链式存储结构是通过指针表示元素之间的关系的

对于双向链表,在两个节点之间插入一个新结点需要修改的指针共4个,单链表为2个

栈是操作受限的线性表

两个栈共享空间时栈满的条件为栈顶差值为1

多个栈共存时,最好用链式作为存储结构

顺序栈用data[1````n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是data[++top]=x

循环队列的引入,目的是为了克服假满

用下表0开始的N元数组实现循环队列时,为实现下标变量M加1后在数组有效下标范围内循环,可采用的表达式是:M=(M+1)%N

区分循环队列的满与空,只有两种方法,他们是牺牲和设标志

设循环队列的数组A【1···M】表示,队首、队尾指针分别是Front和TAil,判定队满的条件是(Tail+1)%M==Front

  • 18
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值