算法的分析与设计
涉及到的考点:
- C语言
- 数据结构(树、链表)–考的不多
- 时间复杂度和空间复杂度的计算
- 排序算法
- 四大经典算法
程序设计语言的基本成分
数据成分:指一种程序设计语言的数据和数据类型。数据分为常量(程序运行时不可改变)、变量(程序运行时可以改变)、全局量(存储空间在静态数据区分配)、局部量(存储空间在堆栈区分配)。数据类型有整型、字符型、双精度、单精度浮点型、布尔型等。
运算成分:指明允许使用的运算符号及运算规则。包括算术运算、逻辑运算、关系运算、位运算等。
控制成分:指明语言允许表述的控制结构。包括顺序结构、选择结构、循环结构(初始化+循环体+循环条件)
传输成分:指明语言允许的数据传输方式。如赋值处理,数据的输入输出
函数
函数:C程序由一个或多个函数组成,每个函数都一个名字,其中有且仅有一个名字为mai的函数作为程序运行时的起点。函数是程序模块的主要成分,是一段具有独立功能的程序。函数使用涉及三个概念:函数定义、函数声明(先声明后使用)、函数调用。
- 传值调用:将实参的值传递给形参,形参的改变不会导致调用点所传的实参的值改变。实参可以是合法的变量、常量和表达式。
- 传址调用:即引用调用,将实参的地址传递给形参,即相当于实参存储单元的地址引用,因此其值改变的同时就改变了实参的值。实参不能为常量,只能是合法的变量和表达式。
因此,在编程时,要改变参数值,就传址,不改变,就传值。
返回值的类型 函数名(形式参数) //函数首部
{
函数体;//这个函数具体要干什么
}
C语言示例
冒泡排序
#include <stdio.h>
void bubble_sort(int arr[],int len){
int i,j,temp;
for(i = 0; i < 1en - 1; i+){
for (j = 0; j < len - 1-i; j++){
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] =a rr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main(){
int arr[]={22,34,3,32,82,55,89,50,37,5,64,35,9,70};
int len sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,len);
int i;
for (i=0;i<len;i++)
printf("%d "arr[i]);
return 0;
}
算法复杂度
算法的复杂度:
- 时间复杂度是指程序运行从开始到结束所需要的时间。
- 复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小
常见的对算法执行所需时间的度量:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)
上述的时间复杂度,经常考到,需要注意的是,时间复杂度是一个大概的规模表示,一般以循环次数表示,O(n)说明执行时间是的正比,另外,log对数的时间复杂度一般在查找二叉树的算法中出现。渐进符号O表示一个渐进变化程度,实际变化必须小于等于O括号内的渐进变化程度。
排序算法
经典算法
分治法对于一个规模为的问题,若该问题可以容易地解决则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。
回溯法(Backtracking)是一种选优的暴力搜寻法。但是,由于暴力,回溯法的时间复杂度较高,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回
再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
动态规划法(Dynamic Programming):在求解问题中,对于每一步决策,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解,以每一步都是最优解来保证全局是最优解。
贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不比为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。
经典总结
分治法特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
回潮法特征:系统的搜索一个问题的所有解或任一解。
经典问题:N皇后问题、迷宫、背包问题
动态规划法(用于求最优解):划分子问题,并把子问题结果使用数组/散列表存储,利用查询子问题结果构造最终问题
经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列
贪心法(用于求满意解】特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
经典问题:背包问题、多机调度、找零钱问题