最近复习了一下数据结构,就做个随笔吧。有一些自己的思考,因笔者水平有限,也不一定完全正确。望读者指正
数据结构就是数据在内存中的存储方式。
按照物理的结构来分(也就是数据在内存中的存储方式),也就分为了顺序存储结构和链式存储结构。
按逻辑结构来分,分为了
集合结构、线性结构、树性结构、图性结构
算法的时间复杂度:
大O记法
O(f(n))
先说结论:
1.用常数1来取代运行中的常数
2.只保留最高阶
3.去除最高阶的常数因子
例子:
3 O(1)
n+3 O(n)
n^2+2 O(n^2)
我理解的时间复杂度就是无限将n放大,去除影响整体大小的因素,比如加的常数,低阶等 只留下影响整体大小的本质,比如最高阶
说一下常见的大O记法
就是n的多少次幂,因为这是影响时间复杂度的本质
1.线性阶
单循环 O(n)
2.平方阶
双重循环 O(n2)
3.立方阶
三重循环 O(n3)
4.对数阶
例:
int i =0 ,n = 100;
while(i<n){
i= i*2;
}执行log2(n)次数
O(logn)
5.常数阶
不会随着n的增长而增长操作次数
这么多,哪种才是最合适的呐
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
大于等于n^2就要考虑优化算法了
比如我们常见的算法,冒泡,选择,希尔排序,都是n^2;不推荐使用
下面再来看一下数据类型的内存开销
byte short int long float double boolean char
分别占
1 2 4 8 4 8 1 2个字节
注意:
1.计算机访问内存一次一个字节。
2.一个引用是8个字节
比如:Date date = new Date(); 则date这个变量需要占用8个字节来表示
3.创建一个对象,除了对象内部存储的信息。对象本身也有16个字节的内存开销用来保存对象头的信息
4.注意内存不够8个字节的倍数的,要补全至8个字节的倍数
public static A{ public int a = 1;}
(1).a占用4个字节
(2).对象本身占用16个字节
20不是8的倍数,自动补全到24
5.还有我们常用的数组
注意:
其实并不是存储多大的数据,就申请多大的空间
16个字节存储自己的对象,4个字节保存长度,4个填充字节,然后再加上保存值需要的字节