数据结构-为什么要学习数据结构

本文为「数据结构」系列第一篇,会说明为什么要学习数据结构;数据结构的用处;数据结构的分类;如何学习数据结构等问题,先对数据结构有个全面的认识,相信带着问题来学习它会达到事半功倍的效果。

1、为什么要学习数据结构?

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

其中数据结构的分类主要包括如下:

  1. 线性结构
    • 数组;栈;
    • 队列;链表;
    • 哈希表…
  2. 树结构
    • 二叉树,二分搜索树;
    • AVL;红黑树;Treap;Splay;
    • 堆;Trie;线段树;K-D树;
    • 并查集;哈夫曼树;…
  3. 图结构
    • 邻接矩阵;
    • 邻接表

我们在软件开发过程中,需要根据应用的不同,灵活选择最合适的数据结构,来解决现实问题。

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种数据结构:

  1. 数组
  2. 队列
  3. 链表-单链表 & 双链表
  4. 二分搜索树
  5. 线段树
  6. Trie
  7. 并查集
  8. AVL
  9. 红黑树
  10. 哈希表

本次学习不包含图结构,因为图论领域以算法为主。

3.2 学习思路

  • 面向基础:递归;调试;简单的复杂度分析;

  • 手把手的底层实现,创建属于自己的小型数据结构库

  • 强调比较和优化

3.3 内容分类

学习的代码都是基于 LeetCodeLeetCode 中文

ps: 关于 LeetCode 的使用,后面会单独拿一篇文章来讲解怎样高效使用 LeetCode,敬请关注~

  1. 面向面试

数组、栈、队列、链表、二分搜索树、堆

  1. 面向竞赛

线段树、Trie、并查集

  1. 其他
  • 平衡二叉树:

AVL、红黑树

  • 常用数据存储结构:

哈希表-冲突检测,就会产生很多和性能有关的问题

这三种数据结构在面试中更多的是概念性能分析问题,不会要求底层实现。

建议

学习数据结构时,不要钻牛角尖,更不要死记硬背,请谨记以下几点建议。

  • 不要完美主义,掌握好「度」
  • 学习本着自己的目标去
  • 了解各个数据结构的底层实现原理

参考

都看到这了,不打赏下?您的支持将鼓励我继续创作!:)