程序由数据结构和算法组成,以下内容为算法的基础内容
1.1 算法
程序 = 数据结构+算法
1.2 什么是算法
解决问题的思想步骤
1.3 算法与数据结构
算法的设计:取决于选定的逻辑结构
算法的实现:取决于选定的存储结构
1.4 算法的特性
有穷性 —— 算法执行的步骤(或规则)是有限的;
确定性 —— 每个计算步骤无二义性;
可行性 —— 每个计算步骤能够在有限的时间内完成;
输入 —— 算法有零个或多个外部输入;
输出 —— 算法有一个或多个输出。
1.5 如何评价算法的好坏
1、消耗时间的多少(时间复杂度,越少越好)
2、消耗存储空间的多少(空间复杂度)
struct A struct A
{ {
char a; int b;
int b; short c;
short c; char a;
}; };
- 容易理解、容易编程和调试,容易维护
1.5.1 时间复杂度
时间复杂度:算法中可执行语句重复执行频度和,记为T(n)
语句频度:可执行语句再算法(或程序)中重复执行的次数
T(n)=O(f(n))
T(n):问题规模的时间函数
n:问题的规模(处理多少个数据)
O:时间数量级
f(n):算法中可执行语句重复的次数
案例:求1+2+3+4+…… + n的很
算法1:n(n+1)/2 f(n) = 1 常数集
算法2:
for(i = 1;i <= n; i++)
{
sum = sum + i;
}
f(n) = n; //线性集
算法3:
for(i = 0; i <= n; i++)
{
for(j = 0; j < i; j++)
{
printf(“hello 22072”);
}
}
语句执行的次数:1 + 2 + 3 + 4 +……+n = n(n+1)/2 = n ^2/2 + n/2
1.5.2 计算O的方法
1、根据问题规模写出n的表达式 f(n) = n^2/2+n/2
2、如果有常数项,将其置为1(注意:f(n)表达式中有常数项的时候才可以使用)
3、只保留最高项,其他项舍去 f(n) = n^2/2
4、如果最高项数不为1,将其置为1 f(n) = n^2
1.6 查找
平均查找长度(ASL)
4.6.1 顺序查找
int a[5] = {1,2,3,4,5};
在数组中查找5
for(i = 0; i < 5; i++)
{
if(a[i] == 5)
{
return i;
}
}
时间复杂度:T(n) = O(n) -》线性集
还有一种二分查找,后期在整理,以上就是对于算法的初步了解,如有错误,请大家指正。