本文为「数据结构」系列第一篇,会说明为什么要学习数据结构;数据结构的用处;数据结构的分类;如何学习数据结构等问题,先对数据结构有个全面的认识,相信带着问题来学习它会达到事半功倍的效果。
1、为什么要学习数据结构?
数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。
其中数据结构的分类主要包括如下:
- 线性结构
- 数组;栈;
- 队列;链表;
- 哈希表…
- 树结构
- 二叉树,二分搜索树;
- AVL;红黑树;Treap;Splay;
- 堆;Trie;线段树;K-D树;
- 并查集;哈夫曼树;…
- 图结构
- 邻接矩阵;
- 邻接表
我们在软件开发过程中,需要根据应用的不同,灵活选择最合适的数据结构,来解决现实问题。
2、在计算机的世界里,数据结构无处不在
数据结构在计算机的世界里,扮演着很重要的角色,应用在很多日常应用系统中,以下列举了一些数据结构应用的例子及其使用到的数据结构。
2.1 数据库
树结构:
AVL;红黑树;Treap;
伸展树;B树;
哈希表
2.2 操作系统
快速在多任务间切换
系统栈
优先队列:堆
2.3 文件压缩
对文件进行压缩,形成了像 RAR、MP3、PDF、PNG、MP4 等这种专门文件格式。
在进行压缩时,也需要借助数据结构:
哈夫曼树(比较简单文件压缩)
2.4 通讯录 CONTACTS
很早以前,智能手机还没有普及,微软有一款产品,是给 pda(personal digital assistant) 个人数字助理系统,有个通讯录的概念,
方案一:链表,查找一个人很慢,计算性能很慢
方案二:Trie-前缀树,查找联系人在毫秒级别,很快!
2.5 大量的算法,以数据结构为基石
寻路算法
A -> B 点路径
图论算法:
深度优先算法 DFS:使用栈
广度优先算法 BFS:使用队列
2.6 数据结构 + 算法 = 程序
程序的具体实现完全靠数据结构和算法,日常生活中的,一个个问题都需要建模,建立数据结构,具体执行的策略,那就要靠算法了。如果再加上设计模式,就为了让代码实现起来更优雅。
问题 —> 数据结构+算法 == 程序 —> 解决问题可以说,只要你用程序来解决现实中的问题,数据结构算法一天都不会过时。
3、学习内容
数据结构不应该局限于某门语言,除了使用 Java 语言完成,也可以使用其他语言来实现数据结构代码。当然支持面向对象的语言最好。
3.1 12 种数据结构
主要包括如下 12种数据结构:
- 数组
- 栈
- 队列
- 链表-单链表 & 双链表
- 二分搜索树
- 堆
- 线段树
- Trie
- 并查集
- AVL
- 红黑树
- 哈希表
本次学习不包含图结构,因为图论领域以算法为主。
3.2 学习思路
面向基础:递归;调试;简单的复杂度分析;
手把手的底层实现,创建属于自己的小型数据结构库
强调比较和优化
3.3 内容分类
学习的代码都是基于 LeetCode和LeetCode 中文。
ps: 关于 LeetCode 的使用,后面会单独拿一篇文章来讲解怎样高效使用 LeetCode,敬请关注~
- 面向面试
数组、栈、队列、链表、二分搜索树、堆
- 面向竞赛
线段树、Trie、并查集
- 其他
- 平衡二叉树:
AVL、红黑树
- 常用数据存储结构:
哈希表-冲突检测,就会产生很多和性能有关的问题
这三种数据结构在面试中更多的是概念和性能分析问题,不会要求底层实现。
建议
学习数据结构时,不要钻牛角尖,更不要死记硬背,请谨记以下几点建议。
- 不要完美主义,掌握好「度」
- 学习本着自己的目标去
- 了解各个数据结构的底层实现原理