# 第三部分:数据结构
> 原文:[Part III: Data Structures](https://learncodethehardway.org/more-python-book/part2.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
你正在以你的方式构建个人流程,它让你以有限的阻碍快速起步。拥有良好的起步流程,以及培养一种尽管去做的能力,就是创造力的基础。创造力是一种流动性和放松的心态。如果你的起步充满阻碍和沮丧,那么很难进入这个流程。学习“点击”你的大脑,使其进入具有创造力的、松散的 Hack 模式,可以帮助你使用创造力解决问题,并提高生产力。
如果你做的是垃圾,那就没有意义了。首先,是的,显然,你所做的绝大多数都是垃圾,但你不想在你的余生中制造糟糕的软件。你需要平衡创造性的黑客心态和严谨的质量心态。我提倡人们在创造性表达和批判性思维模式之间切换。通过放松和创造力,你想出你的想法并实现它,然后通过批评自己的工作来使他们可靠和品质高。
在第二部分中,当你跟踪 45 分钟内实现的功能数,并寻找可以改进你的启动流程的地方时,实际上就做到了它。但是,由于批判性思维模式是创造力的杀手,因此你无法同时 Hack 和分析你的流程。这个建议几乎涵盖了我所知道的每一个创造性规律,并帮助你在工作时不使用自己的方式。
> 注
> 创造过程中的批评会扼杀你的想象力。没有批评的创造只会产生垃圾。你需要这两个,但不是同时。
在第三部分中,你将切换到专注于质量和开发个人流程,从而提高你的质量。为了使其变得简单,我只会将质量定义为:
> 低缺陷率和可理解的代码。
大多数程序员在这两个方面绝对是糟糕的。绝大多数开发人员认为,当编译完成时,他们的工作就完成了,就是这样。他们运行了测试套件,所以就完成了!我称这个“程序员风格的完成”,其中它们对自己的作品没有自我批评的评价,因为他们完全相信他们的电脑来找出所有的缺陷。他们似乎从来不在乎,别人是否可以理解他们的代码,只关注它是否运行良好来满足最低限度。如果你曾问过他们每天的缺陷率,他们会瞪着你,说这并不重要。代码覆盖?呸。他们的测试套件有 10 万行代码!它肯定测试了一切东西!
为了成为一名更好的程序员,你必须开始开始做一些残酷的事情,观察自己的质量指标和实践。我说这项工作是残酷的,因为它清晰并明确地展示出你是多么糟糕,对于那些开心地认为他们很棒的人来说,这可能是个悲剧。那些具有骗子综合症的人,会发现这种质量分析令人耳目一新,因为它会给你一个合理的想法,你的工作有多好,以及一个改进计划。
## 通过数据结构测试质量
数据结构是一个简单的概念。你的计算机拥有内存和放入内存的数据。你可以随意填充它,也可以提供一种使数据更容易处理的结构。自从“计算机科学”开始以来,人们一直在分析如何为不同目的构建数据,然后这些结构有多好。由于数据结构定义好了,我们可以使用它们来研究你的质量实践。你将实现每个数据结构并进行测试,然后通过两个步骤来确定实现的质量。
你进行数据结构练习的流程如下:
+ 每个练习都将描述数据结构,以及你可以做什么。这个描述是中文,图表和示例代码。我将给出一个没有代码的结构的完整描述,因为你需要实现它,并使其正确。
+ 你可能还需要一套必须通过的测试,但是这些测试也可能用文本写成,因此你还将编写自动测试。
+ 你将在 45 分钟内持续进行训练来做一些东西,然后休息一阵子,但你可以在每次实现中花费更多时间。我建议你做一些简单的黑魔法,然后“认真起来”,并在更多的时间段中优化你的实现。
+ 当你相信你“完成”时,你会切换到批评模式,并开始了解你的实际情况。你将遵循一个审计流程,让你仔细阅读你的代码,并查找错误,跟踪你的代码。
+ 最后,你将修复在审计阶段发现的缺陷,并继续处理这个练习,直到完成。
这就是相关的流程,所以这部分的前两个练习(练习 13 和 14)将由我完成,现场制作,所有的缺陷都是我做的,所有的代码都是我写的。你可以在视频中看到这个流程的工作原理,并在练习中阅读我的代码,以便你了解预期的东西。我会遵循我上面所述的严格流程,尽可能接近,所以你需要仔细观看视频。
## 如何学习数据结构
有一种正式的数学方法,用于研究算法和数据结构,但我不会设计过多背后的理论。如果你对这个微小的简介感兴趣,那么你可以阅读几本这个主题的书,并花几年研究这个计算机科学分支。在这本书中,我将向你提供练习,以便你学习如何从记忆中实现它们,并了解它们的工作原理。你不需要正式的证明,只需要简单的 Python 代码和反复尝试。
通过这些练习,我希望你遵循一种具体的方式来研究它们,以便你可以从记忆中实现它们。当我学习音乐,和尝试画出我看到的东西时,我使用这个相同的流程。它适用于任何东西,其中你需要记住一个概念,但也可以通过创造力应用于不同的情况,所以你不能只是记住它。相反,你执行我所说的“记忆,尝试,检查”:
+ 构建一切信息和材料,它描述你必须记住的所有事情。尽你所能来记忆并记住它,即使它只是信息的一小部分。
+ 把所有的信息拿走,所以你看不到它。我喜欢把它放在不同的房间,所以如果我需要再次查找,我必须离开我的作品。
+ 尝试从记忆中创建所需的东西。尝试放下任何东西,无论是对的或错的。
+ 当你用尽了你记住的东西后,把你所做的一切拿过来,然后返回你的信息并进行比较。标记所有你做错了的东西,然后再试一次。
+ 使用你的错误列表,专注于记忆,以便你在下次尝试时更正错误,并重新做一遍。
我喜欢进行 2~15 分钟的记忆,然后进行 10~45 分钟的尝试,但你会知道你什么时候用完所有知识,需要去获得更多。我将给出一个具体的例子,解释我如何根据我的记忆来画画:
+ 我要画一朵花,所以我把花放在我房子的一个房间里,我的画在另一个房间里。
+ 我坐在花的房间里,盯着花。我画出那朵花。我用手指跟踪它,试着在我的脑海里想象它。我想象自己画每个花瓣,茎,和一切东西。我记得比例。我甚至可以使用笔记记录颜色,并尝试在花的房间中混合颜色。
+ 我把所有东西都放在花的房间里。我很快回到画室,试着唤醒花的记忆,找出下一步要画的东西。也许叶子是我最终熟悉的东西。我画出它。也许现在花盆很清楚,我画了一些。我继续闭上眼睛,试图想起图像,然后尝试画出来。
+ 当我被卡住或者我用完时间的时候,我站起来,把我的小画板带入花的房子,并将其与我看到的比较。然后我会记录我的错误。一只花瓣太长吗?花盆的角度错了吗?土壤太暗了吗?我记下笔记,弄清楚我错了什么。
+ 然后我把画带回画室,并回到花的房间,在下一个回合中,用这个错误列表继续从记忆中学习。
我从这个流程中画出的画,通常相当奇怪,但接近于原件,这取决于我用了多少回合,而且我多长时间练习一次。最终这帮助我变得更好,并快速捕捉到我看到的东西,因为我可以在我的记忆中将更多的视觉信息保存更长时间。
当你进行这些算法练习时,你可以使用相同的流程,来发展你在面试中根据需要回忆它们的能力。你应该首先坐下来,使用你可以使用的所有信息来实现它们,并了解它们的工作原理。记住你不明白的东西很难记住。你有一个好的实现后,你可以开始训练你的记忆。
+ 将所有书籍,笔记,图表和关于该算法的信息放在一个房间中,将计算机放在另一个房间中。如果需要,打印出你的代码。
+ 花费 15 分钟的时间来学习算法房间中的信息,记下笔记,绘制更多的图表,可视化数据的流动方式,并且做任何其他可以想到的事情来学习。
+ 将所有信息留在算法房间,走进笔记本电脑的房间,坐下来尝试从记忆中实现它们。在检查你的作品之前,不要花费超过 45 分钟。
+ 带着你的笔记本电脑进入算法房间,并记录你的错误。
+ 把你的笔记本电脑放回去,然后再回到算法房间,再进行一遍记忆和学习。专注于所有你做错了的事情,这将使它更容易。
最初的几次中,这样做会令人沮丧,但很快,你会发现它变得更加容易,而且在许多情况下,你可以冥想来使其生效。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb