算法
一,算法的概念与特征
1.算法的概念
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列。
2.算法的特征
1.输入输出
算法具有零个或者多个输入,至少有一个或者多个输出(没有输出,那么用这个算法干嘛?)
2.有穷性
算法必须在执行完有限步骤之后结束,而不会出现无限循环。
3.确定性
算法的每一步必须要有确定的含义,不会出现二义性。
4.可行性
算法的每一步必须是可行的,也就是说每一步都能够通过执行有限次数完成。
3.算法效率的度量方法
1.事后统计法
这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
2.事前分析估算方法
在计算机程序编制前,依据统计方法对算法进行估算。
二,算法的时间复杂度
1.算法时间复杂度的定义
算法的时间复杂度也就是算法的时间度量,我们用输入操作指令的(n次)次数来反映计算机CPU执行程序的耗时。我们通常用大O法来表示。
2.推到大O法
1.用常数1取代运行时间中的所有加法常数
2.在得到运行次数函数中,只保留最高阶项
3.如果最高阶项存在并且系数不为1,则去除与这个项相乘的常数
4.得到的结果就是大O阶
3.常见的时间复杂度及耗时排序
1.常见的时间复杂度
2.时间复杂度耗时排序
三,算法的空间复杂度
1.空间复杂度定义
算法的空间复杂度也就是衡量程序执行消耗的内存大小。在程序中除了CPU执行的指令外,其他分配内存的操作都会增加空间复杂度(如定义一个变量)。
一般情况下我们指的复杂度是说的时间复杂度。
2.空间复杂度推导
程序中在栈或者堆上分配内存的操作(定义变量/对象)我们都进行求和计算即可。
3.空间复杂度换时间复杂度案例
/* 在由一个1-1000自然数组成的数组中,每个数字可能出现0次或者多次,设计一个算法,求出现次数最多的数字。 思路分析: - 用map来实现 - 用空间换时间 */ # include<iostream> # include<map> using namespace std; void searchByMap(int array[],int len) // O(n2) { map<int, int> m; // 将出现次数存入到map中 for (int i = 0; i < len; i++) // n { map<int,int>::iterator it = m.find(array[i]);// n if (it != m.end()) { int tmp = it->second; tmp++; m[array[i]] = tmp; } else { m.insert(pair<int, int>(array[i], 1)); } } // 遍历并求出最大值 int max = 0; int val = array[0]; for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) // n { if (max < it->second) { val = it->first; max = it->second; } } // 打印结果 cout << "出现次数最多的值为:" << val << ",出现次数为:" << max << "次" << endl; } void searchByMem(int array[],int len)// O(n) { // 定义空间 int tmpArr[1000] = { 0 }; // 利用空间的下标来缓存每个数据出现的次数 for (int i = 0; i < len; i++) { int index = array[i] - 1; tmpArr[index]++; } // 遍历空间 int val = tmpArr[0]; int max = 0; for (int i = 0; i < sizeof(tmpArr)/sizeof(int); i++) { if (max < tmpArr[i]) { val = i + 1; max = tmpArr[i]; } } // 打印结果 cout << "出现次数最多的值为:" << val << ",出现次数为:" << max << "次" << endl; } int main() { // 定义自然数数组 int array[] = { 200,1,200,4,200,1,200,4,5,3,200,1,4,5,200,3,4,200,1,4,200,3,4 }; // 用map来实现 searchByMap(array,sizeof(array)/sizeof(int)); // 用空间换时间方式 searchByMem(array,sizeof(array) / sizeof(int)); return 0; }