一.单项选择
1.在数据结构中,从逻辑上可以把数据结构分为线性结构和非线性结构。
线性结构包括表,栈,队列,数组,串和广义表,非线性结构包括树,图
广义表:9. 广义表 - 广义表概念,存储结构,深度/长度,复制算法_~QwQ~的博客-CSDN博客
2,与数据元素本身的形式,内容,相对位置,个数无关的是 逻辑结构
存储结构:顺序存储结构和链式存储结构(逻辑与位置)
存储实现:1.2 存储实现 - 知乎 (zhihu.com)(方便观看在这里也写了一下)
存储实现的基本目标是建立数据的机内表示,包括两部分:
1. 数据元素的存储
2. 数据元素之间的关系的存储
有时为了方便运算实现,还可能会增加一些辅助信息的存储。
数据的机内表示称为数据的物理结构
数据物理结构的组成
1. 存储结点,每个存储结点存放一个数据元素
2. 数据元素之间关系的存储,即:逻辑结构的机内表示
3. 附加信息,便于运算实现而设置的一些"哑结点"(链表中的头结点)
4. 物理结构主要讨论的是数据元素之间关系的表示,由于每个数据元素被表示为一个存储结点,所以逻辑结构就由存储结点之间的关联方式间接地表示。
存储结点间的关联的4种实现方式
1. 顺序实现:所有的存储结点存放在一块连续的存储区域中,结点之间的逻辑关系可以通过结点的存储位置来实现。即可以通过结点的存储位置找出与它由关系的结点的存储位置。在高级语言中,一块连续的存储空间通常可用一个数组来表示。因此,顺序实现通常用一个数据元素类型的数组来存储。
2. 链接实现:存储结点可以分散地存放在存储器的不同位置,结点之间的关系通过一个指针显式地指出。因此,在链接存储中,每个存储结点包含两部分:数据元素部分和指针部分,数据元素部分保存数据元素的值,指针部分保存一组指针,每个指针指向一个与本结点有关系的结点
3. 散列存储方式:也称哈希存储,是专用于集合结构的数据存放方式。在哈希存储中,各个结点均匀分布在一块连续的存储区域中,用一个哈希函数将数据元素和存储位置关联起来。
4. 索引存储方式所有的存储结点按照生成的次序连续存放,另外设置一个索引区域表示结点之间的关系。
逻辑结构:是数据元素间逻辑关系的描述,与数据的存储无关,是独立于计算机的。通常有四种基本结构:集合结构,线性结构,树形结构和图结构。
运算实现是程序员完成运算的实现算法,是具体的,是基于存储结构的。
3.通常要求同一逻辑结构中的所有数据元素具有相同的特征,这意味着 不仅数据元素所包含的数据项个数要相同,而且对应数据项的类型要一致。
4.数据元素是组成数据的基本单位。
数据项是组成数据元素的,有独立含义的,不可分割的最小单元。
数据结构是相互间存在一种或多种特定关系的数据元素的集合
5.算法的时间复杂度取决于:问题的规模 待处理数据的初态
9.顺序存储结构中数据结构之间的逻辑关系是由存储关系表示的
10.链式存储结构中的数据元素之间的逻辑关系是由指针表示的
11.与数据的存储关系有关的术语是链表
12.抽象数据类型的三个组成部分别为:数据对象,数据关系,基本操作
13.算法是解决问题的有限运算序列
14.设n是描述问题规模的非负整数,下面程序段的时间复杂度
O(lb n)
x=2;
while(x<n/2)
x=2*x;//基本语句。
//2*x=n,x=logn
O(n)
int fact(int n)
{
if(n<=1)return 1;
return n*fact(n-1);//基本语句
}//n!
O(n lb n)
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;//基本语句
//循环嵌套,时间复杂度由深层内循环的基本语句频度决定
第一个for循环O(lb n)
第二个for循环O(n)
相乘
O(n*1/2)
int func(int n)
{
int i=0,sum=0;
while(sum<n)sun+=++i;//先++i,再sum=sum+i 基本语句
return i;
}
//第一次 i=1 sum=1
2 2 1+2
3 3 1+2+3
m m 1+2+3+4....+m=n
由公式m^(1+m)/2=n,2n=m+m^2,忽略常数,加m对结果影响不大
得到m=根号n
二.应用题
4,分析下面个段程序的时间复杂度
x=90; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;//基本语句,分析程序,执行次数为常数阶
//O(1)
for (i=0; i<n; i++)
for (j=0; j<m; j++)
a[i][j]=0;//基本语句
第一个for循环O(n)
第二个for循环O(m)
整个程序时间复杂度O(nm)
s=0;
for i=0; i<n; i++)
for(j=0; j<n; j++)
s+=B[i][j];//基本语句
sum=s;
第一个for循环O(n)
第二个for循环O(n)
整个程序时间复杂度O(n*2)
i=1;
while(i<=n)
i=i*3;//基本语句
i*3=n,由对数运算得运算次数i=log3n
时间复杂度 O(log3n) 3为底
总结:计算时间复杂度先找到运行次数最多的语句,基本语句,根据基本语句运算出次数和n之间关系,结果为时间复杂度括号内内容。