1-玩转数据结构-欢迎学习数据结构

欢迎大家学习新课程: 玩转数据结构

  • 为什么要学习数据结构?

数据结构是所有计算机专业的同学必学的课程

  • 数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。

为了在不同场景下高效获取或修改。我们就发明了不同的数据结构。

整体而言,数据结构可以分为三种:

线性结构; 树结构; 图结构;

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。

app开发的门槛越来越低了。

mark

以为开发者提供便利为荣,年龄最小开发者,最年长的开发者。

只是使用工具来开发,技术上是越来越简单的。

mark

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

mark

mark

搭建在底层基础上的框架环境等,开发这些工具时就需要使用大量的数据结构和算法。越大的公司,越需要同学们拥有扎实的数据结构(和算法)功底

大公司也有业务逻辑组装成产品的工具,更重要是做出更先进更底层的开发。

当产品庞大,用户量大,数据结构和算法就派上用场了,算法与数据结构可以提高你的上限,走的更远。

计算机技术增长,成为技术专家必须学习数据结构。

本课程和《算法与数据结构》 的区别

玩转数据结构: 以数据结构为主线,大多数都是另一门课里不涉及的。

mark

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

mark

算法与数据结构课程涉及排序算法,图算法。语言的选择上有很大区别,上一门课使用了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。直接下滑到尾页。

mark

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

mark

点击JDK Download,会进入下载页面。包含java的两个版本。

点击同意条款,相应的下载完,安装就是下一步下一步。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏take time, save time

初级程序员面试不靠谱指南(一)

    “来到这英雄宴中的人物,就算本身武功不是甚高,见识也必广博,“太祖拳法”的精要所在,可说无人不知。乔峰一招打出,人人都是情不自禁的喝了一声采!这满堂大采...

3479
来自专栏编程

器—术—道:程序设计教材建设经验谈

《计算机教育》2017年第11期 封面文章 引 言 程序设计的境界有3种:器—术—道。在程序设计能力培养方面,一般由“器”入门,通过熟悉“术”,最终达到“道”的...

1989
来自专栏撸码那些事

【抽象那些事】缺失抽象

1373
来自专栏java思维导图

java基础思维导图,让java不再难懂

思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的...

5296
来自专栏码农分享

工厂模式(Factory)

简单工厂和工厂方法这俩个设计模式不做详细介绍,请各位看官自行百度,有大量的解释。再次我简单引用一下其他博客主对这三种模式的理解。

761
来自专栏编舟记

我是怎样学习新编程语言的

学习新的编程语言的最终目的是解决实际问题。掌握编程语言的过程,在某种程度上近似学习一种新的工程实践。不仅解决问题固然可乐,学习的过程也同样充满了新鲜感,不过需要...

1133
来自专栏编程

Java语言零基础菜鸟入门Java程序学习的要点

一、掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在...

2080
来自专栏腾讯Bugly的专栏

iOS内存管理:从MRC到ARC实践

对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管...

3545
来自专栏程序人生 阅读快乐

[现代编译原理C语言描述].(美国)Andrew.W.Appel.清晰版

《现代编译原理:C语言描述》全面讲述了现代编译器的结构、编译算法和实现方法,是Andrew w.Apple的“虎书”——Modern Compiler Impl...

882
来自专栏玄魂工作室

Python黑帽编程 2.0 第二章概述

于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一...

3637

扫码关注云+社区