一,逻辑结构描述的是关系,与数据元素本身特点及计算机参数等没有关系。
与数据元素本身的形式,内容,大小个数等无关的是数据的(B)
A.存储结构 B.逻辑结构 C.储存实现 D.运算实现
从逻辑上可以把数据结构分成(线性结构与非线性结构)
下面那个是非线性数据结构的(A)
A.树 B.字符串 C.队列 D.栈
二,算法的五个特性:
有穷,确定,可行,输入和输出.
三,算法的四个评测准则:
正确性,可读性,健硕性,高效性(用时间复杂度来判断)
二三分析:给选项形容词前添加“不”字,如果可以接受,说明是评价准则,否则是必须满足的特性。如“不健壮”或“不高效”仍然是能作为一个算法的,只是变得不够完美。但是“不可行”或“不确定”就无法容忍了,一个算法不可行或者无法给出确定的结果就不能称之为算法。
四,算法复杂度是一个保证,在给定输入规模的情况下,用O(数量级)表示。
- 分析下列算法(程序段)的时间复杂度:(代码理解什么是时间复杂度)
//算法输入:n和mintans=0; for(inti=0; i<n; i+=1) { for(intj=0; j<m; j+=1) { ans+=1; } }
在给定算法输入n和m的情况下,该嵌套循环内的语句将至多执行nm次,因此运行时间的上限,也及是时间复杂度是O(mn)。
//算法输入:大小为n的数组nums,一个整数valfor (inti=0; i<n; i+=1){ if(nums[i] ==val){ returni; } }
最坏的情况下,val位于nums的最后一位,循环内的if判断需要执行n次,因此时间复杂度为O(n)
,换句话说,这个算法保证在执行至多n次判断后就能结束.
- 分析下列算法时间复杂度:(规定执行次数怎么办?)
//算法输入:nfor (inti=0; i<n; i+=1){ if(i>1000) break; ans+=i; }
无论输入n是多少,都循环至多执行1000次,因此时间复杂度为0(1000),也即常数复杂度不管这个常数多大,我们都认为他是0(1).
//算法输入:nintans=0; for (inti=1; i<=n; i+=1){ for (intj=1; j<n; j*=2){ ans+=i; } }
内层循环(j)次数和n呈对数关系 →因此内层复杂度为0(log(n)).
外层循环(i)次数和n呈线性关系 →即执行n次0(log(n))的内层循环,得到0(n*log(n)).
- 分析下列算法时间复杂度:(内层循环的上限在变动)
//算法输入:nintans=0; for (inti=1; i<=n; i+=1){ for (intj=1; j<i; j+=1){ ans+=i; } }
对i为0,1,2,......,n-1时,内层循环次数为:0,1,2,3,......,n-1求和得到的表达式中,最高阶的项是n²,因此整个表达式数量级是n²,即最终答案为O(n²)(内层循环的上限在变动)。
五.算法复杂度描述的是算法执行时间的增加和输入规模的增加呈何种关系。
- 在算法输入规模为n时,算法运行时间正比与9log(3的n次方),则该算法的时间复杂度为O(n).
- 9log(3的n次方) = 9nlog(3),对于算法的复杂度分析时,我们不关心常数和低阶项,只关心和输入规模n有关的数量级,因此0(9n*log(3)) → O(n)。
2.O(3n)是O(n)的三倍.
3.算法时间复杂度定义:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。
4.随着n的增加,算法执行的的语句次数将增加!!!