算法概述
- 什么是算法?
- 算法定义:本质是一系列程序指令,用于解决特定的运算和逻辑问题
- 算法的特点
- 算法有简单的,也有复杂的
- 算法有高效的,也有拙劣的
- 衡量算法标准
- 时间复杂度
- 定义:
- 若存在函数f(n) ,使得当n趋近于无穷大时,T(n)/f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数。
- 记作 T(n)=O(f(n)) ,称为O(f(n)) ,O为算法的渐进时间复杂度
- 别称:大O表示法
- 时间复杂度的原则
- 如果运行时间是常数量级,则用常数1表示
- 只保留时间函数中的最高阶项
- 如果最高阶项存在,则省去最高项前面的系数
- 时间复杂度的场景(O(1) < O() < O(n)< O(n2)
- O(n) T(n) = 3n,最高阶项为3n,省去系数3,则转为T(n)=O(n)
- O() T(n) = 5,最高阶项为5,省去系数5,则转为T(n)=O()
- O(n2)
- O(1)
- 定义:
- 空间复杂度
- 空间复杂度定义
- space complexity:对一个算法在运行过程中临时占用存储空间大小的量度
- 使用大O表示法
- S(n)=O(f(n)) :n为问题的规模,f(n) 为算法所占存储空间的函数
- 空间复杂度情形
- 常量空间 算法的存储空间大小固定,和输入规模没有直接的关系
public void func(int n) { int a = 100; }- 线性空间 - 算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模n成正比时
public void func(int n) { int[] arr = new int[n]; //todo }- 二维空间 算法分配的空间是一个二维数组集合,并且集合的长度和宽度都与输入规模n成正比时
public void func(int n) { int[][] arr = new int[n][n]; //todo }- 递归空间 递归会专门分配一块内存,存储方法调用栈
- 方法调用栈
- 进栈:当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中
- 出栈:当方法返回时,执行出栈操作,把调用的方法和参数信息中栈中弹出
public void func(int n) { if(n == 0) { return; } func(n - 1); }
- 空间复杂度定义
- 时间复杂度
- 什么是数据结构
- 数据结构定义:是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据
- 数据结构的分类
- 线性结构
- 数组
- 链表
- 栈
- 队列
- 树
- 图
- 其他结构
- 跳表
- 哈希链表
- 位图
- 线性结构