概述
- 数据结构
定义:数据存储和组织的方式.
常规操作:检索/插入/删除/排序/更新
分类:线性、非线性
- 线性:数组、栈、队列、链表
- 非线性:树(二叉树、b树、平衡树、字典树、红黑树)、散列表、堆、图
- 算法
定义:解决一系列问题的清晰指令。(解决方案)
优劣判断:时间复杂度、空间复杂度
常见的有:排序(冒泡、快速)
动态规划(一套解决问题的方法论),核心概念如下:
- 状态
- 状态转移方程
- 边界条件
- 学习资料
https://github.com/hustcc/JS-...
https://www.cs.usfca.edu/~gal...
https://visualgo.net/zh/bst
https://www.cxyxiaowu.com/
https://item.jd.com/139919397...
https://leetcode.com
数据结构
- 数据结构是计算机存储、组织数据的方式。
- 相互之间存在一种或多种特定关系的数据元素的集合。
- 合适的数据结构可以在特定的环境下带来更高的运行或存储效率。
- 分类:线性、非线性
- 基本操作:检索、更新、插入、删除、排序。
线性
数组、栈、队列、链表
数组
在内存中连续存储多个元素的结构,在内存中的分配也是连续的
数组中的元素通过数组下标进行访问,数组下标从0开始
-
优点
- 按照顺序遍历、查询元素速度快
-
缺点
- 数组的大小固定后就无法扩容了
- 数组只能存储同一种类型的数据
- 添加,删除的操作慢,因为要移动其他的元素
很多语言里的“数组”实际上不是真正的数组
栈
队列是一种限制性线性结构
仅能在线性表的一端操作,先进栈的元素要后取出
从栈顶放入元素的操作叫入栈,取出元素叫出栈(IFLO)
场景有:路由栈、调用栈
队列
队列也是一种限制性线性结构
只能在一端添加元素,在另一端取出元素,也就是先进先出
从一端放入元素的操作称为入队,取出元素为出队(IFFO)
适用在多线程阻塞队列管理
如:浏览器事件循环系统中的消息队列,以及宏任务中的微任务队列等
链表
链表是物理存储单元上非连续的、非顺序的存储结构
数据元素的逻辑顺序是通过链表的指针地址实现
每个结点包含两个元素:存储元素的数据域、指向下一个结点地址的指针域
根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表
-
优点
- 链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素
- 添加、删除很快,只需要改变前后两个元素结点的指针域指向地址即可
-
缺点
- 含有大量的指针域,需要占用额外空间
- 查找元素需要遍历链表来查找,非常耗时
-
适应场景
- 需要频繁增加,删除操作的场景
非线性
树、散列表、堆、图
树
树是一种数据结构,它是由n个有限节点组成一个具有层次关系的集合
-
树的特点:
- 每个节点有零个或多个子节点
- 没有父节点的节点称为根节点
- 每一个非根节点有且只有一个父节点
- 除了根节点外,每个子节点可以分为多个不相交的子树
二叉树
-
二叉树是树的特殊一种,具有如下特点:
- 每个结点最多有两颗子树,结点的度最大为2
- 左子树和右子树是有顺序的,次序不能颠倒
- 即使某结点只有一个子树,也要区分左右子树
- 二叉树是一种有用的折中方案,既有链表的好处,也有数组的好处
- 添加,删除元素都很快,并且在查找方面也有很多的算法优化
B树、B+树
平衡的多叉树
根节点至少有两个子节点
每个节点有M-1个key,并且以升序排列
位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
其它节点至少有M/2个子节点
所有的叶子结点都位于同一层
红黑树
一种自平衡二叉查找树
节点是红色或黑色
根节点是黑色
每个红色节点的两个子节点都是黑色
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
三种操作:左旋、右旋和变色
字典树
用于统计,排序和保存大量的字符串,经常被搜索引擎系统用于文本词频统计
利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高
散列表
根据关键码和值 (key和value) 直接进行访问的数据结构
若数据的关键字为k,则其值存放在f(k)的存储位置上
f(k)称为散列函数,按这个思想建立的表为散列表
哈希函数的构造方法
哈希冲突的解决方案
用散列表保存100万个电话号码
堆
利用完全二叉树的结构来维护一组数据
堆虽然是一颗树,但是通常存放在一个数组中
堆中某个节点的值总是不大于或不小于其父节点的值
大根堆、小根堆、堆排序
图
顶点、边、权重
有向图,无向图
邻接矩阵、邻接表、十字链表
深度优先遍历、广度优先遍历
算法
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
能够对一定规范的输入,在有限时间内获得所要求的输出。
算法特征
- 算法有穷性(Finiteness):指算法必须能在执行有限个步骤之后终止
- 算法确切性(Definiteness):算法的每一步骤必须有确切的定义;
- 算法输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 算法输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的
- 算法可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
算法优劣判断
- 正确性
- 可读性
- 健壮性
- 时间复杂度
- 空间复杂度
常见复杂度表达式
常数阶 O(1)
对数阶 O(log2n)
线性阶 O(n)
线性对数阶 O(nlog2n)
平方阶 O(n2)
立方阶 O(n3)
次方阶 O(nk)
指数阶 O(2n)
阶乘O(n!)
排序算法
查找算法
动态规划
- 动态规划不是一种固定形式的算法,动态规划是一种解决问题的思想
- 一个规模比较大的问题,可以通过规模比较小的若干问题的结果来得到
- 只要子问题被计算过,就将其结果保存起来供以后使用,这就是动态规划法的基本思路
动态规划核心概念
- 状态
- 状态转移方程
- 边界条件
- https://www.zhihu.com/questio...
动态规划简单示例
如图1+2+3+4=10可以作为已知条件用在解决下面类似的问题上.
动态规划示例: 台阶问题
加密算法
-
对称加密
- DES算法
- 3DES算法
- AES算法
-
非对称加密
- RSA算法
- ECC算法
- 散列算法
- MD5算法
- SHA1算法
缓存淘汰算法
First in first out (FIFO)
Last in first out (LIFO)
Least recently used (LRU)
Least Recently Used(LRU)
Random replacement (RR)
最优解算法
穷举法
遗传算法
爬山算法
模拟退火
贪心算法
其它算法
分类算法
调度算法
全排列算法
压缩算法
总结
程序 = 算法 + 数据结构
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。