目前,计算机已深入到社会生活的各个领域,由其是Web前端应用,其应用已不再仅仅局限于科学计算,而更多的是用于控制,管理及数据处理等非数值计算领域。计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:信息的表示,信息的处理。
信息的表示和组织又直接关系到处理信息的程序的效率。随着Web应用问题的不断复杂,前端页面功能的丰富,导致信息剧增与信息范围的拓宽,使许多WEB应用的规模很大,结构又相当复杂。因此,必须分析待处理问题中的对象的特征及各对象之间存在的关系,这就是数据结构。
编写解决实际问题的程序的一般过程:
l 如何用数据形式描述问题?--即由问题抽象出一个适当的数学模型
l 问题所涉及的数据量大小及数据之间的关系
l 如何在计算机中存储数据及体现数据之间的关系
l 处理问题时需要对数据作何种运算?
l 所编写的程序的性能是否良好?
上面所列举的问题基本上由我们今天学习的数据结构来解决。
千锋“HTML5程序员”训练营是全国最好的全栈工程师和架构师的培训基地,“算法与数据结构”是目前课程体系(V6.5)第二阶段的核心课程之一。
全栈工程师需要懂算法和数据结构,无论是哪一门计算机语言,只要是程序员,那么算法和数据结构就是你必修的核心部分,更是前端开发人员的基石。在精通前端的基础上深入掌握算法与数据结构,能够更好的站在全栈角度去设计和研发,提高web性能,获得更多用户的访问和体验。
算法与数据结构如何讲授呢?主要突出以下几点:
第一,循序渐进。注重概念、作用、用法,以学生为主,教师为辅的教学理念,引导学生自主解决问题的思维,快速提升并应用算法及掌握数据存储和数据处理的方法。
第二,项目驱动。以项目驱动教学法,从真实项目出发,激发学生的学习兴趣,以兴趣为导向,帮助学生掌握项目开发流程和项目的运行原理,提高项目的运行效率。
第三,注重实战。让学生不断的在解决项目问题中得到提高和升华,总结出优秀算法,培养独立开发和解决问题的能力。
算法与数据包含两部分,具体内容如下:
第一部分:算法 。本部分常见算法有:
递归算法。内容主要包含递归思想、递归的作用、递归的实现。
排序算法。内容主要包含Array.prototype.sort(),插入排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,希尔排序等排序算法。
既然说到前端排序,自然首先会想到JavaScript的原生接口Array.prototype.sort.
这个接口自ECMAScript 1st Edition起就存在。
Array.prototype.sort规范
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order). If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
显然,规范并没有限定sort内部实现的排序算法是什么。甚至接口的实现都不需要是稳定排序
在这样的背景下,前端排序这件事其实取决于各家浏览器的具体实现。
插入排序
思想:将一个记录插入到已排序好的有序表中,从而得到一个新的记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
最优复杂度:当输入数组就是排好序的时候,复杂度为0(n)
最差复杂度:当输入数组为倒序时,复杂度为0(n^2)
插入排序比较适合用于“少量元素的数组”
冒泡排序
思想:通过两两交换,像水中的泡泡一样,小的先冒出来,大的后冒出来。
最坏运行时间:0(n^2)
最佳运行时间:0(n^2)
选择排序
思想:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
最好运行时间:0(n^2)
最坏运行时间:0(n^2)
快速排序
算法步骤:
1 从数列中挑出一个元素,称为 “基准”,
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
3 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置去。
最坏运行时间:当输入数组已排序时,时间0(n^2)
最佳运行时间:0(nlgn)
堆排序
最优时间:0(nlgn)
最差时间:0(nlgn)
思想:运用了最小堆、最大堆这个数据结构,而堆还能用于构建优先队列。
归并排序
思想:运用分治法思想解决排序问题
最坏情况运行时间:0(nlgn)
最佳运行时间:0(nlgn)
分治法:就是将原问题分解为多个独立的子问题,且这些子问题的形式和原问题相似,只是规模上减少了,求解完子问题后合并结果构成原问题的解。
希尔排序
思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
第二部分:数据结构。常见数据结构。
链表:
链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。
存储链表中结点的一级任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
链表中结点的逻辑顺序和物理顺序不一定相同。
为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针或链,这两部分组成了链表中的结点结构。
链表是通过每个结点的指针域将线性表的n个结点按其逻辑次序链接在一起的。
每一个结只包含一个指针域的链表,称为单链表。
栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表。
栈在计算机中的实现有多种方式:
硬堆栈:利用CPU中的某些寄存器组或类似的硬件使用内存的特殊区域来实现。这类堆栈容量有限,但速度很快
软堆栈:这类堆栈主要在内存中实现。堆栈容量可以达到很大。在实现方式上,又有动态方式和静态方式两种。
栈:是限制在表的一端进行插入和删除操作的线性表。又称为后进先出或先进后出线性表。
队列:也是运算受限的线性表。是一种先进先出的线性表。只允许在表的一端进行插入,而在另一端进行删除。
三角函数:
(一) 三角函数的本质是任意角的集合与一个比值的集合的变量之间的映射。
(二) 六种基本函数:正弦、余弦、正切、余切、正割、余割。
(三) 在平面直角坐标系中,从点0引出一条射线0p,设旋转角为θ,p点的坐标为(x,y)有:(斜边c,对边为a,邻边为b)
1. 正弦函数 sinθ = a/c 正弦(sin):角a的对边比斜边
2. 余弦函数 cosθ = b / c 余弦(cos):角a的邻边比斜边
3. 正切函数 tanθ = a / b 正切(tan):角a的对边比邻边
4. 余切函数 cotθ = b / a 余切(cot):角a的邻边比对边
5. 正割函数 secθ = c / b 正割(sec) : 角a的斜边比邻边
6. 余割函数 cscθ = c /a 余割(csc):角a的斜边比对边
勾股定理
直角三角形中,两直边的平方和等于斜边的平方。 即令直角三角形ABC中,其中角C=90°,直边BC的长度为a,AC的长度为b,斜边AB的长度为c,则有a2+b2=c2
实现案例:抛物线运动、圆周运动