logo资料库

北邮数据结构课后答案.pdf

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
《数据结构与 STL》 教师手册 ver 0.1 肖波 徐雅静 莫骁 肖晶 2010 年 9 月
目录 习题 1........................................................................................................................................3 习题 2........................................................................................................................................7 习题 3......................................................................................................................................12 习题 4......................................................................................................................................16 习题 5......................................................................................................................................19 习题 6......................................................................................................................................26 习题 7......................................................................................................................................29 习题 8......................................................................................................................................32
习题 1 1. 填空题 (1)(___________)是指数据之间的相互关系,即数据的组织形式。通常人们认为它包含 三个方面的内容,分别为数据的(___________)、(___________)及其运算。 答案:数据结构 逻辑结构 存储结构 (2)(___________)是数据的基本单位,在计算机程序中通常作为一个整体进行处理。 答案:数据元素 (3)数据元素之间的不同逻辑关系代表不同的逻辑结构,常见的逻辑结构有(___________)、 (___________)、(___________)和(___________)。 答案:集合 线形结构 树结构 图结构 (4)数据的存储结构考虑的是如何在计算机中存储各个数据元素,并且同时兼顾数据元素 间的逻辑关系。基本的存储结构通常有两大类:(___________)和(___________)。 答案:顺序存储结构 链式存储结构 (5)通常一个问题可以有多种不同的算法,但每个算法必须满足 5 个准则:输入、输出、 (___________)、(___________)和(___________)。 答案:有穷性 确定性 可行性 (6)通常通过衡量算法的(___________)复杂度和(___________)复杂度来判定一个算 法的好坏。 答案:时间 空间 (7)常见时间复杂性的量级有:常数阶 O(___________)、对数阶 O(___________)、线 性阶 O(___________)、线性对数阶 O(___________)、平方阶 O(___________)、和指数 阶 O(___________)。通常认为,当问题规模较大时,具有(___________)量级的算法是 不可计算的。 答案:1 logn n nlogn n2 2n 指数 (8)STL 提供的标准容器有顺序容器、(___________)和(___________)。 答案:排序容器 哈希容器 (9)算法可认为是 STL 的精髓,所有算法都是采用(___________)的形式提供的。 答案:函数模版 (10)通常认为 STL 由空间管理器、迭代器、泛函、适配器、(___________)和(___________) 等六部分构成,其中前面四部分服务于后面两部分。 答案:容器 算法 2. 选择题 (1)以下结构中,( )属于线性结构。 A. 树 (2)算法描述的方法有很多种,常常将( )称为算法语言。 A. 自然语言 (3)现实生活中的家族谱,可认为是一种( )结构。 A. 树 (4)手机中存储的电话号码簿,可认为是一种( )结构。 A. 树 D. 程序设计语言 D. 线性表 D. 线性表 C. 伪代码 B. 流程图 C. 集合 C. 集合 D. 集合 C. 串 B. 图 B. 图 B. 图
B. 非确定性多项式时间问题 D. 与 P 问题不相交的 (5)NP 问题是( )。 A. 非多项式时间问题,即非 P 问题 C. P 问题的子集 (6)以下( )不属于 STL 的顺序容器。 A. 向量(vector) (7)下面带有@标记的语句的频度(n>10)是( )。 @cout<
答案: (1) O(n2) (2) O(n) (3) O(logn) (4) O(n) (5) O(1) (6) O(1) (7) O(n1/3) (8) O(n) 4. 将整数设计为一个类,将整数相关的常见数学运算设计为类的接口并进行实现,如求与 给定值的最大公约数、最小公倍数、枚举所有因子等。 解: #include "math.h" #include "vector" using std::vector; //定义自然数类 class NaturalNumber{ public: NaturalNumber(unsigned long int n=0):num(n){} unsigned long int GreatestCommonDivisor(NaturalNumber & nn);//求解最大公约数 unsigned long int LeaseCommonMultiple(NaturalNumber & nn);//求解最小公约数 int GetFactors(vector & factors); //求所有因子,存储在factors 中,函数返回因子个数 unsigned long int GetNumber(){return num;} //……其它外部接口 private: unsigned long int EUCLID(NaturalNumber & n); //欧几里德算法求解最大公约数 unsigned long int num; //存储真正的自然数 }; //返回欧几里德算法求解最大公约数 unsigned long int NaturalNumber :: EUCLID(NaturalNumber & nn) { } unsigned long int m = (num > nn.num) ? num : nn.num; //较大的自然数赋值给m unsigned long int n = (num < nn.num) ? num : nn.num; //较小的自然数赋值给n unsigned long int r = m % n; while (r != 0){ m = n; n = r; r = m % n; } return n; //返回最大公约数 unsigned long int NaturalNumber :: GreatestCommonDivisor(NaturalNumber & nn) 5
{ } return EUCLID(nn); //返回最小公倍数 unsigned long int NaturalNumber :: LeaseCommonMultiple(NaturalNumber & nn) { } unsigned long int temp = EUCLID(nn); return num * nn.GetNumber() / temp; int NaturalNumber :: GetFactors( vector & factors ) { int t=0; int m = sqrt((double)num); vector bigfactors; for (unsigned long int i=1;i ::iterator it=bigfactors.end(); if (bigfactors.size()) do { it--; factors.push_back(*it); }while (it!=bigfactors.begin()); return t; } void main() NaturalNumber p(1); int xx = p.GreatestCommonDivisor(NaturalNumber(120)); int yy = p.LeaseCommonMultiple(NaturalNumber(120)); vector f; int t = p.GetFactors(f); { } 6
习题 2 1. 填空题 (1)在一个单链表中,已知每个结点包含 data 和 next 两个域,q 所指结点是 p 所指结点的 直接前驱,若在 q 和 p 之间插入 s 所指结点,则执行(___________)和(___________)操 作。 答案:q->next = s; s->next = p; 或 s->next=q->next; q->next = s; (2)表长为 n 的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元 素所需移动元素的平均个数为(___________),删除一个元素需要移动元素的平均个数为 (___________)。 答案:n/2 (n-1)/2 (3)表长为 0 的线性表称为(___________)。 答案:空表 (4 ) 动 态 内 存 管 理 是 操 作 系 统 的 基 本 功 能 之 一 , 其 作 用 是 响 应 用 户 程 序 对 内 存 的 (___________)和(___________)请求。 答案:申请 释放 (5)顺序表多采用(___________)实现的,是一种随机存取结构,对表中任意结点存取操 作的时间复杂度为(___________)。而查找链表中的结节,需要从头指针起顺着链扫描才 能得到,平均时间复杂度为(___________)。因此,若线性表的操作主要是进行查找,很 少进行插入或删除操作时,采用(___________)表比较合适。 答案:数组 O(1) O(n) 顺序 (6)在链表某个位置上进行插入和删除操作,只需要修改(___________)即可,而无须移 动大量元素,操作的时间复杂度为(___________)。而在顺序表中进行插入和删除操作, 往往要移动 大量元素, 平均移动元 素的数目为 (___________),平均时间复杂度 为 (___________)。因此,若对线性表进行频繁的插入和删除操作时,采用(___________) 表相对合适。若插入和删除主要发生在表头和表尾,则采用(___________)表更为合适。 答案:指针 O(1) 表长的一半 O(n) 链 循环链 (7)静态链表一般采用(___________)存储的链表结构。 答案:数组 (8)对于 32 位计算机环境,若单链表中的数据类型为整性,则其存储密度为(___________), 而若为双链表,则存储密度为(___________)。若采用顺序表存储数据,则其存储密度为 (___________)。 答案:50% 33% 1 (9 ) 向 量 是 最 常 用 的 容 器 , STL 中 向 量 使 用 (___________ ) 实 现 , 因 此 向 量 具 有 (___________)表的所有特点,可以快速随机存取任意元素。 答案:数组 顺序 (10)操作系统在运行之初,有一块很大的连续内存块供用户程序申请,通常称之为内存池 或(___________)。 答案:堆 (11)循环链表与单链表的区别仅仅在于其尾结点的链域值不是(___________),而是一个 指向(___________)的指针。 答案:NULL(或空指针) 头结点 2. 选择题 7
D. 动态 B. 双向 B. list 单链表 D. vector 单链表 B. 顺序表 链表 D. 静态链表 动态链表 B. 顺序存取 随机存取 D. 索引存取 散列存取 (1)线性表的顺序存储结构是一种( )的存储结构,线性表的链式存储结构是一 种( )的存储结构。 A. 随机存取 索引存取 C. 随机存取 顺序存取 (2)在双向链表 p 所指结点之前插入 s 所指结点的操作是( )。 A. p->left=s; s->right=p; p->left->right =s; s->left=p->left; B. p->right=s; p->right->left=s; s->left=p; s->right=p->right; C. s->right=p; s->left=p->left; p->left=s; p->left->right =s; D. s->right=p; s->left=p->left; p->left->right =s; p->left=s; (3)若链表是利用 C++指针来存储结点的地址,结点空间的分配和收回都是由操作符 new 和 delete 动态执行的,则称该链表为( )链表 A. 单向 C. 静态 (4)将线性表存储到计算机中可以采用多种不同的方法,按顺序存储方法存储的线性表称为 ( ),按链式存储方法存储的线性表称为( )。 A. 数组 单链表 C. 向量 静态链表 (5)( )是 STL 中线性表的链式存储形式,STL 标准库中一般采用( ) 实现。 A. vector 数组 C. list 双向循环链表 (6)顺序表的类型定义可经编译转换为机器级。假定每个结点变量占用 k(k>=1)个字节,b 是顺序表的第一个存储结点的第一个单元的内存地址,那么,第 i 个结点 ai 的存储地址为 ( )。 A. b+ki (7)在循环链表中,若不使用头指针而改设为尾指针(rear),则头结点和尾结点的存储位 置分别是( )。 A. real 和 rear->next->next C. rear->next->next 和 rear (8)有时为了叙述方便,可以对一些概念进行简称,以下说法错误的是( )。 A. 将“指针型变量”简称为“指针” B. 将“头指针变量”简称为“头指针” C. 将“修改某指针型变量的值” 简称为“修改某指针” D. 将“p 中指针所指结点” 简称为“P 值” (9)以下说法错误的是( )。 A. 对循环链表来说,从表中任一结点出发都能通过向前或向后操作而扫描整个循环链表。 B. 对单链表来说,只有从头结点开始才能扫描表中全部结点。 C. 双链表的特点是找结点的前趋和后继都很容易。 D. 对双链表来说,结点*P 的存储位置既存放在其前趋结点的后继指针域中,也存放在它的 后继结点的前趋指针域中。 (10)以下说法正确的是( )。 A. 顺序存储方式的优点是存储密度大、且插入、删除运算效率高。 B. 链表的每个结点中都恰好包含一个指针。 C. 线性表的顺序存储结构优于链式存储结构。 D. 顺序存储结构属于静态结构,链式结构属于动态结构。 B. rear->next 和 rear D. rear 和 rear->next C. b+k(i+1) B. b+k(i-1) D. b-1+ki 8
分享到:
收藏