跳至主要內容
复杂些的数据结构:树和图

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

这时候我们可以启用另一种数据结构:链表——请看下一章。

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQ

方法二:微信:Jiabcdefh


AI悦创原创...大约 1 分钟编程算法同步学编程算法同步学
见缝插针地摆放货物:内存中的链表

1. 链表

虽然链表和数组是两种不同的数据结构,但它们都是被存储在连续的存储空间上的。

如果将两种数据结构中的数据比作“货物”,那么放置它们的“仓库”都是一样的,里面都有一排排标好了固定编号的货架(见下图)。

不过和数组那样一下预定一系列连续的货架,就算不放货物也要占着不给别人用的数据组织方式不同,链表是按需分配的——有货物要存储了,才临时申请正好放这些货物的货架,随时加减。

1.1 单向链表

最简单的一种链表——单向(非循环)链表的示意图是这样的:


AI悦创原创...大约 8 分钟编程算法同步学编程算法同步学
预留给货物的固定货架:内存中的数组

1. 存储空间

上一章我们讲了冯诺依曼结构,其中很关键的一点是:存储空间分成若干存储单元,每个单元都有序号,单元内放置存储内容。

无论指令还是数据,物理上都存储在存储器里面,逻辑上都在存储空间之中。

存储单元和存储在里面的信息,可以类比成编号的货架和放置在其上的货物(见下图):

前些章反复说过,所谓数据结构就是数据的组织方式

现在我们已经把数据类比成了货物,那么对于数据的组织方式,自然就是存放这些货物的方式啦。


AI悦创原创...大约 10 分钟编程算法同步学编程算法同步学
计算机是咋运行的:冯诺依曼结构

数组、链表这些结构限制条件的根本原因来自于 计算机硬件的体系结构

在现今的计算机教育体系中,编程语言、数据结构(含算法)、计算机原理及体系结构几门课是计算机专业的本科生都要学习的。

实际上这几门课之间,也包括其他一些课程(例如编译原理、自动机、数电、模电、操作系统等等 ),有不少 overlap 的知识点和相互引用的地方,要从一个方向讲清楚某个知识点,就不得不涉及其他几个领域的知识。但是因为内容实在太多,不得已被分割为几门课程。

大学课程如此,我们这类入门性质的课程就要灵活得多,不必特意割裂知识间原本的联系,而是用到什么就讲什么。


AI悦创原创...大约 13 分钟编程算法同步学编程算法同步学
万物的抽象:数据结构

1. 数字化

现实世界由万事万物构成,而计算机能够处理,只有数据。说得更直接一点,计算机能够处理的其实都是数字。因此,当我们用计算机来协助处理日常事物的时候,首先要做的一件事就是数字化。

虽然在实践中,通常存储在计算机存储设备上的数字化数据是二进制形式的。但严格来说,任何把模拟源转换为任意类型数字格式的过程,都可以叫做数字化。

数字化指将信息转换成数字格式的过程。具体而言,就是把一个物体,图像,声音,文本或者信号转换为一系列数字的集合:

  • 一张图片的数字化是将其被分割成若干的像素,每个像素用R(red,红色)G(green,绿色)B(blue,蓝色)三种颜色分量对应的三个0-255的值来表示;
  • 一段声音的数字化则是将记录下来的模拟声波经由傅里叶变换转化为若干三角函数的叠加;
  • 文字的数字化是针对不同字符体系进行编码,将某一字符转化为一个特定的数字“号码”;
  • ……

AI悦创原创...大约 9 分钟编程算法同步学编程算法同步学
从最最最最简单的数据结构开始:数组和链表

在实际运用中,不同编程语言对于同一理论性数据结构的实现可能有所不同。在我们后面具体编程的过程中,用到的实践性数据结构和理论性数据结构也有可能不同。

本章里讲的数组和链表,是理论上的数据结构,我们关注的是逻辑层面的数据组织方式和其上操作的运行方式。

1. 数据结构的定义

我们先来看看数组和链表的定义。

1.1 数组

在计算机科学中,数组是一种由若干元素组成的集合,每一个元素被至少一个索引(index)或者关键字(key)标识,每一个元素的位置都可以通过计算索引得到。

之所以说数组中的每一个元素至少有一个索引,是因为,一个元素还可以有两个三个或者更多的索引。因为,数组可以是1维的,也可以是 2维 3维乃至 n维的。


AI悦创原创...大约 11 分钟编程算法同步学编程算法同步学
用最最简单的结构表达复杂的过程:控制结构的排列和嵌套

1. 什么是流程图?

流程图(Flow Chart)是一种表示算法或工作流的框图。它用不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接。我们正在讲的控制流程,就可以用流程图来表示噢。

流程图有一套相对复杂的符号系统,比如下图这样:

不同机构或组织对于流程图符号系统的定义也有所不同,有些流程图元素相当复杂,比如下例:

2. 极简版流程图符号表


AI悦创原创...大约 9 分钟编程算法同步学编程算法同步学
妈妈告诉我学编程到底有啥用啊?

1. 学习算法和编程的用处

学习算法和编程,到底有什么用?就目前而言,大致有如下几种用处:

1.1 是入行程序员的基本技能

这一点不用说了,程序员的日常工作就是编程,程序员面试考的就是算法。要想成为程序员,编程+算法是最最基础要学习的东西。

1.2 了解计算机技术和程序员思维的捷径

在互联网公司,有些岗位,虽然自己不需要编程,却总是难免要和程序员打交道,最典型的例如:产品经理。

这样的角色,如果对计算机技术和程序员的思维方式缺乏最根本的了解,日常工作也就无法进行了。学习基础编程和算法则是对这两者有所了解的最快途径。


AI悦创原创...大约 10 分钟编程算法同步学编程算法同步学
万事的抽象:控制流程

在我们计算机领域,控制流程的定义就是程序中陈述、指令或函数调用的执行历程。听起来是不是有点抽象?

其实,我们可以从一个更广域的角度去理解,控制流程——控制流程就是步骤和过程,在我们的日常生活中处处都有控制流程,看了你就能秒懂了!

1. 顺序

1.1 逐步完成一件事

我们要烤一个蛋糕。于是上网搜索到下面这个配方——

原料:鸡蛋,糖,面粉,黄油,牛奶

步骤

  1. 称量出4个鸡蛋,60g糖,90g面粉,50g黄油和60g牛奶

  2. 把蛋清和蛋黄分开

  3. 用打蛋器打5分钟蛋清,把蛋清打发成泡沫

  4. 把蛋黄和其他原料放到一起搅拌成蛋黄糊

  5. 把蛋黄糊和蛋清泡沫放到一起搅拌成蛋糕坯

  6. 把蛋糕坯放到蛋糕模具中用烤箱在150度烤40分钟

成品:戚风蛋糕


AI悦创原创...大约 9 分钟编程算法同步学编程算法同步学
程序、编程和算法之间到底有什么三角关系?

1. 算法与程序

在之前我们给大家科普过了,算法 = 控制流程 + 数据结构

数据结构是数据的组织形式。在描述算法的时候,我们并不知道实际要用这个算法来处理的数据是什么(其实也本没有必要知道),我们只需要知道将来要处理的数据是如何组织的就可以了。

基于数据的组织形式,定义一个运算/操作的历程,这就是算法的实现。算法实现的结果,就是程序。

当我们有了具体的数据要处理的时候,就要:

1)运行已经编写好的,实现了算法的程序(静态);

2)将具体数据按照既定的数据结构组织好,作为输入传输给运行时程序(动态)。


AI悦创原创...大约 9 分钟编程算法同步学编程算法同步学
算法究竟是个啥东西?

1. 计算机领域的算法

算法,究竟是什么呢?(令人抓耳挠腮,想不明白)

1.1 广义算法

广义而言,做一件事情/解决一个问题的方法,就是算法。

比如:

举个例子🌰

Case1:烙饼得把面粉加水和成团,擀成片,加油盐后卷成卷切成大面剂子,面剂子封口后擀成圆形,上锅烙,反几次直到两面焦黄,出锅乃成——这是烙饼的“算法“。是不是瞬间 Get!

Case2:做条裙子要先量尺寸,再裁布,然后缝纫镶边装拉锁——这是裙子制作的“算法“。

……


AI悦创原创...大约 9 分钟编程算法同步学编程算法同步学
安静的程序,淘气的程序和编写程序

1. 静态程序——程序的源代码

上一章我们讲到了程序的源代码,你是不是很好奇它和程序到底是不是一回事儿啊?

严格来讲,“程序”和“程序的源代码”并不是一回事情噢。

程序的源代码是指用编程语言编写出来的程序的逻辑,是静态的文本,我们暂且可以叫 TA 安静的程序,一般被存储为以特定字符串为后缀的文件。

比如下面就是一个 Python 程序(程序员世界中最著名的打印“Hello World”的程序),被保存为 FirstProgram.py (py 是 python 文件的特定后缀)。


AI悦创原创...大约 10 分钟编程算法同步学编程算法同步学
又回到最初的起点:软件和程序

1. 软件和程序

每每提到“编程”这个词,大家都会觉得这是件高端、神秘的事,或者会皱皱眉头,觉得这肯定是个挺难的事儿吧?

基本所有与编程没有打过交道的人,都认为编程似乎被一群秃头的程序员垄断了,是一种旁人无法介入的专属行为。

而就在这一两年里,“少儿编程”的概念又伴随着素质教育、stem 教育迅速崛起。好像一时之间,连小学生、幼儿园小朋友都开始学编程了。而且还有不少幼儿型选手拿了不少编程大奖!

所以,编程到底是个啥玩意儿?是不是真的有这么难呀?

2. 软件是什么

要说编程,首先就要先说一说计算机。计算机大家都不陌生吧,就算是一个完全不懂编程的人,也每天会用到——工作中用来处理资料、文档的台式机、笔记本,看剧的 pad ,日常不离身的智能手机,这些其实都是计算机。


AI悦创原创...大约 8 分钟编程算法同步学编程算法同步学
为什么我们要学习编程?

1. 为什么需要学习编程?

你好,我是悦创。

如今,学习编程的人分为两类,一类是程序员,另一类是期望成为程序员的人。

编程这个事儿,在大多数人眼中还是一种特定领域的、专门的技能,认为学的人都是需要以此谋生的。

其实,作为一个“码龄”超过20年的老程序员,我是这样认为的:在不久的将来(也许三五年,也许十来年之后),编程将从一个职业技能逐步蜕变为职场通用技能

对此,我们可以类比“识字”这个技能来看——

举个例子🌰

百十年前,大多数老百姓都不认识母语文字。当年具备了“认字”这一技能的人,就可以获得比大多数人更优越的工作环境,报酬更高的职位。那时,识字无疑是一种必备的职业技能。

但到了今天,识字率已经差不多100%了,具备此技能已经不再是职场的加分项了。相反,如果在今天不认字,那恐怕注定只能从事低端工作了。而如今的职场环境,要比之前要求的多,除了基本的电脑办公软件,要求会编程,也在各个互联网公司的面试中开始蔓延开来。


AI悦创原创...大约 7 分钟编程算法同步学编程算法同步学