逻辑结构与存储结构
逻辑结构描述数据元素之间的关系(一对一,一对多,多对多...)
1.一种逻辑结构可以用多种物理结构来实现
2.物理结构影响逻辑结构上的各种操作的复杂度。
存储结构描述实际存放数据元素的物理结构。
算法与复杂度:
~算法:做一件事的步骤=>有穷(有确定的几步,比如说做一件事不可能是无穷步的不然的话什么时候也做不完),确定(确定的目标),可行(可以实现)【特性】=>正确(正确的方法),可读(代码可读性高),健壮(简洁),高效(用复杂度衡量)【评价标准】
~(最坏)复杂度:
1.时间复杂度:给定输入规模n,在最坏情况下需要多少时间一定能做完
2.空间复杂度:给定输入规模n,在最坏情况下需要多少额外空间一定能做完
~复杂度是一个保证,一个承诺
1.保证:指的是上限
2.复杂度:用O(数量级)表示,如果计算出的为0.5的n次方或者10的n次方,则可以直接表示为O(n)
*key1:逻辑结构描述的是关系,与数据元素本身特点以及计算机参数等没有关系
1.与数据元素本身的形式,内容,大小个数无关的是数据的(B)
A:存储结构 B:逻辑结构 C:存储实现 D:运算实现
2.从逻辑上数据结构分成(C)
A:动态结构和静态结构 B:紧凑结构和非紧凑结构
C:线性结构和非线性结构 D:内部结构和外部结构
解析:线性指一对一,非线性指一对多
3.下面哪个是非线下数据结构(A)
A:树 B:字符串 C:队列 D:栈
*key2:算法的五个特性:有穷,确定,可行,输入和输出
*key3:算法的四个评价准则:正确性,可读性,健壮性,高效性
1,对一个算法的评价,不包括如下(C)方面的内容
A:正确性和可读性 B:健壮性 C:并行性 D:时间复杂度
分析:给选项形容词前面添加‘不’字,如果可以接受,说明是评价准则,否则是必须满足的特性。
如:‘不健壮’或‘不高效’仍然是能作为一个算法的,只是不够完美,但‘不可行’或者‘不确定’就
无法容忍了,一个算法不可行或无法给出确定结果则不能称之为算法。
*key4:算法复杂度是一个保证,用O(数量级)表示
1.分析下列程序段的时间复杂度:
算法输入:n和m
int ans=0;
for (int i=0;i<n;i+=1){
for(int j =0;j<m;j+=1){
ans+=1}
}
分析:
在给定算法输入n和m的情况下,无论如何该嵌套循环都会执行nm次,因此运行时间的上限,也既时间复杂度是O(mn)
2.分析下列程序段的时间复杂度:
算法输入:大小为n的数组nums,一个数组val
for (int i=0;i<n;i+=1){
if(nums[i]==val){
return i;}
}
分析:
最坏情况下,val位于nums的最后一位,循环内的if判断需要执行n次,因此时间复杂度为O(n).
换句话说,这个算法保证在执行至多n次判断后能结束,这是理解时间复杂度的另一个角度。
3:分析下列程序段的时间复杂度:
算法输入:n
int ans=0
for (int i=0;i<n;i+=1){
for (int j=0;j<i;j*=2){
ans+=1;}
}
分析:
外层循环执行n次,因此外复杂度为O(n),内层循环与i有关,而i与n直接线性相关,因此内层循环的复杂度是O(log2(n)),内外层是嵌套关系,需要将复杂度相乘,得到总的复杂度为O(nlgn),因为log以2,5,10为底不影响,在这里为了简便就以10为底。
4.分析下列算法的时间复杂度:
算法输入:n
int ans=0;
for(int i=1;i<=n;i+=1){
if (i>1000)
break;
ans+=1;}
分析:
无论输入n是多少,循环至多执行1000次,因此时间复杂度为O(1000),也既常数复杂度,不管这个
常数多大,我们都认为其为O(1)。
5.在算法输入规模为n时,算法运行时间正比于9log(3的n次方),则该算法的时间复杂度为_____
分析:
9log(3的n次方)=9nlog(3),对于算法的复杂度分析时,我们不关心常数,只关心和输入规模n有关的数量级,
因此O(9nlog(3))===0(n)