一、数据结构
是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
数据结构有哪些呢?
有2种不同的表现形式,一种是逻辑层的,即数据元素之间的逻辑关系,就是逻辑结构;一种是物理层的,即数据在计算机里面的存储形式,就是存储结构。
逻辑结构分为线性结构和非线性结构,线性结构有线性表、栈、队列、串及数组;非线性结构有树、图。
存储结构分为顺序、链式、索引和散列的结构。
下图是数据结构以及在java里的实现举例:
二、算法
- 是计算机对数据的运算,包含检索、排序、插入、删除、修改等运算类型。
评价算法好坏的指标就是复杂度,有时间复杂度和空间复杂度(计算所需内存空间)。
- 复杂度
时间复杂度(Time complexity),一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。算法的时间复杂度是指执行算法所需要的计算工作量。
最坏情况下的时间复杂度叫最坏时间复杂度,一般我们说的时间复杂度就是指最坏情况的时间复杂度,因为最坏的时间复杂度是一个算法的运算时间的上限,不会比其更长,最坏情况下的时间复杂度为T(n)=O(n),它表示对于任何输入实例,该算法的运行时间不可能大于O(n)。
为了进一步说明算法的时间复杂度,我们定义3个符号:
O,表示时间复杂度的上限,就是最坏情况,比如T(n)=O(n)
Ω,表示时间复杂度的下限,就是最好情况,比如T(n)=Ω(n)
θ,表示精确阶(最好和最坏是同一个阶),比如T(n)=θ(n)
常见的时间复杂度有:
1.常数阶O(1),若算法中语句执行次数为一个常数,复杂度就是最简单的O(1),举例如下:
int a=1;
a=0;
a=2;
- > 时间复杂度: T(n)=O(1)
2.对数阶O(log2n)(以2为底n的对数),
什么是对数?
a ^x = N,(a>0 && a!=1),那么x即是以a为底,N的对数,记作
其中a叫做对数的底数,N叫做真数。
int num = 1;//执行1次
int n = 100;//执行1次
while (num < n) {
num = num * 2; // 执行n/2次
System.out.println("num="+num); //执行1次
}
- > 时间复杂度: T(n)=O(log2n)
3.线性阶O(n) :
int n=10;x=0;
for (int i=0 ;i<n ;i++){
x++;
}
- > 时间复杂度: T(n)=O(n)
4.线性对数阶O(nlog2n), 对数阶再乘以一个线性阶:
int n=10;x=0;
for (int i=0;i<n;i*=2){
for (int j=0; j<n; j++){
x++;
}
}
- > 时间复杂度: T(n)=O(n * log2n) =O(nlog2n)
5.平方阶O(n²),2层循环嵌套,每一层都执行n次,属于乘方关系
int n=10;x=0;
for (int i=0 ;i<n ;i++){
for (int j=0; j<n; j++){
x++;
}
}
- > 时间复杂度: T(n)=O(n²)
6.立方阶O(n^3), 逻辑同上,就是再多一层嵌套循环
int n=10;x=0;
for (int i=0 ;i<n ;i++){
for (int j=0; j<n; j++){
for (int k=0; k<n; k++){
x++;
}
}
}
- > 时间复杂度: T(n)=O(n³)
7.k次方阶O(n^k), 同上 , - > 时间复杂度: T(n)=O(n^k)
8.指数阶O(2^n),2的n次方
9.阶乘阶(O(n !)) ,n的阶乘
空间复杂度(Space complexity),
空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:
S(n)=O(f(n))
算法执行期间所需要的存储空间包括3部分:
-
算法程序所占的空间;
-
输入数据所占的存储空间;
-
算法辅助变量所需的额外空间。