一、如何衡量一个算法的好坏?
1,正确性。(a程序不含错误语法,b程序对于输入的数据能够得出所要求的结果,c程序对于典型甚至苛刻的数据也能得出所求结果,d对于一切合法输入的数据都有相对应的结果。)
2,可读性。(主要方便人的阅读,可读性好有助于人去理解。)
3,健壮性。(当输入数据非法时,算法也能适当地做出处理。)
4,效率与低存储量。(算法时间与问题规模的平衡)
二、时间复杂度?
所谓的时间复杂度是指随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,算法中的基本操作的执行次数。
三、时间复杂度为什么不使用时间来衡量而使用基本语句的运行次数来衡量?
因为考虑到算法所执行的环境不同,所以执行一个相同的算法在不同的运行环境下所需要的时间也不相同。
四、时间复杂度的O渐进表示法
1,用常数1取代运行时间中的所有加法常数。
2,在修改后的运行次数函数,只保留最高阶项。
3,如果最高阶项存在且不是1,则去除与这个项目相乘的常数。
五、 时间复杂度的:最优、平均、最差情况,为什么时间复杂度看的是最差情况?
最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求。
六、如何求解:二分查找、递归求阶乘、递归斐波那契的时间复杂度?
二分查找的时间复杂度-最好O(1),最差O(lg n)。
递归求阶乘O(N)。
斐波那契数列O(2^n)
七、什么是空间复杂度?
对一个算法在运行过程中临时占用存储空间的大小的量度。也用大O渐进表示法。
八、如何求空间复杂度? (普通函数&递归函数)
递归函数:递归深度n*每次递归所要的辅助空间,如果每次递归所需要的辅助空间为常数,则递归空间复杂度o(n)
普通函数:当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。
九、分析递归斐波那契数列的:时间、空间复杂度,并对其进行优化,伪递归优化--->循环优化。
//递归Fibonacci
long long Fibonacci(size_t N)
{
return N < 2 ?: Fibonacci(N-1)+Fibonacci(N-2);
}
时间复杂度O(2^n)空间复杂度O(n)
//循环优化后Fibonacci
long long*Fibonacci(size_t n)
{
if(n==o)
return NULL;
long long*fibArray = new long long [n+1];
fibArray[0] = 0;
fibArray[1] = 1;
for(int i = 2;i <= n;i++)
{
fibArray[i] =fibArray [i - 1]+fibArray[i - 2];
}
return fibArray;
}
时间复杂度O(n),空间复杂度O(n)。
十、总结常见时间复杂度。
O(1) 直接输出结果
O(logn) 二分查找、快速幂
O(n) 贪心算法、扫描和遍历
O(nlogn) 带有分治思想的算法,如二分法
O(n^2) 枚举、动态规划
O(n^3) 动态规划
O(2^n) 搜索
O(n!) 产生全排列
O(n^n) 暴力法破解密码