数据结构和算法
网上找了个神仙总结的数据结构和算法体系结构。

一、时间复杂度和空间复杂度
1、什么是时间复杂度和空间复杂度
如何区分一个算法的好坏,如果在程序上执行,会被各种因素所干扰,所以引出了时间复杂度和空间复杂度的概念。
时间复杂度就是这个算法执行的是不是很快,空间复杂度就是这个算法是不是很耗费程序的空间。
算法的渐进时间复杂度:T(n) = O(F(n))------>大O表示法。
2、时间复杂度
比如我们这个算法要执行很多次,那么它的表达式是怎么样的?取最高次项即可。
-
比如一行最基本的代码,它的就是O(1);
-
如果某个算法中计算的时间相同,它肯定是次数越多时间越长,而且是线性增长,比如每次吃鸡腿都是1分钟,那么它执行n次,时间就是n分钟,所以它的时间复杂度就是O(n);
-
如果计算1到100的和,计算的表达式就是(1 + n)* n/2-->也就是0.5n² + 0.5n,忽略掉n的一次方,那么它的时间复杂度就是O(n²)
-
再比如一根绳子16厘米,每次剪掉剩余的一半,那么多久会剩下1厘米,那么就需要用到对数了,这个时候时间复杂度是O(log16)
3、空间复杂度
空间复杂度不需要过于深入了解,但是要知道它不是描述占用多少内存,而是比较的内存变化。
-
比如一个变量=1,然后每次都对它进行++赋值运算,变量还是一个,只不过不断的赋值,内存占用不会变化,所以还是1
-
再比如一个for循环,每次都创建一个新的变量,肯定它的空间复杂度是n
-
如果是一个二维数组,再用双层for循环赋值,它的空间复杂度就是n²
二、数组
1、介绍
数组是最基本的数据结构之一,可以存储有限个元素(固定长度),可以增删改查
2、代码实现
public class MyArray {
//定义一个数组
int[] elements;
//初始化数组
public MyArray(){
elements = new int[0];
}
//获取数组的长度
public int size(){
return elements.length;
}
//往数组的末尾添加一个元素
public void add(int ele){
int[] newArr = new int[elements.length + 1];
for (int i = 0;i < elements.length;i++){
newArr[i] = elements[i];
}
newArr[elements.length] = ele;
elements = newArr;
}
//遍历数组的方法
public void arrayShow(){
System.out.println(Arrays.toString(elements));
}
//删除一个元素
public void delete(int index){
if (index < 0 || index > elements.length - 1){
throw new RuntimeException("传入下标不正确");
}
int[] newArr = new int[elements.length - 1];
for (int i = 0;i < newArr.length;i++){
if (i < index){
newArr[i] = elements[i];
}else{
newArr[i] = elements[i + 1];
}
}
elements = newArr;
}
//取出指定位置的元素
public int get(int index){
if (index < 0 || index > elements.length -1){
throw new RuntimeException("传入下标不正确,不能读取元素");
}
return elements[index];
}
//插入一个元素到指定位置
public void insert(int index,int ele){
int[] newArr = new int[elements.length + 1];
for (int i = 0;i < newArr.length;