数据结构概论(应用题)

1. 数据存储结构包括哪⼏种类型?数据逻辑结构包括哪⼏种类
型?

数据存储结构通常指的是数据在计算机中存储的方式,主要可以分为以下几种类型:

  1. 顺序存储结构:数据元素存放在连续的存储单元中,如数组。
  2. 链式存储结构:数据元素存放在任意的存储单元中,并通过指针连接,如链表。
  3. 索引存储结构:通过索引表来访问数据,如索引文件。
  4. 散列存储结构:通过散列函数将数据映射到一个数组中,如哈希表。
  5. 树形存储结构:数据元素按照树形结构进行存储,如二叉树、B树等。

数据逻辑结构则是指数据元素之间的逻辑关系,不涉及数据的存储方式,主要包括以下几种类型:

  1. 线性结构:数据元素之间存在一对一的关系,如数组、链表、栈、队列等。
  2. 树形结构:数据元素之间存在一对多的关系,如树、二叉树、B树等。
  3. 图形结构:数据元素之间存在多对多的关系,如图。
  4. 集合结构:数据元素之间没有直接的逻辑关系,如集合。

数据存储结构和数据逻辑结构是密切相关的,存储结构决定了数据在内存中的物理布局,而逻辑结构则定义了数据元素之间的逻辑关系和操作。在实际应用中,选择合适的存储结构和逻辑结构对于提高程序的效率和性能至关重要。

2.数据结构是⼀门研究什么内容的学科?
数据结构是一门研究在非数值计算的程序设计问题中,计算机的操作对象及对象间的关系和施加与对象的操作等的学科。

3. 数据元素之间的关系在计算机中有⼏种表⽰⽅法?各有什么特
点?

顺序存储方式: 数据元素顺序存放,每个存储节点只含一个元素。存储位置放映数据元素间的关系。存储密度大,但有些操作效率较差。(如插入,删除);
链式存储方式: 链式存储⽅式。每个存储结点除包含数据元素信息外还包含⼀组(⾄少⼀个)指针。指针反映数据元素间的逻辑关系。这种⽅式不要求存储空间连续,便于动态操作(如插⼊、删除等),但存储空间开销⼤(⽤于指针),另外不能折半查找等。
**索引存储方式:**除数据元素存储在⼀地址连续的存储空间外,尚需建⽴⼀个索引表,索引表的索引项指⽰存储结点的存储位置(下标)或存储区间端点(下标,⾮稠密索引),兼有静态和动态特性。
**散列存储方式:**利⽤散列函数和解决冲突的⽅法,将关键字散列在连续的有限地址空间内,并将散列函数的值解释成关键字所在元素的存储地址。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。
4. 数据类型和抽象数据类型是如何定义的?⼆者有何相同和不同
之处,抽象数据类型的主要特点是什么?使⽤抽象数据类型的主要好
处是什么?

“数据类型”是程序设计语⾔中的⼀个概念,它是⼀个值的集合和操作的集合。如C语⾔中的整型、实型、字符型等。整型值的范围(对具体机器都应有整数范围),其操作有加、减、乘、除、求余等。实际上数据类型是⼚家提供给⽤户的已实现了的数据结构。
“抽象数据类型”(ADT)指⼀个数学模型及定义在该模型上的⼀组操作。“抽象”的意义在于数据类型的数学抽象特性。抽象数据类型的定义仅取决于它的逻辑特性,⽽与其在计算机内部如何表⽰和实现⽆关。⽆论其内部结构如何变化,只要它的数学特性不变就不影响它的外部使⽤。抽象数据类型和数据类型实质上是⼀个概念,但是抽象数据类型的范围更⼴,它已不再局限于机器已定义和实现的数据类型,还包括⽤户在设计软件系统时⾃⾏定义的数据类型。使⽤抽象数据类型定义的软件模块含定义、表⽰和实现三部分,封装在⼀起,对⽤户透明(提供接⼝),⽽不必了解实现细节。抽象数据类型的出现使程序设计不再是“艺术”,⽽是向“科学”迈进了⼀步。
5.(1)在数据结构课程中,数据的逻辑结构、数据的存储结构及数
据的运算之间存在着怎样的关系?

数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联⽅式或“邻接关系”),数据的存储结构是数据结构在计算机中的表⽰,包括数据元素的表⽰及其关系的表⽰。数据的运算是对数据定义的⼀组操作,运算是定义在逻辑结构上的,和存储结构⽆关,⽽运算的实现则依赖于存储结构。

(2)若逻辑结构相同但存储结构不同,则为不同的数据结构。这
样的说法对吗?举例说明之。

逻辑结构相同但存储结构不同,可以是不同的数据结构。例如,线性表的逻辑结构属于线性结构,采⽤顺序存储结构称为顺序表,⽽采⽤链式存储结构称为线性链表。

(3)在给定的逻辑结构及其存储表⽰上可以定义不同的运算集
合,从⽽得到不同的数据结构。这样的说法对吗?举例说明之。

栈和队列的逻辑结构相同,其存储表⽰也可相同(顺序存储和链式存储),但由于其运算集合不同⽽成为不同的数据结构。

(4)评价各种不同数据结构的标准是什么?
数据结构的评价⾮常复杂,可以考虑两个⽅⾯:⼀是所选数据结构是否准确、完整地刻画了问题的基本特征;⼆是是否容易实现(如对数据分解是否恰当;逻辑结构的选择是否适合于运算的功能,是否有利于运算的实现;基本运算的选择是否恰当)。

6. 评价⼀个好的算法,你是从哪⼏⽅⾯来考虑的?
评价好的算法有四个⽅⾯。⼀是算法的正确性;⼆是算法的易读性;三是算法的健壮性;四是算法的时空效率。

7. 解释和⽐较以下各组概念。
(1)算法的时间复杂性: 算法的时间复杂性是算法输⼊规模的函数。算法的输⼊
规模或问题的规模是作为该算法输⼊的数据所含数据元素的数⽬,或
与此数⽬有关的其他参数。有时考虑算法在最坏情况下的时间复杂度
或平均时间复杂度。
(2)算法: 算法是对特定问题求解步骤的描述,是指令的有限序列,其
中每⼀条指令表⽰⼀个或多个操作。算法具有五个重要特性:有穷
性、确定性、可⾏性、输⼊和输出。
(3)频度: 在分析算法的时间复杂度时,有时需要估算基本操作的原操
作,它是执⾏次数最多的⼀个操作,该操作重复执⾏的次数称为频
度。

8. 根据数据元素之间的逻辑关系,⼀般有哪⼏类基本的数据结
构?

集合、线性结构、树形结构、图形或⽹状结构。

9. 对于⼀个数据结构,⼀般包括哪三个⽅⾯的讨论?
逻辑结构、存储结构、操作(运算)。

10. 当你为解决某⼀问题⽽选择数据结构时,应从哪些⽅⾯考
虑?

通常考虑算法运⾏所需要的存储空间量和时间量。后者⼜涉及四⽅⾯:
程序运⾏时所需输⼊的数据总量,
对源程序进⾏编译所需时间,
计算机执⾏每条指令所需时间,
程序中指令重复执⾏的次数。

11. 若将数据结构定义为⼀个⼆元组(D,R),说明符号D和R应
分别表⽰什么。

D是数据对象,是数据元素的有限集合,R是D上数据元素之
间关系的有限集合。

12. 数据结构与数据类型有什么区别?
“数据结构”这⼀术语有两种含义:⼀是作为⼀门课程的名
称;⼆是作为⼀个科学的概念。作为科学概念,⽬前尚⽆公认定义,
⼀般认为,讨论数据结构要包括三个⽅⾯:⼀是数据的逻辑结构,⼆
是数据的存储结构,三是对数据进⾏的操作(运算)。⽽数据类型是
值的集合和操作的集合,可以看作已实现了的数据结构,后者是前者
的⼀种简化情况。

13. 算法的五个重要特征是什么?
算法的五个重要特征是有穷性、确定性、可⾏性、零⾄多个
输⼊和⼀⾄多个输出。

16.运算是数据结构的⼀个重要⽅⾯。试举⼀例,说明两个数据
结构的逻辑结构和存储⽅式完全相同,只是对于运算的定义不同。因
⽽两个结构具有显著不同的特性,是两个不同的结构。

栈和队列的逻辑结构相同,其存储表⽰也可相同(顺序存储和链式存储),
但由于其运算集合不同⽽成为不同的数据结构。

17. 在编制管理通讯录的程序时,什么样的数据结构合适?为什
么?

应从两⽅⾯进⾏讨论:如通讯录较少变动(如城市私⼈电话
号码),主要⽤于查询,利⽤顺序存储较⽅便,既能顺序查找也可随
机查找;若通讯录经常有增删操作,则⽤链式存储结构较为合适,将
每个⼈的情况作为⼀个元素(即⼀个结点存放⼀个⼈),设姓名作关
键字,链表安排成有序表,这样可提⾼查询速度。

18. 试举⼀例,说明对相同的逻辑结构,同⼀种运算在不同的存
储⽅式下实现,其运算效率不同?

线性表中的插⼊、删除操作,在顺序存储⽅式下平均移动近
⼀半的元素,时间复杂度为O(n);⽽在链式存储⽅式下,插⼊和删
除的时间复杂度都是O(1)。

19. 有实现同⼀功能的两个算法A1和A2,其中A1的时间复杂度为
T1=O(2n),A2的时间复杂度为T2=O(n2),仅就时间复杂度⽽⾔,请
具体分析这两个算法哪⼀个好?

对算法A1和A2的时间复杂度T1和T2取对数,得nlog2和
2logn。显然,当n<4时,算法A1好于A2;当n=4时,两个算法的时
间复杂度相同;当n>4时,算法A2好于A1。

23. 请简要列出影响⼀个算法(或程序)时间效率的主要因素,
并指出其中与算法(或程序)本⾝直接有关的因素。

事先估算算法的运⾏时间主要考虑问题的“规模”和算法执⾏
的“基本操作”的次数。问题的“规模”指待解决问题的数量,如查找中
元素的个数,元素个数越多,查找需要的时间越⻓,这是影响算法运
⾏时间的主要因素。“基本操作”是算法在解决某问题时的主要操作,
如在查找运算中元素间的⽐较操作可以看作基本操作,执⾏基本操作
的次数越少,运⾏时间越短,执⾏基本操作的次数越多,运⾏时间就
越⻓。

算法设计
1. 编写完整程序解决中国古代数学家张丘健在他的《算经》中提
出的“百钱百鸡问题”:鸡翁⼀,值钱五;鸡⺟⼀,值钱三;鸡雏三,
值钱⼀;百钱买百鸡,翁、⺟、雏各⼏何?

两种解法

设i、j和k分别代表鸡翁、鸡⺟和鸡雏
	for(i=0;i<=100;i++) 
		for(j=0;j<=100;j++)
		  for(k=0;k<=100;k++)
			if(i+j+k==100 && 5*i+3*j+1/3*k==100)
				cout<<"翁="<<i<<"⺟="<<j<<"雏="<<(100-i-j)<<endl;
设i、j分别代表鸡翁、鸡⺟最大的数。
for(i=0;i<15;i++)
	 for(j=0;j<33-i;j++) 
		 if(5*i+3*j+1/3*(100-i-j)==100)
			cout<<"翁= "<< i<<"⺟="<<j<<"雏="<<(100-i-j)<<endl;
第二种方法会比第一种快很多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值