文章目录
学习网址
算法题1
算法理论瓶子君
其实两个都是瓶子君的,我感觉自己发现了一个宝藏
算法视频
JavaScript中的数据结构和算法学习
一、复杂度的学习
时间复杂度
简单把代码每次执行一行的时间当作单位时间;所以当代码执行2n+2
行的时候时间复杂度;
T(n)=(2n+2)*单位时间;记作:T(n)=O(f(n))
n
表示数据大小 ,一般是表示循坏的代码执行次数f(n)
表示的是每行代码执行的次数的总和,也就是代码执行的总次数;O
表示的是代码的执行时间T(n)和f(n)
是正比关系;如果f(n)很大
的时候,可以记作T(n)=O(n)
;
安装屏幕画笔- 当n无穷大的时候,只关注最高阶;
- 当算法中不存在循坏语句、递归语句,时间复杂度都是
O(1)
- 平均时间复杂度:所有情况下,求一个平均值,可以省略掉系数、低阶、常量
空间复杂度
时间复杂度是算法执行时间和数据规模之间的增长关系,空间复杂度呢就是算法存储空间和数据规模之间的增长关系
二、数据结构
1. 栈
栈的特点:先进后出;好像叠放在一起的一堆盘子,你想要取到最下面一本必须拿掉上面的一样;
2. 队列
队列是先进先出的,好比日常生活中排队的列子,排在前面的人先办完事情先走;
优先队列
循坏队列
:以单链表、队列方式实现;当要找的数据下标索引大于队列长度,则为找的下标%索引长度
3. 链表:
数组可以访问任何位置的元素,单访问链表中间的元素需要从起点开始迭代列表直到找到需要的元素;
3.1双向链表:
3.2 循环链表:
3.3 双向循环链表:
链表相对数组而言的优势就是不需要移动元素就可以进行操作,所以在需要移动大量元素的时候我们考虑用链表去做;
4. 集合
- 集合的概念:集合由一组无序唯一的数据组成,集合数据不能重复;
- 集合有关的操作:并集、交集、差集、子集。
5. 字典
字典也是不重复的数据key:value
,javascript里面的Object对象就是这种类型,可以当做字典;
6. 散列
散列函数的作用是给定一个键值,然后返回值在表中的地址。
7. 树
- 树是非顺序存储结构;
- 二叉树和二叉搜索树:二叉树是树中的节点最多只有两个子节点左右节点;二叉搜索树是在二叉树的基础上进一步约束,左侧的子节点只能比父节点小,右侧的子节点只能大于等于父节点;
- 树的遍历:有先序、后序、中序;中序遍历是一种以上行顺序访问 BST (二叉搜索树)所有节点的遍历方式,也就是以从最小到最大的顺序访问所有节点。中序遍历的一种应用就是对树进行排序操作。三种遍历的命名方式可以理解为根据节点本身,节点本身第一个访问就叫先序、节点本身第二个访问就叫中序、节点本身最后一个访问就叫后序;
- 在AVL树中任何节点的两个子树的高度最大差别为一
8. 图
图是一组由边连接的节点(或顶点),任何二元关系都可以用图来表示。
一个顶点的度是连接相邻顶点的个数,也就是看这个顶点连接的边的数量;
图的遍历有两种方法;
- 深度优先遍历DFS 沿着路径进行搜索知道最后一个节点然后返回上一节点继续沿着路径到最后一个叶子节点;
- 广度优先遍历BFS 先一层一层的遍历
三、算法(排序和搜索算法)
1. 排序算法
1.1 冒泡排序
冒泡排序虽然思路简单但是时间效率最差;时间复杂度是O(n^2)
外层循环是比较趟数,里层循环是每一趟比较的次数;
1.2 选择排序
每一次都找到数据中的最小值然后按次序摆放;
1.3 插入排序
用需要插入的数据和已经排好序的数据开始比较,看插入在哪个位置比较合适;
1.4 归并排序
归并排序时间复杂度比前三个排序算法好,为O(nlogn)
类似于二分查找算法,分成单个小数组然后归并成大数组;归并排序解释1
1.5 快速排序
快速排序时间复杂度为O(nlogn),比其他时间复杂度为O(nlogn)的排序算法要好;
快速排序:
- 首先找到中间数据作为主元,然后两个指针,一个指向左边第一个数据,另外一个指向右边最后一个数
- 移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交 换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之 前,而比主元大的值都排在主元之后。这一步叫作划分操作。
- 重复上面两个步骤
2. 搜索算法
2.1 顺序搜索算法
顺序搜索算法就是最基本的按着顺序一个一个的与要查找的数据做比较;
2.2 二分查找算法
分为左右两个部分,比较mid中间数据与要查找的数据的大小,数据是已经排好序的,所以呢如果要查找的数据小于mid中间数据就在左半部分查找;时间复杂度O(logn)
四、算法补充知识
1. 斐波那契数
n的斐波那契数是n-1的斐波那契数+n-2的斐波那契数;
2. 动态规划
上面的图中提到的深度优先搜索算法用到了动态规划思想,分而治之
(归并排序和快速排序)是把问题分为相互独立的子问题进而重新组合,而动态规划是将问题分为相互依赖的子问题;
3. 贪心算法
五、算法性能表
数据结构有关插入、删除、搜索算法的时间复杂度如下表所示:
排序算法时间复杂度
搜索算法时间复杂度: