欢迎大家学习新课程: 玩转数据结构
为什么要学习数据结构?
数据结构是所有计算机专业的同学必学的课程
数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。
为了在不同场景下高效获取或修改。我们就发明了不同的数据结构。
整体而言,数据结构可以分为三种:
线性结构; 树结构; 图结构;
mark
本节课带领大家从零开始深入数据结构。学完课程对于大多数的名词都有认识,以及从底层实现出来。
对于数据的存储这个任务,解决方案是很多的。我们需要根据应用的不同,灵活选择最合适的数据结构
在计算机的世界中,数据结构无处不在。
mark
通常我们使用数据库,数据库是一个封装好的软件,我们只需要通过sql语句进行访问。
mark
我们创建一个数据库,底层需要数据结构。
mark
没有这些树和哈希表的知识,我们是无法创建出数据库软件的。
操作系统: 快速在多任务间切换
mark
递归调用使用系统栈来实现。优先队列进行任务切换。
文件压缩:
各种各样的格式,png mp3等都是进行了一定程度的压缩,形成了格式。
mark
最简单常用的压缩方式就是哈夫曼树。现代的压缩算法需要更先进的数据结构
通讯录: 设置通讯录软件,存储不同的联系人,使用链表进行实现。
当联系人变多之后,查找一个联系人变成了一个很慢的操作。手持设备本身就效率低下。被一个实习生解决,使用了一种叫做Trie - 前缀树
的数据结构
mark
不管通讯录中有多少人,这个查找联系人操作都变成了毫秒级别的。
大量的算法,以数据结构为基石。
游戏设置大量的算法,寻路算法,最短路径。
图论算法: DFS(深度优先遍历) 使用栈, BFS(广度优先遍历) 使用队列; 几乎所有的算法都要以数据结构为基石。
数据结构 + 算法 = 程序
几乎任何一本算法教材,都包含大量的篇幅讲解数据结构
课程设置
针对数据结构零基础的同学,需要掌握java语言基础(课程使用)
数据结构不应该局限于特定的语言。
java: 推广度高,大多数同学都会。 java是一门完全面向对象的语言。
这种面向对象的特性,非常适合我们进行数据结构的研究。
对于数据结构中我们要实现的大多数内容都是一个名词,链表,队列,栈,二叉树,哈希表都是一个名词,在这个名词上赋予不同的操作,这样的设计思路非常符合面向对象的设计原则。
不仅仅会收获数据结构知识,对于面向对象的设计,java语言中对于面向对象设计相应的语言支持特性理解深入。
鼓励同学们使用其他语言实现这个课程的代码。 只要你所选择的语言,支持面向对象的范式的语言,C++ PHP swift python等
这样做的同学会有双份的收获。数据结构+语言
课程中主要涉及到12种数据结构
mark
课程对于每种数据结构不仅仅是简单实现而已,很多时候一种数据结构是有多种实现的,会对多种不同的实现进行比较。
链表: 单链表,双链表; 哈希表: 两种不同实现; 并查集: 一步一步的优化,完成好几个版本
递归与非递归的算法实现
本课程不包含图结构,图论领域以算法为主
对于图结构而言,本身存储一个图是非常简单的,简单线性表就可以。
图论领域庞大,算法为主。如 计算最小生成树,计算最短路径,计算最大联通分量等都是要有算法支撑的。
起步的时候讲解的都是非常基础的数据结构。
mark
面向基础: 什么是递归;调试; 简单的复杂度分析(包含均摊复杂度分析), 所有数据结构,手把手的底层实现,创建属于自己的小型数据结构库。
数据结构 + 编程水平 + 自己拓展; 数据结构背后思考: 强调比较和优化
面向面试的数据结构:
mark
前六个都是非常基础的数据结构, 同时也是笔试面试中的常客,这六个里面的操作,算法逻辑,要能达到白板编程(手写代码)。
面向竞赛的数据结构: 线段树,Trie,并查集
数据结构领域的灵活性,只是处理对象发生了变化,就可以设计出新的更优秀的数据结构。
面试和竞赛,不止会讲底层实现,会讲面试和竞赛真正的使用这些数据结构来解决的问题(LeetCode获取的问题)。
mark
最后三章: AVL 红黑树 哈希表
前两个都是平衡二叉树的实现,哈希表也是一种非常常用的数据存储的结构,相对而言复杂,代码量大。
一般这三个面试时会提问一些概念性的或者性能分析上的问题。红黑树虽然是个平衡二叉树,但不是完全平衡二叉树,哈希表的冲突检测相关,性能分析。
课程从零开始搭建三种数据结构,并且分析蕴含在这三种数据结构中的问题。(大多时候调用标准库)
希望同学们通过这门课真正玩转数据结构
学习数据结构(和算法) 到底有没有用?
这门课(玩转数据结构) 和 那门算法与数据结构的区别下节谈。
大多数同学疑惑: 为什么我觉得数据结构没有用?
学习数据结构有什么用?
为什么我在工作中,用不到数据结构(和算法)?在工作中用不到数据机构 (和算法), 所以它们没用?数据结构(和算法) 主要是为了应付面试或者考试用?
答案:也对,也不对。
软件开发过程越来越简单。
mark
这些操作系统,软件包等里面包含大量的数据结构的应用,但是我作为一个ios开发者可以对这些一无所知,只需要使用工具以及提供的api开发出一个app。
作者:天涯明月笙
链接:https://www.jianshu.com/p/bf9c4efe11ff
行