一、时间复杂度分析
常见类型:O(1)<O(logn)<O(n)<O(nlog n)<O(n²)<O(2ⁿ)<O(n!)
常数阶 O(1): 数量大小与输入数据 n 大小无关
线性阶 O(n): 数量大小与输入数据n成正比
平方阶 O(n²): 数量大小与输入数据成平方关系
指数阶 O(2ⁿ): 数量每轮一分为二,形成数列 1,2,4,8,16,......,
对数阶 O(log n): 数量每轮缩减一半,形成数列,如:,, ,....,16,8,4,2,1
线性对数阶 O(nlog n): 数量每轮缩减一半后再与输入数据成正比增加
阶乘阶 O(n!): 数量每轮依次加上 自身与 (1 ~ n)
最差与最佳时间复杂度:
当 nums = [?,?,...,1],即当末尾元素是1时,则需完整遍历数组,此时达到最差时间复杂度 0(n);
当 nums = [1,?,?,...],即当首个数字为1时,无论数组多长都不需要继续遍历,此时达到最佳时间复杂度
二、空间复杂度分析
算法相关空间
常见类型:
O(1) < O(log n) < O(n) < O(n²) < O(2ⁿ)
常数阶 O(1): 空间数量与数据大小无关,常数、变量、对象占用 O(1)空间
对数阶 O(log n): 常见于分治算法、数据类型转换、归并排序
线性阶 O(n): 元素数量与N呈线性关系的任意类型集合(常见于一维数组、链表、哈希表等),皆
使用线性大小的空间
平方阶 O(n²): 元素数量与N呈平方关系的任意类型集合(常见于矩阵),皆使用平方大小的空间
指数阶 O(2ⁿ): 对数阶常出现于分治算法的栈帧空间累计、数据类型转换等
三、数据结构
数据结构 = 逻辑结构 + 物理结构(顺序、链式、索引、散列)
逻辑结构:数据元素间抽象化的相互关系
物理结构:(存储结构) 在计算机存储器中的存储形式
1、数据结构逻辑分类
(1) 线性结构:
数据结构中的元素存在一对一的相互关系;
常见的线性结构:
线性表,栈,队列,串(一维数组)等。
(2)树形结构
数据结构中的元素存在一对多的相互关系;
常见树形结构:
二叉树,红黑树,B 树,哈夫曼树等。
(3)图形结构
数据结构中的元素存在多对多的相互关系;
常见图形结构:
有向图,无向图,简单图等。
2、链表结构
链表结构是由许多节点构成的,每个节点都包含两部分:
(1)数据部分:保存该节点的实际数据。
(2)地址部分:保存的是上一个或下一个节点的地址。
链表的特点:
(1)结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
(2)访问时只能通过头或者尾指针进入链表,并通过每个结点的指针域向后或向前扫描 其余结点,
所以寻找第一个结点和最后一个结点所花费的时间不等。
链表的优缺点:
(1)优点:数据元素的个数可以自由扩充 、插入、删除等操作不必移动数据,只需修 改链接指针,
修改效率较高。
(2)缺点:必须采用顺序存取,即存取数据元素时,只能按链表的顺序进行访问,访问 节点效率较
低。
3、数组结构
数组是一种 线性表 的数据结构, 连续的空间 存储 相同类型 的数据。
优点:查询速度快。
缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。