时间复杂度分析-打造高效算法的基石!

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)不稳定

坚持分享,欢迎交流,大家共同进步!

                                                                微信公众号|大数据进阶小铺

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据青椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值