数学篇 - 数据结构丶编程语句丶基础算法与数学的关系(笔记)
看到很多人说,数据结构,算法不能算作数学.
不同的数据结构,都是在编程中运用数学思维的产物。 每种数据结构都有自身的特点,有利于我们更方便地实现某种特定的数学模型.
数据结构
别小看这些数据结构,它们其实就是一个个解决问题的“模型”
数组 (Array)
特点: 可以通过下标,直接定位到所需的数据,适合随机访问.常常和循环语句相结合,来实现迭代法,例如二分查找、斐波那契数列等等
缺点: 数组只对稠密的数列更有效。如果数列非常稀疏,那么很多数组的元素就是无效值,浪费了存储空间。此外,数组中元素的插入和删除也比较麻烦,需要进行数据的批量移动。
如何解决稀疏数列问题: 链表
链表 (Linked List)
链表中的结点存储了数据,而链表结点之间的相连关系,在 JavaScript
语言中是通过对象引用来实现的。
特点: 不能通过下标来直接访问数据,而是必须按照存储的结构逐个读取
优势: 不必事先规定数据的数量,也不再需要保存无效的值,表示稀疏的数列时可以更有效的利用存储空间,同时也利于数据的动态插入和删除
缺点: 于数组而言,链表无法支持快速地随机访问,进行读写操作时就更耗时
哈希表 (Hash)
哈希表就可以通过数组和链表来构造,之前我们通过余数
来实现哈希表.
优势:如果关键字已知则存取速度极快,插入块
缺点:删除慢,如果不知道关键则存取很慢,对存储空间使用不充分,会出现哈希冲突
树 (Tree)
优点:查找,插入,删除都快,树总是平衡的。类似的树对磁盘存储有用,不会出现哈希冲突
缺点:算法复杂
图(Graph)
图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系
栈 ( Stack)
先进后出的。在我们进行函数递归的时候,函数调用和返回的顺序,也是先进后出,所以,栈体现了递归的思想,可以实现基于递归的编程
队列 (Queue)
先进先出的数据结构,先进入队列的元素会优先得到处理.
在消息队列中,实现了生产者和消费者的松耦合,对消费者起到了保护作用,使它不容易被数据洪流冲垮。
编程语句
布尔表达式
体现了逻辑代数中逻辑和集合的概念
if(表达式) {函数体1} else {函数体2} // 若表达式为真,执行函数体1,否则执行函数体2。
循环语句
循环语句是迭代法(Newton's method)
的体现
函数的调用
可以调用自己,也可以调用其他不同的函数。如果不断地调用自己,这就体现了递归
的思想。
SQL 语言中的 Join 操作
Join 有多种类型,每种类型其实都对应了一种集合的操作
。
基础算法
算法复杂度分析
四则运算
、主次分明
、齐头并进
、排列组合
、一图千言
和时空互换
。
这些法则体现了数学中的运算优先级
、数量级
、多元变量
、图论
等思想
总结
在平时学习编程的时候,你可以多从数学的角度出发,思考其背后的数学模型。
这样不仅有利于你对现有知识的融会贯通,还可以帮助你优化数据结构和算法