这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
数据结构
数据结构是数据的组织、管理和存储格式,目的是为了高效的访问和修改数据
线性结构
- 线性结构是最简单的数据结构,包括数组、链表、以及由它们衍生出来的栈、队列、哈希表
树
- 树是相对复杂的数据结构,其中比较代表性的是二叉树、以及由它衍生出来的二叉堆之类的数据结构
图
- 图是更为复杂的数据结构,因为在图中会衍生出多对多的关联关系
其它数据结构
- 有一些由上面几种基本数据结构变形而来的数据结构。比如跳表、哈希链表、位图等等
时间复杂度
- 时间复杂度是对一个算法运行时间长短的量度,用大O表示,记作T(n)=O(f(n))。
渐进时间复杂度,也可用大O表示法
- 若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称为时间复杂度。
常见时间复杂度
- O(1):常量关系,即运算时间不随数据规模n的变化而变化
- O(logn):随着数据规模n的增长与时间呈对数关系
- O(n):随着数据规模n的增长与时间呈线性关系
- O(n²):随着数据规模n的增长与时间呈n²关系 还有
- O(nlogn)
- O(n³)
- O(mn)
- O(n!)
空间复杂度
常见空间复杂度关系
-
O(1):当算法空间固定,与输入规模无直接关系
-
O(n):当算法分配的空间是一个线性的集合如数组,并且集合的大小和输入的规模n成正比
-
O(n²):当算法分配的空间是一个二维数组集合,并且集合的宽度和长度都与输入的规模n成正比
-
递归空间:递归是一个比较特殊的场景、虽然代码中并无显示声明变量或者集合、但是计算机在执行程序时,会专门分配一块内存,用来存储方法调用栈,它包括进栈和出栈两个行为。递归所需要的空间和递归深度的深度成正比,空间复杂度为O(n)