不废话,先上本文思维导图:


数据结构是什么?

数据结构(Data Strcture),是计算机中存储、组织数据的方式,目的是使得数据能被更高效的使用

数据结构从逻辑上将数据进行有效的组织,使得我们能高效的使用数据、持久化数据、或共享数据,他们提供了一种描述数据元素是如何组织的通用模型。常见的数据结构就有很多种,不同的数据结构都有各自应用的场景。


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

数据结构是众多复杂应用的基石。

数据结构的应用场景很多,下面是一些典型的场景:

●存储数据(数据库)

●资源管理(操作系统)

●数据交换(TCP/IP)

●排序(如二叉树)

●索引(B树在数据库中的使用)

●搜索

●伸缩性(大型数据应用使用数据结构来在分布式节点之间分配和管理数据存储,提高伸缩性和性能。如Spark使用数据结构映射底层数据的结构来简化查询)


数据结构的分类

数据结构经常根据其特性来进行分类:

线性/非线性。是指数据是否按照顺序方式组织。如数组是以顺序方式组织,而图则不是。

同构/异构。是指数据的类型是否相同。

静态/动态。静态的是指在编译的时候就有了固定的大小、结构和内存。动态的是指在使用过程中会这些信息会变化。

数据结构是算法和程序的基石,而数据类型则是数据结构的基石。

下图展示了数据类型和数据结构的关系:


典型数据结构

(1)数组。内存上相邻存放,各数据元素的数据类型均相同。

(2)。以操作的顺序线性存放,顺序可以是LIFO(后进先出)、FIFO(先进先出)。

(3)队列。和栈类似,但是顺序只能是FIFO。

(4)链表。数据之间通过指针相连。

(5)。以分层的方式组织数据,每个节点包含数值、与父节点和子节点相连。

二叉搜索树:

(6)。基于树的数据结构,其父节点的值要么比孩子节点全部小,要么比孩子节点的值全部大。

如下图是一个小根堆:

(7)。非线性的方式组织数据,包含点和边。

(8)Trie:前缀树或字典树。是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。

(9)hash table。哈希表以键值的方式来存储元素,也就是说每个数据都是以键值(key,value)的方式存储的,关键字(key)是不可重复的,而值是对应于键的。我们可以把哈希表简单理解为一本字典,每个键(key)是一个单词,而每个单词都有自己对应的解释,也就是值(value)。


如何学好数据结构?

个人认为较好的数据结构学习路线是如下几个阶段:

  • 入门。目的在于了解有哪些数据结构?分别是什么?
  • 编程实现。动手编程实现它,理解它对数据的组织,各种操作,时间复杂度和空间复杂度分析。
  • 实际应用

第一阶段:入门

入门首先要选择一本合适的书籍。我本人不推荐上来就读大块头的书籍,这样很容易打击初学者的自信心。

这里推荐一本《大话数据结构》,作者以幽默风趣的风格来讲述数据结构和算法,相对而言不会很枯燥非常适合入门。

书中给出了很多图表、动效课件以及非常多的代码实现,非常利于理解。

如下图是描述栈的操作的示意图:

除了看书,配套看看视频课程会更有体感,入门的话这里推荐浙江大学陈越&何钦民教授的《数据结构》课程:

https://www.icourse163.org/course/zju-93001

这门课的习题可能还是有点难度的,大家可以先听课程,掌握各种数据结构的基础知识,习题可以放在第二阶段来做。

第二阶段:进阶&编程实现

入门之后,就可以进入进阶学习阶段了,在这个阶段,我们需要掌握每种数据结构的数据组织原理、各项操作、以及能够动手编程实现、并分析其时间复杂度和空间复杂度

关于书籍,这里推荐《算法》,豆瓣评分9.4分,Amazon评分4.7星。

这本书的知识面全,给出了大量图解、有配套网址和课程、习题以及详尽的解答。

在我上大学本科学习数据结构的时候,为了方便理解数据结构的原理、各种操作的实现,只能用笔在纸上画,非常不方便

后面发现居然有如此好用的数据结构可视化工具,只能用相见恨晚来形容。

这里为大家挑选了2个非常好用的可视化网站,在这里大家能够很直观的观察数据结构的演变、各项操作的实现,加深理解。

(1)visualgo:https://visualgo.net/zh

(2)Data Structure Visualizations:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

第三阶段:实际应用

①如何选择使用什么数据结构?

除了掌握对数据结构的使用,如何在不同应用场景下选择合适的数据结构更加重要,在做选择时我们通用要考虑如下因素:

●我们要存储什么信息?

●信息如何被使用?需要支持哪些操作

●数据如何被持久化/保存?计算复杂度是什么样的?

②实战平台推荐

那么,如何通过实践来应用数据结构呢?

(1)公开课习题

比较推荐的是《算法》的coursera公开课:

https://www.coursera.org/learn/algorithms-part1

(2)leetcode

https://leetcode-cn.com/

leetcode上面提供了非常多的习题,还有网友总结的思路。

这里推荐一个专门的数据结构学习计划:

https://leetcode-cn.com/study-plan/data-structures/

(3)剑指offer

汇总了互联网大厂面试常见的考题:

https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/

以上就是学长的全部分享,怎么学数据结构现在应该有头绪了吧!

这样的干货分享大家觉得怎么样,有什么建议或者问题欢迎留言哦~

数据结构学不会?视频+项目+网站大全,还有独家学习方法相关推荐

  1. 国内外Unity视频学习网站大全

    国内: Unity中文课堂:Unity中文课堂 码锋学院:码锋课堂 - 一个专注游戏开发的网站 - Powered By EduSoho 擅码网:擅码网 - 专注于Unity3d游戏开发培训,unit ...

  2. 可以上传视频的网站大全

    2019独角兽企业重金招聘Python工程师标准>>> 秦皇岛宝贝家族儿童 http://www.qhdbaby.net 秦皇岛王的宫殿婚纱 http://www.qhdwdgd.c ...

  3. 数据结构和算法练习网站_视频和练习介绍了10种常见数据结构

    数据结构和算法练习网站 "Bad programmers worry about the code. Good programmers worry about data structures ...

  4. python常用代码大全-Python 网络爬虫实战项目代码大全

    原标题:Python 网络爬虫实战项目代码大全 DouBanSpider 豆瓣读书的爬虫.你可以爬豆瓣读书下面标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价 ...

  5. 零基础新手自学Python编程教程入门精通学习资料网站大全

    零基础新手自学Python编程教程入门精通学习资料网站大全 今天说下关于Python的一些普及知识,以及学习资料,这一节我来跟大家分享下. 1 为什么要学习Python? 1 Python是一个脚本语 ...

  6. ie退出全屏快捷键_视频剪辑快捷键大全

    现在很多小伙伴日常生活中都会使用到喵影工厂来剪辑视频,那么在剪辑视频时,经常会用到快捷键来提高我们的剪辑效率,但是很多人不知到喵影工厂的快捷键具体有哪些.这次我将为大家介绍喵影工厂的各种快捷键. 万兴 ...

  7. 读大学的你,还在迷茫吗?快看看这些视频学习网站

    * 前端学习网站请阅读我的 <献给大学生,未来程序猿的前端学习网站>* 1.慕课网 (http://www.imooc.com/) 慕课网是垂直的互联网IT技能免费学习网站.以独家视频教程 ...

  8. dotNET 相关网站大全

    <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.sele ...

  9. 计算机毕业设计Javavue学习视频课程网站(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Javavue学习视频课程网站(源码+系统+mysql数据库+lw文档) 计算机毕业设计Javavue学习视频课程网站(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构 ...

最新文章

  1. JAVAEclipse:could not find the main class,program will exit!
  2. AngularJs 取消对 html 字符串标签转义
  3. ubuntu下网页显示乱码的解决方法
  4. Linux服务器网卡驱动安装及故障排除(转)
  5. Windows8 正式版最简单的去除桌面水印方法
  6. 微信二维码支付快速入门
  7. Python的位置参数、默认参数、关键字参数、可变参数之间的区别
  8. linux boost 卸载,Ubuntu下boost库的编译安装步骤及卸载方法详解
  9. 原生JS实现addClass,removeClass,toggleClass
  10. 基于Nexys4 DDR的弹球游戏实现
  11. 习题3.8 符号配对 (20分)
  12. Git和SVN的区别(以后别再问我了)
  13. nods中mysql时间相差8小时
  14. Linux系列: 777 755区别
  15. Drools决策表的使用
  16. Java系列之:查看jar包中源代码
  17. 高通Camera驱动(2)-- openinitialize
  18. Word文字怎么加粗
  19. 怎么清理android的其他文件夹,手机储存里的其他是什么以及应该怎样删除
  20. mailto的用法及attach附件测试结果。

热门文章

  1. Anaconda+Win10安装
  2. linux mmap系统调用
  3. U-GAT-IT整体流程分析
  4. transform再次理解
  5. SinGAN: Learning a Generative Model from a Single Natural Image
  6. 网站颜色变黑白的CSS代码,Chrome、火狐、IE
  7. 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
  8. Anaconda3安装后,解决cmd中jupyter,pip,python不是内部命令以及jupyter更改默认路径问题
  9. MUI侧滑导航:页面组件(本地插件化)
  10. 宝塔 + 百度BCC + centos + vue + 搭建nginx服务器