欢迎大家学习新课程: 玩转数据结构
- 为什么要学习数据结构?
数据结构是所有计算机专业的同学必学的课程
- 数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。
为了在不同场景下高效获取或修改。我们就发明了不同的数据结构。
整体而言,数据结构可以分为三种:
线性结构; 树结构; 图结构;

本节课带领大家从零开始深入数据结构。学完课程对于大多数的名词都有认识,以及从底层实现出来。
对于数据的存储这个任务,解决方案是很多的。我们需要根据应用的不同,灵活选择最合适的数据结构
在计算机的世界中,数据结构无处不在。

通常我们使用数据库,数据库是一个封装好的软件,我们只需要通过sql语句进行访问。

我们创建一个数据库,底层需要数据结构。

没有这些树和哈希表的知识,我们是无法创建出数据库软件的。
操作系统: 快速在多任务间切换

递归调用使用系统栈来实现。优先队列进行任务切换。
文件压缩:
各种各样的格式,png mp3等都是进行了一定程度的压缩,形成了格式。

最简单常用的压缩方式就是哈夫曼树。现代的压缩算法需要更先进的数据结构
通讯录: 设置通讯录软件,存储不同的联系人,使用链表进行实现。
当联系人变多之后,查找一个联系人变成了一个很慢的操作。手持设备本身就效率低下。被一个实习生解决,使用了一种叫做Trie - 前缀树
的数据结构

不管通讯录中有多少人,这个查找联系人操作都变成了毫秒级别的。
大量的算法,以数据结构为基石。
游戏设置大量的算法,寻路算法,最短路径。
图论算法: DFS(深度优先遍历) 使用栈, BFS(广度优先遍历) 使用队列; 几乎所有的算法都要以数据结构为基石。
数据结构 + 算法 = 程序
几乎任何一本算法教材,都包含大量的篇幅讲解数据结构
课程设置
针对数据结构零基础的同学,需要掌握java语言基础(课程使用)
数据结构不应该局限于特定的语言。
java: 推广度高,大多数同学都会。 java是一门完全面向对象的语言。
这种面向对象的特性,非常适合我们进行数据结构的研究。
对于数据结构中我们要实现的大多数内容都是一个名词,链表,队列,栈,二叉树,哈希表都是一个名词,在这个名词上赋予不同的操作,这样的设计思路非常符合面向对象的设计原则。
不仅仅会收获数据结构知识,对于面向对象的设计,java语言中对于面向对象设计相应的语言支持特性理解深入。
鼓励同学们使用其他语言实现这个课程的代码。 只要你所选择的语言,支持面向对象的范式的语言,C++ PHP swift python等
这样做的同学会有双份的收获。数据结构+语言
课程中主要涉及到12种数据结构

课程对于每种数据结构不仅仅是简单实现而已,很多时候一种数据结构是有多种实现的,会对多种不同的实现进行比较。
链表: 单链表,双链表; 哈希表: 两种不同实现; 并查集: 一步一步的优化,完成好几个版本
递归与非递归的算法实现
本课程不包含图结构,图论领域以算法为主
对于图结构而言,本身存储一个图是非常简单的,简单线性表就可以。
图论领域庞大,算法为主。如 计算最小生成树,计算最短路径,计算最大联通分量等都是要有算法支撑的。
起步的时候讲解的都是非常基础的数据结构。

面向基础: 什么是递归;调试; 简单的复杂度分析(包含均摊复杂度分析), 所有数据结构,手把手的底层实现,创建属于自己的小型数据结构库。
数据结构 + 编程水平 + 自己拓展; 数据结构背后思考: 强调比较和优化
- 面向面试的数据结构:

前六个都是非常基础的数据结构, 同时也是笔试面试中的常客,这六个里面的操作,算法逻辑,要能达到白板编程(手写代码)。
- 面向竞赛的数据结构: 线段树,Trie,并查集
数据结构领域的灵活性,只是处理对象发生了变化,就可以设计出新的更优秀的数据结构。
面试和竞赛,不止会讲底层实现,会讲面试和竞赛真正的使用这些数据结构来解决的问题(LeetCode获取的问题)。

最后三章: AVL 红黑树 哈希表
前两个都是平衡二叉树的实现,哈希表也是一种非常常用的数据存储的结构,相对而言复杂,代码量大。
一般这三个面试时会提问一些概念性的或者性能分析上的问题。红黑树虽然是个平衡二叉树,但不是完全平衡二叉树,哈希表的冲突检测相关,性能分析。
课程从零开始搭建三种数据结构,并且分析蕴含在这三种数据结构中的问题。(大多时候调用标准库)
希望同学们通过这门课真正玩转数据结构
学习数据结构(和算法) 到底有没有用?
这门课(玩转数据结构) 和 那门算法与数据结构的区别下节谈。
大多数同学疑惑: 为什么我觉得数据结构没有用?
- 学习数据结构有什么用?
为什么我在工作中,用不到数据结构(和算法)?在工作中用不到数据机构 (和算法), 所以它们没用?数据结构(和算法) 主要是为了应付面试或者考试用?
答案:也对,也不对。
软件开发过程越来越简单。

这些操作系统,软件包等里面包含大量的数据结构的应用,但是我作为一个ios开发者可以对这些一无所知,只需要使用工具以及提供的api开发出一个app。
app开发的门槛越来越低了。

以为开发者提供便利为荣,年龄最小开发者,最年长的开发者。
只是使用工具来开发,技术上是越来越简单的。

开发越来越简单以后,计算机专业的同学们关注的应该是这些底层的东西。


搭建在底层基础上的框架环境等,开发这些工具时就需要使用大量的数据结构和算法。越大的公司,越需要同学们拥有扎实的数据结构(和算法)功底
大公司也有业务逻辑组装成产品的工具,更重要是做出更先进更底层的开发。
当产品庞大,用户量大,数据结构和算法就派上用场了,算法与数据结构可以提高你的上限,走的更远。
计算机技术增长,成为技术专家必须学习数据结构。
本课程和《算法与数据结构》 的区别
玩转数据结构: 以数据结构为主线,大多数都是另一门课里不涉及的。

只有二分搜索树,并查集,堆 这三个在算法和数据结构中讲过,内容重叠低。

算法与数据结构课程涉及排序算法,图算法。语言的选择上有很大区别,上一门课使用了C++语言,提供了java代码。
这门课: 选择java 完全面向对象,但更鼓励同学们使用自己熟悉的语言完成课程内容
脚本语言的特殊性: 如js Python等
个人认为: 脚本语言可以用来学习数据结构的原理,但是不适用于考察数据结构(和算法)的性能; 性能怎样,取决于解析器对于不同写法的解析。
Pythonic的写法可能比逻辑本身更重要
arr = []
for i in range(10):
arr.append(i)
arr = [i for i in range(10)] // 列表生成式写法
两种写法性能的差异,下面写法性能大大优于上面的写法; 脚本语言不仅仅需要关注实现的具体逻辑,还要关注完成这个逻辑使用的语法。
C++,java等也有类似问题,但不明显,近乎可以忽略; LeetCode: C++ java可以通过,python会可能遭到超时。
课程官方github
https://github.com/liuyubobobo/Play-with-Data-Structures
逐渐添加多语言支持,以及更多习题。
关于答疑:
问答区老师进行了详细的回答。
- 请不要直接贴代码,问: 这个代码为什么输出结果不对?
建议: 仔细的debug。debug是软件工程师的必备技能。(小数据用例)和课程源码进行对比。逐个模块进行对比,替换。
- 好的问题: 详细说明,具体在哪个地方出了问题?你的思考是怎样的?认为会得到怎样的结果?可实际得到了怎样的输出?(问题包含了思考)
课程面向面试,但数据结构只是面试的一部分,甚至只是算法面试的一部分。算法面试不仅有数据结构,还有很多和基础算法相关的内容,排序算法,二分搜索算法,算法设计方面:回溯,动态规划,贪心算法等等。
玩转算法面试偏向于使用具体的数据结构解决算法问题,算法面试会直接使用Hashmap类来解决具体问题; 玩转数据结构注重于数据结构的底层实现。
关于竞赛
竞赛涵盖的内容更广泛,深度也更高; 图论; 计算几何; 组合数学; 概率; 更复杂的算法和数据结构
相信这个课程,是你真正掌握数据结构的开始
课程编程环境搭建简介
Java语言(Java8)
其实课程代码本身对java语言版本并没有太多要求,Java10也是可以的。
官方下载:
oracle官网可以下载,下载JDK。直接下滑到尾页。

点进去默认显示的java10, 一直往下拖,下面就是历史版本。

点击JDK Download,会进入下载页面。包含java的两个版本。
点击同意条款,相应的下载完,安装就是下一步下一步。
IDE: IntelliJ IDEA(官网下载) 社区版就够用。
此处推荐慕课网免费课: IntelliJ IDEA神器使用技巧,下一节我们会先介绍IDEA技巧学习。
网友评论