一些非数值计算问题的数学模型不再是数学方程,而更多的是表、树、图之类的数据结构。
一般来说,算法 + 数据结构 = 程序。
一些基本概念:
数据(Data):在计算机科学中指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素(Data element):是数据的基本单位,通常作为一个整体进行考虑。
数据项(Data item):是数据的不可分割的最小单位。
数据对象(Data object):性质相同的数据元素的集合,是数据的一个子集。
数据结构(Data structure)-数据元素之间的相互关系。
算法
算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
算法的五个特性*:
有穷性(有穷步骤后一定能结束)
确定性(输入相同/状态相同,所得结果需相同)
可行性(每步能通过已实现的基本运算有限次运行实现)
可输入
有输出(1个 || 多个)
描述算法可以用多种不同的表示方法:自然语言表示法、流程图、N-S图、伪代码、计算机语言。
算法的效率
->时间效率 & 空间效率。
算法时间复杂度:运算时所消耗的时间。
算法空间复杂度:实现所占的空间大小。
一般关注
-T.worst(n)最坏情况复杂度*
-T.avg(n)平均复杂度
T.avg(n)<=T.worst(n)
若存在两段算法,其复杂度分别为T1(n)=o(f1(n))和T2(n)=o(f2(n))
拼接上界为最大的,嵌套上界为两复杂度相乘。
for时间复杂度=次数*循环体复杂度
if-else 复杂度= 取最大的复杂度
常见的时间复杂度有:
O(1) | 常数时间,即算法的时间复杂性与输入规模n无关。 |
O(log2n) | 次线性时间 |
O(Sqrt(n)) | O (√n) |
O(n) | 线性时间 |
O(nlog2n) | (nlog2n)时间
|
O(n2) | 平方时间
|
O(n3) | 立方时间 |
O(2n) | 指数时间 |
计算算法时间复杂度,按增长率递增排列顺序:
O(1)< O(log2n)< O(√n) < O(n)< O(nlog2n)< O(n2)< O(n3)< O(2n)<O(n!)<O(nn)
算法复杂度附例:(设问题规模为n)
1.
时间复杂度为O (n) .num1=100;num2=99; while (num1+num2<=n) if (num1>num2) num2++; else num1++;
2.
while(num1<=n) num1=num1*2; 时间复杂度为O (log2n) .num1=1;
3.
时间复杂度为O (nlog2n) .for(num1=0;num1<n;i++) { num2=1; while(num2<=n) num2=num2*2; }