01《数据结构入门教程》为什么要学习数据结构

1. 前言

程序员的一天是怎样开启的?

清晨打开储存着各种结构数据的冰箱,从鸡蛋集 “盒” 中提取了一枚数据扔进煎锅,从西兰花树形结构上查找最新鲜的一支跟鸡蛋一起煎熟,从袋装切片面包数组中取出两片,用图形结构的花生酱数据涂抹均匀,撕开新买的养乐多队列 get (0),想要清爽一点可以再从腌黄瓜的栈里 pop () 两片昨天刚放进去的鲜嫩数据。


5ee584580001ff0703060386.jpg

程序员的世界离不开数据结构,毕竟我们的主要工作内容之一就是用逻辑和算法来处理数据,而合理地使用数据结构就像冰箱里使用恰当的容器来包装食物一样重要。

2. 为什么要学习数据结构

数据结构既是各类考试的必考部分,也是各类公司面试题里的常客,但是如果仅仅是为了以上两点来学习数据结构,那就未免顾此失彼了。其实学习数据结构对我们的工作和学习有着很大的帮助,我大概总结出来我个人感受比较深的几个点跟大家分享:

  1. 帮助我们有更多更好的手段来使用数据,特别是了解各种数据结构的原理能够帮助我们在实际开发工作中遇到大数据、高性能、大并发等业务场景时选择正确的处理方式;
  2. 充分发挥计算机的性能,使我们的代码更加高效,在代码优化的过程中可以更明确的在时间维度和空间维度之间做出平衡或选择;
  3. 学习的过程本身又是提升我们思考问题能力的过程,可以提升我们对算法的了解和认识,拓宽设计思路,同时提升对全局问题思考的格局和高度;

3. 数据结构的定义

百度词条对数据结构(data structure)的定义是:

带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。

通俗地讲,就是数据元素是以何种形式在计算机上存储,又是以何种形式被程序员使用,它们之间的关系以及我们可以使用的算法。


5ef774fe093d5f4057604320.jpg

4. 数据结构的分类

数据结构的分类一般有两种维度,一种是根据数据结构的原理从它们的逻辑结构来区分,一种是从数据结构存储时的物理结构来区分。

逻辑结构,是针对数据之间的相互关系而言的,通常可以分为线性结构和非线性结构。线性结构中的数据元素之间存在着一对一的关系,非线性结构中的数据元素之间存在着一对多或者多对多的关系,而数组中的数据元素相互之间没有任何关系,他们只是同一类型数据的集合。

物理结构,是针对数据在存储器中的存储方法而言的,通常可以分为顺序存储链式存储。顺序存储的数据是在一段连续的空间中,靠相对位置来表示元素之间的相互关系,像在一个小教室上课的同班同学靠前后座关系就能建立联系;链式存储的数据内存地址不一定是连续的,每一个节点上都有一个指针存储域,靠指针来建立元素之间的相互关系,像几个班级的同学同时上公选课时分散在一个大教室里,同一个班级的同学之间需要靠学号来建立联系。

5. Java 中常用的数据结构

Java 中常用的数据结构都在 java.util 包下,都是对 Collection 和 Map 两个顶级接口的实现类。这里要注意不是 java.util.Collections,Collections 是一个对集合中元素进行查询、排序等操作的工具类,我们下面还会提到。

5efd7a37090b992009880907.jpg

读源代码是我们最准确高效的学习手段之一,上图就是 java.util.Collection 源代码的截图,注释中红标分别列举了实现该接口的几种数据类型 List、LinkedList、ArrayList、Vector、Set、SortedSet、HashSet、TreeSet、AbstractCollection,蓝标是 Map 接口和实现该接口的 SortedMap,此外实现 Map 接口的还有 HashMap、TreeMap、Hashtable、SortedMap。另外还有 Collections、Arrays 两个工具类。从源代码中我们可以梳理出各种数据类型之间的关系,如下图:

5ee5860700014c8608600780.png
5ee586350001f2b308530517.png

6. 常用的算法

算法是我们处理数据结构的具体实现步骤,一个好的算法评价标准是效率足够高、存储足够低。我们可以简单地分成增、删、改、查,外加排序五类,排序又可以分为插入排序,交换排序、选择排序、归并排序、分配排序等,而具体实现根据结构和算法的不同,执行的效率也会不同。

好在我们有很多现成的工具可以用可以使我们不必从零开始设计一个健壮、高效、可读性好的优秀的算法。这时候我们可以祭出一个利器 ——java.util.Collections,它实现了对于数据结构的各种静态多态方法来对集合实现搜索、排序、线程安全化等等操作。我们可以从源代码或者官方 API 中了解它都提供了哪些方法。

7. 小结

本节我们简要介绍了数据结构的定义、分类及其算法。大家可以把数据结构理解成我们封装数据的容器,而算法就像是我们对容器中的物品进行查看、添加、使用和整理的思路及方法。本节的内容更多的是需要大家了解和熟悉,后面我们会结合 Java 源码来介绍各类数据结构的特点和用法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容