王道数据结构 第1章 绪论(习题精选)

1.1 数据结构基本概念

1.1.3 习题

一、单选

01

可以用()定义一个完整的数据结构。

A. 数据元素        B. 数据对象        C. 数据关系        D. 抽象数据类型

03

以下属于逻辑结构的是()。

A. 顺序表        B. 哈希表        C. 有序表        D. 单链表

二、应用

01

对于两种不同的数据结构,逻辑结构或物理结构一定不相同吗?

02

试举一例,说明对相同的逻辑结构,同一种运算在不同的存储方式下实现时,其运算效率不同。

1.2.3 习题

一、单选

03

若某算法的空间复杂度为O(1),则表示该算法()。

A. 不需要任何辅助空间        B. 所需辅助空间大小与问题规模n无关

C. 不需要任何空间               D. 所需空间大小与问题规模n无关

16

下列程序段的时间复杂度是()。

int sum = 0;
for(int i = 1; i < n; i *= 2)
    for(int j = 0; j < i; ++j)
        sum++;

A. O(logn)        B. O(n)        C. O(nlogn)        D. O(n^2)

1.1.3 习题答案及解析

一、单选

01

✅答案:D. 抽象数据类型

💡解析:

数据结构三要素:逻辑结构、存储结构、数据的运算。

数据结构是相互之间具有一种 或 多种特定关系的数据元素的集合。

A. 数据元素:数据的基本单位

B. 数据对象:具有相同性质的数据元素的集合

C. 数据关系:即结构(数据元素相互之间的关系)

D. 抽象数据类型:一个数学模型 及 定义在该模型上的一组操作

抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而可构成完整的数据结构定义。

03

✅答案:C. 有序表

💡解析:

顺序表、链表属于一般线性表;线性表、有序表是逻辑结构;顺序表,链表是存储结构

A. 顺序表是线性表的顺序存储、D. 单链表是线性表的链式存储

B. 哈希表(散列表)是基于哈希函数将数据映射到索引,使得增、删、查具有平均O(1)复杂度。

哈希表本质上是数组加链表,不属于线性结构。

顺序表、哈希表、单链表是三种不同的数据结构,既描述逻辑结构,又描述存储结构和数据运算。

对于C. 有序表是指关键字有序的线性表,仅说明了数据元素之间的逻辑关系。

二、应用

01

✅答案:

数据结构三要素:逻辑结构、存储结构(物理结构)、数据的运算。

当数据结构不同时,也有可能是数据的运算不同。

例如,对于二叉树 和 二叉排序树,二叉排序树可以采用二叉树的逻辑表示和存储方式,虽然它们均有建立树、查找结点、插入结点、删除结点等操作,但是实际的定义是不同的,二叉树平均复杂度为O(n),而二叉排序树的平均时间复杂度为O(logn)。

二叉排序树讲解

02

✅答案:

例如,线性表可以采用顺序存储和链式存储。

在顺序存储下,线性表插入、删除操作的时间复杂度为O(n);

在链式存储下,线性表插入、删除操作的时间复杂度为O(1)。

1.2.3 习题答案及解析

一、单选

03

✅答案:B. 所需辅助空间大小与问题规模n无关

💡解析:

空间复杂度为算法所需的存储空间,

若输入数据所占的空间只取决于问题本身,与算法无关,则只需分析辅助空间

16

✅答案:B. O(n)

💡解析:

设最外层循环执行了t次,则2^t < n,2^{t+1} \ge n,化简可得n \le 2^{t+1} < 2n

内层循环执行次数x = 2^0 + 2^1 + \dots + 2^t = 2^{t+1}-1,则n - 1 \le x < 2n - 1

那么f(n) = n,即时间复杂度T(n) = O(f(n)) = O(n)。

第一章 归纳总结

☀️时间复杂度

1. 循环中变量参与循环条件的判断

思路:找出基本运算执行次数x与问题规模n的关系,解得x = f(n)f(n)最高幂次为k,则算法时间复杂度为O(n^k)

1.    int i = 1;                              2.    int y = 5;                 
      while(i <= n)                                 while((y+1)*(y+1)<n)
          i = i * 2;                                    y = y + 1;

例1:设基本运算i = i * 2执行次数为t,则2^t \le n,解得t \le \log_2n,则T(n) = O(\log_2n)

例2:设基本运算y = y + 1执行次数为t,则t = y - 5 (此处的y是指最终y的值,由于初始时y=5,所以最终y的值减去5才是基本运算的执行次数)。那么(t+5+1)*(t+5+1) < n

化简可得t < \sqrt {n} - 6,则T(n) = O(\sqrt{n})

2.循环中变量与循环条件无关

思路:数学归纳法 或 直接累计循环次数。(如1.2.3中的16) 

🌷递归:公式递推          T(n) = 1 + T(n - 1) = \dots = n - 1 + T(1),即T(n) = O(n)

🌷非递归:直接累计次数

思维拓展

求解斐波那契数列

有递归、非递归算法。试分别分析两种算法的时间复杂度。

✅答案:(1)递归:O(2^n)        (2)非递归:O(n)

💡解析:

(1)递归

void F(n){
    if(n <= 1) return n;
    return F(n - 1) + F(n - 2);
}

从上述递归形式不难发现,每次会形成两个分支,最终形成递归二叉树,则时间复杂度约为O(2^n)

实际上时间复杂度为O(\frac{1}{\sqrt{5}} \left( \left ( \frac{1+\sqrt{5}}{2} \right ) ^ n - \left ( \frac{1-\sqrt{5}}{2} \right ) ^ n \right ))。【斐波那契数列通项公式】

详解请看下面链接:

斐波那契数列的通项公式 - 知乎 (zhihu.com)

递归求解斐波那契数列的时间复杂度——几种简洁证明 - 知乎 (zhihu.com)

递归求Fibonacci数列的时间复杂度到底是多少? - 掘金 (juejin.cn)

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值