恋上数据解构与算法.md

第一季

1. 复杂度

1.1 什么是算法?

算法是用于解决特定问题的一系列的执行步骤

//比如计算a和b的和,就是计算a+b的算法
public static int plus(int a,int b){
	return a+b;
}

不同算法效率差别很大

比如求斐波那契数(fibonacci number)

==定义:起点是0、1都行,第0项为0,第1项为1,重点是需要满足f(n)=f(n-1)+f(n-2)==

0,1,1,2,3,5,8,13,21,34,55,89

f(0)=0

f(1)=1

f(n)=f(n-1)+f(n-2) n>=2时

算法1:

public int fib(int n){

    if(n <= 1){return n;}
    return fib(n-1)+fib(n-2);
}

算法2:

public int fib(int n){

    if(n <= 1){return n;}
    int first = 0;
	int second = 1;
	// 第n个数,需要前面的数加上n-1次
    for(int i=0 ; i< n-1; i++){
        int sum =first + second;
        first = second;
        second = sum;
    }
    return second;
}

1.2 怎么评判一个算法的好坏

时间复杂度(time complexity):估算程序指令的执行次数(假设每个指令的执行时间一样,那么比较**==算法的指令执行次数==**即可判断一个算法的好坏)

大O表示法

一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度

  • 忽略常数、系数、低阶
  • 对数阶忽略底数

注:一台1Ghz的计算机,运算速度每秒10^9次

1.3 什么是数据结构

数据结构是计算机存储、组织数据的方式

线性结构

  • 数组
  • 链表
  • 队列
  • 哈希表

树形结构

  • 二叉树
  • AVL树
  • 红黑树
  • B树
  • Trie
  • 哈夫曼树
  • 并查集

图形结构

  • 邻接矩阵
  • 邻接表

2. 线性表

线性表是具有n个相同类型元素的有限序列(n>=0)

1602739636466

  • a1是首节点(首元素),an是尾节点(尾元素)
  • a1是a2的前驱,a2是a1的后继

2.1 数组

数组是一种顺序存储的线性表,所有元素的内存地址都是连续的

  • 无法动态修改数组容量

2.1.1 动态数组接口设计

public class MyArrayList implements List{	
	private int size();
	private E[] elements;
	public static final int DEFAULT_CAPACITY = 10;
	...
}
public interface List<E>{

	// 元素的数量
    int size(){
        return 0;
    }

	//是否为空
    boolean isEmpty(){
        
    }

	//是否包含某个元素	
    boolean contains(E element){
        
    }

	//添加元素到最后	
    void add(E element){
        
    }
    
    void add(int index,E element){
        
    }

	//返回index位置的元素
    E get(int index){
        
    }

	//设置index位置的元素
	E set(int index,E element){
        
    }
	
    //往index位置添加元素    
    void add(int index, E elemnt){z 
        
    }

	//返回index位置对应的元素
    E remove(int index){
        
    }

	//查看元素的位置
    int indexOf(E element){
        
    }

	//清除所有元素
	void clear(){
        
    }
    
    void rangeCheck(){
        
    }
    
    void rangeCheckForAdd(){
        
    }
    
    void ensureCapacity(int capacity){
        
    }
}

2.1.2 临时记录

  • Java把变量声明成static类型,可以保证这个变量在内存种只有一份
  • 数组越界,throw new IndexOutOfBoundexception()
  • ArrayList调用clear方法,其实就是把size设置为0,因为别的方法访问
    前都会先判断是否>=size
  • size的作用就是规定能访问的范围
  • ArrayList插入元素的条件判断略有不同
public void add(int index,int element){
    if(index<0||index>size){
        throw new IndexOutofBoundsException('...');
    }

    for(int i = size-1;i >= index;i--){
        elements[i+1]=elemets[i];
    }
    elements[i+1]=element;
    size++;
}