2019春招前端面试(算法和数据结构篇)

数据结构

  1. 栈:先进后出的有序集合。
  2. 队列:先进先出的有序集合。
  3. 链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的; 每个元素由元素本身的节点和指向下一个元素的引用(指针/链接)组成。
  4. 集合:由一组无序且唯一(不能重复)的项组成。
  5. 字典:以[键,值]对为数据形态的数据结构,其中键名用来查询特定元素,类似于JS中 的Object。
  6. 散列:根据关键码值(Key value)直接进行访问的数据结构;它通过把关键码值映射到 表中一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放 记录的数组叫做散列表。
  7. 树:有n个有限节点组成的一个有层次关系的集合。基本呈一对多的关系,可以看做图 的特殊形式。
  8. 图:图是网络结构的抽象模型;图是由一组边连接的节点;任何二元关系都可以由图来    表示,呈多对多的关系。

 

数组和链表的区别

数组:1.在内存中是相连的。

  1. 插入删除项成本高,需要移动元素。
  2. 可以直接访问任何位置的元素。

链表:1.由元素本身的节点和指向下一个元素的引用组成。

  1. 插入删除项不需要移动其他元素,但是操作需要使用指针。
  2. 需要从头迭代直到找到目标元素。

当读取所有元素时,链表的效率要高于数组。

 

算法

排序算法

排序算法

平均时间复杂度

最好情况

最坏情况

稳定性

冒泡排序

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.将划分后的小数组重复上面两个步骤,直到数组完全排序完成。

 

搜索算法

·顺序搜索:让目标元素与列表中的元素逐个比较,效率低下。

·二分搜索:在一个有序列表,以中间值为基准拆分为两个子列表,拿目标元素与中间 值作比较,从而再在目标子列表中递归此方法,直到找到目标元素。

算法补充知识

斐波那契数列

动态规划

贪心算法

你可能感兴趣的:(面试)