数据结构
- 栈:先进后出的有序集合。
- 队列:先进先出的有序集合。
- 链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的; 每个元素由元素本身的节点和指向下一个元素的引用(指针/链接)组成。
- 集合:由一组无序且唯一(不能重复)的项组成。
- 字典:以[键,值]对为数据形态的数据结构,其中键名用来查询特定元素,类似于JS中 的Object。
- 散列:根据关键码值(Key value)直接进行访问的数据结构;它通过把关键码值映射到 表中一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放 记录的数组叫做散列表。
- 树:有n个有限节点组成的一个有层次关系的集合。基本呈一对多的关系,可以看做图 的特殊形式。
- 图:图是网络结构的抽象模型;图是由一组边连接的节点;任何二元关系都可以由图来 表示,呈多对多的关系。
数组和链表的区别
数组:1.在内存中是相连的。
- 插入删除项成本高,需要移动元素。
- 可以直接访问任何位置的元素。
链表:1.由元素本身的节点和指向下一个元素的引用组成。
- 插入删除项不需要移动其他元素,但是操作需要使用指针。
- 需要从头迭代直到找到目标元素。
当读取所有元素时,链表的效率要高于数组。
算法
排序算法
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 稳定性 |
冒泡排序 | O(n²) | O(n) | O(n²) | √ |
选择排序 | O(n²) | O(n²) | O(n²) | x |
插入排序 | O(n²) | O(n) | O(n²) | √ |
快速排序 | O(nlogn) | O(nlogn) | O(n²) | x |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | √ |
希尔排序 | O(nlogn) | O(nlogn) | O(nlogn) | x |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | x |
|
|
|
|
|
冒泡排序:是最简单基础的排序方式。 从运行时间来看,是最差的一个。
思路:1. 相邻两个进行比较,小的在前,大的在后,依次比较交换。
2.重复上述步骤,知道结束。
选择排序:原址比较排序算法。
思路:找到元素中最小的放在第一位,接着找第二小的放在第二位,以此类推。
插入排序:每次排一个数组项,假定第一位已经排好序了,跟第二项进行比较,第二项是插入第一项之前还是呆在原地?头两项已经排好,接着跟第三项进行比较,依次类推。
(排序小型数组时,此方法要比冒泡和选择要好)
归并排序:是第一个可以被实际使用的排序算法。(Mozilla Firefox 使用归并排序作为Array.prototype.sort的实现,而Chrome使用了一个快速排序的变体。)
是一种分治算法。
思想:将原始数组逐次分成较小的数组,知道每个数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。
快速排序:最常用的的排序算法。也是分治算法。
思想:1.首先,从数组中选择中间项作为主元;
2.创建两个指针,一个指向数组第一位,一个指向数组最后一位,移动左边的指针,直到找到比主元大的元素,移动右边的指针,直到找到比主元小的元素,然后交换他们,重复这个过程,直到左边指针超过右边指针,这一步确保主元左边的元素都小于主元,右边的元素都大于主元。(划分操作)
3.将划分后的小数组重复上面两个步骤,直到数组完全排序完成。
搜索算法
·顺序搜索:让目标元素与列表中的元素逐个比较,效率低下。
·二分搜索:在一个有序列表,以中间值为基准拆分为两个子列表,拿目标元素与中间 值作比较,从而再在目标子列表中递归此方法,直到找到目标元素。
算法补充知识
斐波那契数列
动态规划
贪心算法