数据结构复习题chap1 绪论部分内容
目录
Chap 1 绪论
一. 单选题
1. (单选题)可以用 定义一个完整的数据结构。
- A. 数据元素
- B. 数据对象
- C. 数据关系
- D. 抽象数据类型
正确答案: D:抽象数据类型
答案分析:数据结构是由数据元素、数据对象和数据关系组成的,定义一个完整的数据结构通常使用抽象数据类型:描述了数据的逻辑结构和抽象运算。
--摘自维基百科
2. (单选题)以下数据结构中,( )是非线性数据结构。
- A. 树
- B. 字符串
- C. 栈
- D. 队列
正确答案: A:树;
答案分析:树是典型的非线性数据结构,而字符串、栈和队列都是线性数据结构。
逻辑结构可分为“线性”和“非线性”两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列;非线性结构则相反,呈非线性排列。
- 线性数据结构:数组、链表、栈、队列、哈希表,元素之间是一对一的顺序关系。
- 非线性数据结构:树、堆、图、哈希表。
非线性数据结构可以进一步划分为树形结构和网状结构。
- 树形结构:树、堆、哈希表,元素之间是一对多的关系。
- 网状结构:图,元素之间是多对多的关系。
--摘自《Hello-algo》
3. (单选题)以下属于逻辑结构的是( )
- A. 顺序表
- B. 哈希表
- C. 有序表
- D. 单链表
正确答案: C:有序表;
答案分析:有序表描述的是数据元素之间的一种逻辑关系,而顺序表、哈希表和单链表涉及具体的存储结构。
逻辑结构描述的是数据元素之间的关系和组织方式,而存储结构则是数据在计算机内存中的具体存放方式。
顺序表 (A):
- 存储结构:顺序表是一种存储结构,数据元素按照顺序存放在连续的内存空间中。
- 例子:像数组一样,所有元素一个接一个排列。
哈希表 (B):
- 存储结构:哈希表通过哈希函数将数据映射到特定位置,主要用于快速查找。
- 例子:用哈希函数确定元素的位置,类似字典,按键值存放。
有序表 (C):
- 逻辑结构:有序表强调的是数据元素之间的有序关系,即数据按某种顺序排列。它描述的是一种逻辑关系,不具体指明如何存储。
- 例子:一个电话簿,按字母顺序排列,但不指明数据是存储在纸上还是电子文件中。
单链表 (D):
- 存储结构:单链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
- 例子:像火车车厢,每节车厢连着下一节,每个节点知道下一个节点的位置。
通俗理解:
想象你要整理一堆书:
- 逻辑结构(有序表):书按大小、颜色或类别排好。这只是说你要按某种顺序摆放书,并不管具体怎么放。
- 存储结构:
- 顺序表:书在书架上一个接一个排好。
- 哈希表:书按某种规则分开放到不同位置,比如根据书名首字母分组。
- 单链表:每本书都有一个标记告诉你下一本书在哪,相当于每本书连着下一本。
有序表就是你心里对这些书有个顺序,不管它们具体怎么放;而顺序表、哈希表、单链表是具体怎么放这些书的方法。
4. (单选题)以下关于数据结构的说法中,正确的是( )
- A. 数据的逻辑结构独立于其存储结构。
- B. 数据的存储结构独立于其逻辑结构。
- C. 数据的逻辑结构唯一决定了其存储结构。
- D. 数据结构仅有逻辑结构和存储结构来决定。
正确答案: A:数据的逻辑结构独立于其存储结构。
答案分析:数据的逻辑结构描述数据元素的关系,不依赖具体的存储方式。
数据结构包括三个要素,缺一不可。
有了上一题的理解,这题理解应该不会困难~
5. (单选题)在存储数据时,通常不仅要存储各数据元素,还要存储( )
- A. 数据的操作方法
- B. 数据元素的类型
- C. 数据元素之间的关系
- D. 数据的存取方法
正确答案: C:数据元素之间的关系;
答案分析:数据元素之间的关系是逻辑结构的一部分,必须存储以便正确组织数据。
没啥好解释的,元素及其之间的关系,没了.
6. (单选题)一个算法应该是( )
- A. 程序
- B. 问题求解步骤的描述
- C. 要满足五个基本特性
- D. A和C
正确答案: B:问题求解步骤的描述;
答案分析:算法是一系列明确的步骤或规则,用于解决某个特定的问题。它是逻辑上的描述,不是具体的程序代码。算法在计算机科学中用于设计解决问题的方法,它可以用自然语言、伪代码或者流程图表示。
A. 程序:
- 程序是用某种编程语言编写的实现算法的具体代码。
- 程序是算法的具体实现,但算法本身不等同于程序。算法可以脱离程序而存在。
B. 问题求解步骤的描述:
- 这是算法的正确定义。算法是一系列步骤的描述,用于解决特定的问题。
- 例如,解决一个排序问题的算法描述了如何比较和交换数据元素来达到排序的目的。
C. 要满足五个基本特性:
- 虽然算法通常具有五个基本特性(输入、输出、有穷性、确定性和可行性),但这只是算法的属性描述,而不是算法的定义。
- 五个特性是对算法的要求,不是算法的本质定义。
D. A和C:
- 如上所述,程序是算法的具体实现,而算法本身是逻辑上的步骤描述,且五个特性是对算法的要求。因此,A和C的组合不能正确定义算法。
通俗解释
想象你要教朋友如何做一道菜:
- 算法(B):这是你写的菜谱,详细描述了从准备食材到烹饪的每一步。这是解决“如何做这道菜”的步骤。
- 程序(A):这是你在厨房里实际做菜的过程,你根据菜谱一步步操作。这是菜谱的具体实现。
- 五个基本特性(C):这是对一个好菜谱的要求,比如步骤清晰、结果可重复等。但这些只是菜谱应该具备的特点,不是菜谱本身。
所以,算法是解决问题的步骤描述(就像菜谱),而程序是你实际操作(做菜)的过程。五个基本特性是好算法(好菜谱)应具备的要求。
7. (单选题)某算法的时间复杂度为O(
),表明该算法的( )
- A. 问题规模是
- B. 执行时间等于
- C. 执行时间与
成正比
- D. 问题规模与
成正比
正确答案: C:执行时间与成正比;
答案分析:时间复杂度描述了算法执行时间随输入规模变化的增长率。
8. (单选题)
设n 是描述问题规模的非负整数,下面的程序片段时间复杂度是( )
x=2;
while(x<n/2)
x=2*x;
- A.
- B.
- C.
- D.
正确答案: A
逐步分析:
初始值:x=2
循环条件:
循环体:
循环执行情况
- 每次循环,
x
的值都会翻倍。
设 k
是循环执行的次数,那么在 k
次循环之后,x
的值为:
循环终止条件是:
取对数:
所以:
时间复杂度
k
表示循环的次数,从上面的推导可以看出,k
的值与成正比。
- 因此,这段代码的时间复杂度是:
9. (单选题)
以下算法的时间复杂度是( )
void fun(int n){
int i = 1;
while(i<=n)
i=i*2;
}
- A.
- B.
- C.
- D.
正确答案: D
逐步分析:
初始值:
i = 1
循环条件:
i <= n
循环体:
i = i * 2
10. (单选题)
求整数n的阶乘算法设计如下,请问该程序片段的时间复杂度是( )
int fact(int n){
if(n<=1)return 1;
return n*fact(n-1);
}
- A.
- B.
- C.
- D.
正确答案: B
逐步分析:
初始条件:
- 如果
n <= 1
,返回 1。
- 如果
递归条件:
return n * fact(n - 1)
11. (单选题)
下面程序段的时间复杂度是( )
count=0;
fox(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
- A.
- B.
- C.
- D.
正确答案: D
逐步分析:
外层循环 (
for (k = 1; k <= n; k *= 2)
):- 初始值:
k = 1
- 递增方式:
k
每次翻倍,即k = k * 2
- 终止条件:
k > n
- 每次迭代
k
从 1 开始,每次乘以 2,直到k
超过n
。
- 初始值:
内层循环 (
for (j = 1; j <= n; j++)
):- 初始值:
j = 1
- 递增方式:
j
每次加 1,即j++
- 终止条件:
j > n
- 内层循环运行
n
次。
- 初始值:
12. (单选题)
有以下算法,其时间复杂度是( )
void fun(int n){
int i=0;
while(i*i*i<=n)
i++;
}
- A.
- B.
- C.
- D.
正确答案: B
逐步分析:
初始值:
i = 0
循环条件:
i * i * i <= n
- 只要
i
的立方小于等于n
,循环继续。
循环体:
i++
- 每次循环,
i
增加 1。
13. (单选题)
程序如下:
fox(i=n-1;1>1;i--)
for(j=1;j<1:j++)
if(A[j]>A[j+1])
A[j]与A[j+1]对换;
其中n为正整数,则最后一行的语句频度在最坏情况下是( )
- A.
- B.
- C.
- D.
正确答案: D
逐步分析:
外层循环 (
for (i = n - 1; i > 1; i--)
):- 初始值:
i = n - 1
- 终止条件:
i > 1
- 递减方式:
i--
- 循环次数:从
n - 1
到2
,总共n - 2
次。
- 初始值:
内层循环 (
for (j = 1; j < i; j++)
):- 初始值:
j = 1
- 终止条件:
j < i
- 递增方式:
j++
- 循环次数:
i - 1
次
- 初始值:
14. (单选题)
以下算法中加下画线的语句的执行次数为( )。
int m=0,i
for(i=1;i<=n;i++)
for(j=1:j<=2*1;j++)
m++:
- A. n(n+1)
- B. n
- C. n+1
- D.
正确答案: A:n(n+1);
答案分析:
外部循环
for(i=1;i<=n;i++)
控制着变量i
从1到n
的循环。这意味着它会执行n
次。内部循环
for(j=1;j<=2*i;j++)
控制着变量j
从1到2*i
的循环,其中i
是外部循环的当前值。所以内部循环的上限会随着外部循环的进行而变化。第一次外部循环时,内部循环的上限是2,第二次是4,依次类推,直到n
。这意味着内部循环的执行次数是不同的,它随着外部循环的进行而增加。
那么,我们来计算一下内部循环的总执行次数:
- 第一次外部循环:内部循环执行了 2 次
- 第二次外部循环:内部循环执行了 4 次
- ...
- 第 n 次外部循环:内部循环执行了 2*n 次
所以,内部循环的总执行次数可以表示为 2 + 4 + 6 + ... + 2*n。
这是一个等差数列,可以用求和公式来计算。公式是:
15. (单选题)
下面说法中,错误的是()。
I.算法原地工作的含义是指不需要任何额外的辅助空间
Ⅱ.在相同规模n下,复杂度为O(n)的算法在时间上总是优于复杂度为
的算法
.所谓时间复杂度,是指最坏情况下估算算法执行时间的一个上界
IV.同一个算法,实现语言的级别越高,执行效率越低
- A.I
- B. I,Ⅱ
- C. I,
- D.
正确答案: A
答案分析:
I. 算法原地工作的含义是算法在执行过程中只需要固定的额外空间,也就是说,不管输入数据的规模如何,额外空间的需求都保持不变。这并不意味着不需要任何额外空间,而是指额外空间的大小不随输入数据的规模增长而增长。
II. 复杂度为O(n)的算法和复杂度为的算法不能简单地说哪个总是优于另一个。在小规模数据下,
的算法可能更快,因为常数因子和低阶项可能起主导作用。但在大规模数据下,O(n)的算法通常会更优,因为它的增长速度慢于
III. 时间复杂度是指算法在最坏情况下的运行时间上界。这个定义是正确的,它提供了算法可能需要的最长执行时间的估计。
IV. 同一个算法,实现语言的级别越高,并不一定意味着执行效率越低。高级语言通常提供了更多的抽象,这有助于提高开发效率,但也可能带来性能损失。然而,现代编译器的优化和高级语言的运行时环境的改进,可以缩小或甚至消除这种差距。
综上所述,错误的说法是 A.I,因为原地工作的算法确实需要一些额外空间,只是这个空间的大小不随输入数据的规模增长。其他选项中的说法要么是正确的,要么是在某些情况下可能正确的。