《漫画算法》笔记

一 算法概述

算法

一系列程序指令、用于解决特定的运算和逻辑问题

数学中的算法比如求1加到10000的解法,计算机领域算法可以应用在比如运算、查找、排序、最优决策、面试

数据结构

数据的组织、管理、和存储格式、目的是为了高效的访问和修改数据

线性结构:数组、链表、栈、队列、哈希表

树:二叉树、二叉堆

图:呈现多对多的关系

其它:跳表、哈希链表、位图等

时间复杂度

当n的取值足够大时:

O(1)  < O(logn) < O(n) < O(n2)

当然,还有 O(nlogn)、O(n3)、O(mn)、O(2的n次方)、O(n!)

空间复杂度

因为运行程序需要存储一些中间数据、算法占用的内存空间的大小

常量空间:存储空间大小固定,和输入规模没有直接的关系时,记为O(1)

线性空间:分配的空间是一个线性集合,如数组,集合大小和输入规模成正比时,记为O(n)

二维空间:分配的空间是一个二维空间,......,记为O(n2)

递归空间:需要的内存空间和递归的深度成正比。如果递归的深度是n,那么空间复杂度就是O(n)

时间和空间的取舍

给出n个整数,找出两个重复的数字

使用双重循环,时间复杂度为O(n2),空间复杂度为O(1)

使用字典法,时间复杂度为O(n),空间复杂度为O(n)

 

二 数据结构基础

数组

每个元素都有自己的下标,并且在内存中顺序存储

读取和更新元素的时间复杂度都是O(1)

插入和删除的时间复杂度都是O(n)

数组优势在于查找,劣势在于插入和删除

链表

一级一级的关联

查找节点,最坏的时间复杂度是O(n)

更新节点,不考虑查找过程,时间复杂度是O(1)

插入和删除节点,不考虑查找过程,时间复杂度是O(1)

《漫画算法》笔记_第1张图片

数组更适合读操作多,写操作少的场景

链表可以灵活的进行插入和删除操作,如果需要在尾部频繁的插入、删除元素,用链表更适合

先进后出的线性结构,可以用数组或链表来实现,可以想象一下封闭一端的乒乓球桶,放书的箱子

入栈和出栈的时间复杂度都为O(1)

队列

先进先出的线性结构,可以用数组或了表来实现,想象一下单行隧道,食堂排队打饭

入队和出队的时间复杂度都是O(1)

用数组实现的队列可以采用循环队列,充分利用数组的空间,并且避免数组元素整体移动的麻烦

栈和队列的应用

比方说app中的页面存储在栈中,方法栈等

多线程中,争夺公平锁的等待队列

双端队列:结合栈和队列的优点,可以在队头入队或者出队,也可以在队尾入队或者出队

优先队列:谁的优先级高,谁先出队,基于二叉堆来实现

散列表

散列表也叫哈希表,字典,比如Java中的HashMap

谁的效率最高,当然是数组,HashMao在本质上就是一个数组

通过哈希函数,将key和数组下标进行一个转换,那么此key对应一个唯一的value

由于数组的长度是有限的,不同的key通过哈希函数获得的下标有可能是相同的,就会产生哈希冲突

可以通过开放寻址法(寻找下一个空档位置),或链表法解决冲突

散列表达到一定饱和时,key映射位置发生冲突的概率会逐渐提高,对性能有影响

影响扩容的因素:当前长度和负载因子

扩容步骤:创建一个新的Entry数组,长度是原来的2倍,然后将Entry重新hash到新数组中

JDK8和以前的版本有很大不同,一个是红黑树,一个是链表

 

树和二叉树

 

你可能感兴趣的:(算法)