算法-基础
1、算法的特性
1、有穷性:一个算法必须在执行有限步骤之后结束。
2、确定性:算法的每一步必须是确切定义的,不能产生二义性。
3、可行性:算法是能行的。
4、输入:一个算法有零个或多个输入。
5、输出:一个算法有零个或多个输出。
2、算法设计的要求
1、正确性:不正确的程序不能使用
2、可读性(90%原则):方便阅读、修改、提高
3、健壮性:允许出错,报告原因,数据改正
4、高效率与低存储量:时间与空间考虑,对算法性能至关重要
3、时间复杂度比较
1、O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3)
2、O(2n) < O(n!) < O(nn)
3、举例:
O(1) (常数时间复杂度)
数组访问:通过索引直接访问数组中的元素。例如:arr[i]。
哈希表查找:在哈希表中查找一个元素的操作,平均时间复杂度为O(1)。
O(log₂n) (对数时间复杂度)
二分查找:在一个已排序的数组中查找元素,每次都将搜索范围减半。
平衡二叉搜索树(如AVL树)查找:查找一个元素的时间复杂度为O(log n),因为树的高度是对数级别。
O(n) (线性时间复杂度)
线性查找:在一个无序数组中查找某个元素,遍历所有元素。
计算数组的和:遍历数组并累加所有元素的和。
O(n log₂n) (线性对数时间复杂度)
归并排序:一种分治算法,通过递归将数组分成子数组,再合并这些子数组的过程。
快速排序:另一种分治算法,通过选择一个基准元素将数组分成两部分,并递归排序每一部分。
O(n²) (平方时间复杂度)
冒泡排序:比较相邻的元素并交换,直到整个数组排序完毕。最坏情况是O(n²)。
插入排序:逐步将元素插入已排序的部分,最坏情况下也是O(n²)。
O(n³) (立方时间复杂度)
三重循环:例如计算一个3D矩阵的每个元素,通常需要三个嵌套循环来遍历。
Floyd-Warshall算法:用于计算所有点对最短路径的算法,时间复杂度为O(n³),因为它需要三层循环来更新每对节点的最短路径。
O(2^n) (指数时间复杂度)
递归解斐波那契数列:直接用递归计算斐波那契数列的值,每次计算时会重复计算许多子问题,因此时间复杂度为O(2^n)。
旅行商问题(TSP)的暴力法:通过穷举所有的城市排列来找到最短的路径。所有的排列数是n!,但暴力法遍历这些排列的时间复杂度是O(2^n),因为可以用递归来遍历每种组合。
O(n!) (阶乘时间复杂度)
旅行商问题(TSP)的暴力法:这个问题的暴力求解方式是计算所有城市排列的路径,因此时间复杂度是O(n!),因为有n!种可能的路径需要考虑。
全排列生成:求一个集合的所有排列。例如给定一个长度为n的数组,生成所有排列方式。生成n个元素的全排列需要O(n!)时间复杂度。
O(n^n) (超级指数时间复杂度)
某些组合优化算法:例如在某些情况下,组合优化问题的解空间会呈现O(n^n)的规模,特别是当每个元素的选择都依赖于前一个元素时。
某些图论算法:一些非常复杂的图遍历问题或者最优化问题,在特定的情况下(如多维空间的枚举或分支界限法),可能会有O(n^n)的时间复杂度。