1
背景知识
数据结构与算法的联系
程序=算法+数据结构。数据结构是算法实现的基础,算法要依赖于某种数据结构来实现的。
数据结构关注的是数据的逻辑结构、存储结构以及基本操作,而算法更多的是关注如何在数据结构的基础上解决实际问题。算法是编程思想,数据结构则是这些思想的逻辑基础。数据结构是为算法服务的。
算法与时间复杂度
衡量一个算法的‘好’的标准除了要符合正确性、可读性、健壮性,还应满足时间效率和低存储量的要求。时间复杂度就是衡量时间效率的度量。在大多数条件下,计算机的内存和存储都是足够充裕的。但是短时间能够出结果,用户体验会更好。所以时间复杂度越低的算法显得尤为重要。
2
时间复杂度计算
时间复杂度表达公式
T(n)=O(f(n))
定义:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同,称为时间复杂度。
含义解释
n:数据规模
f(n):程序重复执行次数
O:表示数量级,一个正的常数
3
案例分析
求T(n)步骤,三步走:
1.找出语句执行次数(频度)最多的那条语句作为基本语句.
2.计算基本语句的频度得到问题规模n的某个函数f(n).
3.取其数量级用‘O’表示.
案例一:冒泡排序时间复杂度分析
public class BubbleSort {
public static void main(String[] args) {
int []arr={5,0,1,4,2,3};
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j+1]<arr[j]){
// 如果符合要求,则j与j+1 位置上的数做交换
swap(arr,j,j+1);
}
}
}
for (int i : arr) {
System.out.println(i);
}
}
public static void swap(int[] arr, int i, int minIndex) {
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
}
}
解决思路:直接分析,找到数据规模与频度最高的那条语句执行次数之间的关系
案例二:间接分析,数据规模n与执行次数f(n)关系不容易拿到
i=1;
while(i<=n){
i=i*2;
}
解决思路:找准目标,求执行次数与数据量n的关系,尝试分析下,可以设执行次数为x
4
常见时间复杂度排序
5
笔记扩展
常见排序算法的时间复杂度
法 | 时间复杂度 | 空间复杂度 | 稳定性分析 |
---|---|---|---|
冒泡排序 | O(N^2) | O(1) | 稳定 |
选择排序 | O(N^2) | O(1) | 不稳定 |
插入排序 | O(N^2) | O(1) | 稳定 |
快速排序 | O(N log N) | O(log N)(递归栈空间) | 不稳定 |
归并排序 | O(N log N) | O(N) | 稳定 |
堆排序 | O(N log N) | O(1) | 不稳定 |
桶排序 | O(N^2) | O(N + K) | 不稳定 |
坚持分享,欢迎交流,大家共同进步!
微信公众号|大数据进阶小铺