目录
1.初步接触算法
正常情况下,要算1~100相加的值,一般程序员第一想法都是 for循环相加算出结果,这也是一种算法
但是说到 高斯求和算法 可能不少的程序员都知道这个算法,但是可能都是记住了但是没有拿出来实用
/// <summary>
/// 1~100循环算法
/// </summary>
/// <returns></returns>
public int GetSum()
{
int sum = 0, n = 100;
for (int i = 0; i < n; i++)
{
sum = sum + i;
}
return sum;
}
/// <summary>
/// 高斯求和算法
/// </summary>
/// <returns></returns>
public int GaussSummation()
{
int sum = 0, n = 100;
sum = (1 + n) * n / 2;
return sum;
}
循环算法的话,求多少的和就得循环多少次,而高斯求和算法无论相加到多少都只需要执行一次,所以算法的质量是很重要的
2.算法的定义
如今普遍认可的对于算法的定义是:
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
算法的特性
- 输入和输出:对于大多数算法来说一般是需要输入参数的,个别情况可以不要输入参数,至少有一个或多个输出;
- 有穷性:在执行完有限的步骤后,自动结束而不会无限循环,并且每个步骤在可接受的时间内完成;
- 确定性:每一步骤都有具体确定的含义,不会出现二义性。就是说相同的输入只能有唯一的输出结果;
- 可行性:每一步都是可行的。也就是说每一步都能通过执行有限的次数完成;
算法的设计要求
算法不是唯一的,同一个问题可能有多种不同的算法解决,所以谈一下算法的设计要求,一个好的算法要满足以下设计要求
- 正确性:指算法至少具有输入输出和加工无歧义性,能准确反映问题需求,得到问题正确答案;
- 可读性:便于阅读、理解和交流
- 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果;
- 时间效率高和储存量低:应该是多个算法中 执行时间短和占用存储空间低的被使用
3.算法的时间及空间复杂度
1.算法的时间复杂度
推导大O阶方法
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高项存在且不是1,去除这个项相乘的常数,得到的就是大O阶
//用O()表示时间复杂度的记法 称为大O记法
//------------------------------------常数阶 O(1)
int sum = 0, n = 100; //执行一次
sum = (1 + n) * n / 2; //执行一次
Console.WriteLine(sum); //执行一次
//注意:保留最高阶项,所以这个不是 O(3) 而是 O(1),单纯分支结构(不包含在循环结构中),其时间复杂度也是O(1)
//------------------------------------线性阶 O(n)
for (int i = 0; i < n; i++)
{
sum = sum + i; //执行n次
} //循环内执行n次,所以是O(n)
//------------------------------------对数阶 O(logn) 执行n的1/2次
int count = 1;
while (count < n)
{
count = count * 2;
} //由于每次count乘以2以后,就相当于有多少个2相乘后大于n则退出循环,由于2的x次方=n 所以时间复杂度为 O(logn)
//------------------------------------平方阶 O(n²) 执行n的平方次
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; i++)
{
//执行n*n次
}
} //循环内执行n²次,所以是O(n²)
由上述代码可以看出 循环体的时间复杂程度等于循环体的复杂度乘以改循环的运行次数
执行函数次数 | 阶 | 非正式术语 |
---|---|---|
1 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n² +2n+1 | O(n² ) | 平方阶 |
5log2(n)+20 | O(logn) | 对数阶 |
2n+3nlog2(n)+19 | O(nlogn) | nlogn阶 |
6n³+2n³+3n+4 | O(n³) | 立方阶 |
2ⁿ | O(2ⁿ) | 指数阶 |
常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)
一般在O(n²)平方阶之后的时间复杂度 ,会由于n值导致噩梦般的运行时间,所以一般不讨论
2.算法的空间复杂度
可以在空间和时间之间进行平衡,空间换取时间
公式为 S(n)=O(f(n)) 其中n为问题的规模,f(n)为语句关于n所占存储空间的函数
空间复杂度就是一个算法在运行过程中临时占用的存储空间大小,换句话说就是被创建次数最多的变量,它被创建了多少次,那么这个算法的空间复杂度就是多少。
欢迎大家评论交流或指出错误!!!