数据结构扫盲

本文深入探讨算法设计的基本原则,如正确性、可读性和效率,同时详细讲解数据结构的关键概念,包括二叉线索树、堆、折半查找及二叉树的性质。解析不同算法的时间复杂度和空间需求,以及数据逻辑结构与元素形式的独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.算法的特性:有穷性,确定性,可行性,输入(>=0),输出(>=1)

设计算法时,通常应考虑达到以下目标:1、正确性 2、可读性 3、健壮性 4、高效率与低存储量需求

2.二叉线索树每个节点都有指向前驱和后继的指针(错)

【解析】有的指向左右孩子

3.对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找成功,它们的平均查找长度是相同的,而对于查找失败,它们的平均查找长度是不同的(对)

【解析】

查找失败的情况下,无序表查找需要更长。
用公式来说话吧:假设有n个元素,无序表查找失败的平均长度为n(因为肯定要找到末尾,这个没异议吧);而对于有序表,查找的过程中可以中途停止查找(比如1 2 3  5 6,查找4,所以找到5就可以判定查找失败了),所以有序表顺序查找,失败的情况共有n种情况,分别在查找到第1个位置,第2个位置...第n个位置时判定查找失败,所以总的平均查找长度为(1+2+...+n)/ n = (n+1)/2。所以只要n不等于1,有序表顺序查找失败的平均长度(n+1)/2必小于无序表的n。

4.度量一个程序执行的时间通常有两个方法:事前分析估计,事后统计

5.深度优先遍历和拓扑排序可以判断出一个有向图是否有环(回路)

6.数据的逻辑结构与数据元素本身的内容和形式无关(对)

7.堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)要么是最大化堆,要么是最小化堆

8.用邻接表存储图,深搜,广搜,拓扑时间复杂度都是O(n+e)。

9.稀疏矩阵的压缩存储方法: 一 、三元组顺序表 二、行逻辑联接的顺序表 三、 十字链表

10.折半查找的条件:顺序存储的有序表

11.A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()备注:数组下表从0开始。

A.i(i+1)/2+j     B.j(j+1)/2+i(√)     C.i(j+i)/2+1     D.j(i+1)/2+1

12.若用一个大小为7的数组来实现循环队列,且当前rearfront的值分别为02,当从队列中删除一个元素,再加入两个元素后,rearfront的值分别为多少?(   ) 

A. 1 5         B. 24          C. 23         D32  

13.普里姆算法的时间复杂度为O(n^2, 它对稠密较为适合。

克鲁斯卡尔算法的时间复杂度为 O(eloge)   , 它对 稀疏较为适合。

14.对于一棵具有n个结点的二叉树,用二叉链表存储时,其指针总数为2n个,其中n-1个用于指向孩子,n+1个指针是空闲的。

15.二叉树是指度为2的有序树。一棵结点数为n的二叉树,其所有结点的度的总和是n-1

结点的度:结点子树的个数

16.对n个记录的表r[1..n]进行直接插入排序,设关键字逆有序,则所需的关键字间的比较次数为    n(n-1)/2

【解析】插入到 有序列的时候,是从最后开始比较!

void InsertSort(int r[ ],int n)
{
	int i,j;
	int x;
	for(i=1;i<n;i++)
	{
		 x=r[i];
		for(j=i-1;j>=0;j--)
			if(r[j]>x) 
				r[j+1]=r[j];
			else break;
		 r[j+1]=x;
	}
}

17.算法分析的目的是(   )。

A. 找出数据结构的合理性;
B. 分析算法的效率;
C. 研究算法中输入和输出关系;
D. 分析算法的易理解性;

答案解析

算法分析是指对一个算法的运行时间和占用空间做定量的分析,计算相应的数量级。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。

 

18.采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是(D)

A.递归次数与初始数据的排列次序无关

B.每次划分后,先处理较长的分区可以减少递归次数

C.每次划分后,先处理较短的分区可以减少递归次数

D.递归次数与每次划分后得到的分区处理顺序无关


【解析】定义一个全局变量,在递归函数里+1,这样递归的次数就放到全局变量里了,只要是给定了一个顺序表和当前分出的前后两个区域,那么当下无论是先长还是先短,递归次数是不变的。

但是对于一个顺序表来说,初始数据的排列是对递归次数有影响的。比如:一个递增的表和一个杂乱的表,都是选第一个数据作为支点,那么在函数里

qsort( int [])

{

给支点找位置;

qsort(左边);

qsort(右边);

}

这两种情况下,递增的表会出现左侧qsort()不用递归的情况,右边一直递归,二叉树就会退化为单链表,会达到O(N);杂乱的表可能会左右比较“相当”的递归,如果轴点恰好平分两个待排序部分,会达到O(logN)

 

19.n个节点按照不同的顺序插入到二叉排序树中,可以得到n!个不同的二叉排序树,在检索一个关键码时候,比较次数最小的树叫做最佳二叉排序树,但是最佳二叉排序树构造代价大,并且很难动态的保持。所以现实中不怎么使用“最佳”,更多的使用“较佳”的平衡二叉树。

最佳二叉排序树的特点是除了最下一层不满外,其他都是充满的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值