前端算法入门系列 ---(一)数据结构

25,290 阅读7分钟

前端算法入门 -- 数据结构

基础知识篇

1)什么叫算法?

算法就是计算或解决问题的步骤。

2)算法和程序有什么区别?

区别在于,程序是以计算机能够理解的编程语言编写的,可以在计算机上运行,而算法是以人类能够理解的数学方式来描述的,用于编程之前。但,算法和编程没有具体边界。

3)如何选择算法?

同样的问题,不同的开发者解法不同,不同的编程语言,写法不同,为算法设立评判标准的目的在于选择最优标准的算法。评判算法的优劣有两个标准:一是从运行到计算出结果需要耗费空间的大小,另一个是从运行到计算出结果需要花费多少时间。分别称为,空间复杂度时间复杂度。通常,复杂度越低,耗费内存越少,执行越快,也更容易被人理解。一般,最为重视的是算法的运行时间

4)如何反映算法的运行时间?

算法不同、设备不同、数据量不同都会导致算法时间有差异,通过理论计算出的运行时间是一个多项式,而我们需要能最直观的了解到时间随数据量变化的关系,常常会忽略掉非重要项,得到一个最简单的并且最能反映运行时间趋势的表达式,我们把:忽略掉不重要项、能最简表示运行时间随数据量变化关系写成O(n)的形式,其中O是大写,表示忽略重要项以外的内容,读音同order;n表示参与算法的数据量。

数据结构

★ 为什么要有多种数据结构?
根据使用目的的不同,使用不同的数据类型,可以提供内存空间利用率。

1)链表

链表是数据结构之一,其数据呈线性排列;在内存空间中,数据是分散存储于内存中的,每个数据都由两部分组成,一部分是数据本身,另一部分是一个指针,它指向下一块存储空间。当对数据进行访问时,只能顺着指针指向一一往下访问,直到找到或者访问到末尾,如果链表中的数据量是n,那么,查找到一个数据,最快需要一次,最多需要查找n次;当需要在链表中添加或者删除一个数据时,只需要改变其中某一个或两个的数据指针即可,与链表的数据量无关,是常量级的。

小结
链表数据是线性的,存储空间是不连续的,访问的时间复杂度为O(n),增删的时间复杂度为O(1)。

拓展
  循环链表:链表尾部的数据是没有指针的,当为尾部数据添加一个指向链表头部数据的指针时,链表指针之间就形成了环形结构,称为循环链表或环形链表。
  双向链表:当链表内部指针既可以从前一个数据指向后一个数据同时也可以从后一个元素指向前一个数据时,就形成了双向链表。
这里要注意:在给出定义时就说了,数据由数据体本身和指针共同组成,当指针增加时,数据需要的存储空间也会增加,就会占用更多的内存。同时,当指针越多,增删数据时,需要改变的指针也就越复杂,需要改变指向的指针也越多。

2)数组

数组也是线性排列的数据结构之一,它与链表不同的地方在于,数组在内存空间的存储是连续的。当访问数组时,只需要根据数组索引找到对应位置即可,查找复杂度是常量级的,表示为O(1);而当对数组进行增加时,如果在数组头部增加,则需要先将数组扩容。然后将每一个元素都依次向后移动,这个过程复杂度是O(n),而如果在数组尾部增加一个元素,复杂度变成了O(1),同理,删除一个元素,尾部删除时为O(1),头部删除时为O(n)。可以看出,相比于链表,数组虽然查询方便了,但是操作复杂度却高了。

3)栈

栈是一种线性数据结构,当为栈添加一个元素时,这个元素被添加到了栈的最顶端,当取出元素时,只能单向的从最前面的位置读取,然后才能读取后面的元素,也就是说,最后被添加的,反而是最先被读取的,因此,栈被称为是后进先出(LIFO)模式,添加和删除数据的方式也被称为是入栈和出栈。由于栈具有的LIFO的特点,它常常被用来保存最新的数据。

4)队列

队列也是线性结构的数据结构,它与栈很像,都是单向的有序操作,但是,后进先出,而队列就像排队,先来的排在前面,后来的排在后面,属于先进先出(FIFO),要访问后面的元素,只能把前面的元素都访问完了,才能访问到目标元素。添加和删除队列的操作也被称为入队和出队。

5)哈希表

哈希表存储的是以键值对组合的数据,一般,把键当做数据的标识,而把值当做数据的内容。哈希表通常与哈希函数组合使用,在建立哈希表的过程中,需要使用哈希函数计算数据的哈希值,将其存在数组中,这样在访问时就可以快速使用数组的特性访问到;如果在建立数组的时候存在多个位于同一个数组位置的值,则再次使用链表存储相同的值。
哈希表的使用,加快了数组查询的速度,在灵活性和高效性上有很大的优势。在编程中,关联数组时常常会用到哈希表。

6)堆

堆是图的一种,是二维的数据结构,其示意可以用二位的树状图表示,子节点的数据值总比父节点大。在堆中,顶端的数据始终是最小的,所以无论多少数据量,取出最小值的复杂度始终都是O(1)。另外,由于取出数据后需要将最后的数据移动到最顶端,然后一边比较它与子节点数据的大小,一边往下移动,所以,取出数据需要的运行时间和树的高度成正比,假设数据量为n,根据堆的形状特点可知,树的高度为log2n,那么重构树的复杂度就是O(logn).添加数据也一样,在堆的最后添加数据,数据一边比较它与父节点的大小,一边往上移动,知道满足堆的条件为止。
如果需要频繁的从数据中取出最小值,那么,堆,是一种很好的选择。

7)二叉查找树

二叉查找树也叫作二叉搜索树,或二叉排序树。是二维的图结构的一种。它的特点是:每个节点最多有两个节点,分别称为左子树和右子树,每一个节点上的值均大于其左子树上的值,每个节点上的值均小于其右子树上的值。
根据这两个特点可知:二叉查找树查找最小值要往左下末端找,查找最大值要往右下末端找

小结

数据结构到底选哪种要根据使用目的来确定,前端常用的为以上7种,具体这些数据结构怎么灵活运用?可以做什么?请看下集。

文末

总结和整理不容易,看完有帮助,点赞和关注,平台会推荐更多相似主题优质文章;

在准备面试?来交流一下吧,每天一到面试题提升自我;准备进阶高级全栈?来聊聊进阶之道,少走弯路;敲代码累了?来群里聊聊天吧,让工作更高效。

由于限制,目前已满200,只能通过邀请加入,所以,请搜索公众号【前端进阶面试内推】,我邀请进群。来这里,找到更多志同道合的前端伙伴~