欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
这时候我们可以启用另一种数据结构:链表——请看下一章。
公众号:AI悦创【二维码】

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
这时候我们可以启用另一种数据结构:链表——请看下一章。

虽然链表和数组是两种不同的数据结构,但它们都是被存储在连续的存储空间上的。
如果将两种数据结构中的数据比作“货物”,那么放置它们的“仓库”都是一样的,里面都有一排排标好了固定编号的货架(见下图)。

上一章我们讲了冯诺依曼结构,其中很关键的一点是:存储空间分成若干存储单元,每个单元都有序号,单元内放置存储内容。
无论指令还是数据,物理上都存储在存储器里面,逻辑上都在存储空间之中。
存储单元和存储在里面的信息,可以类比成编号的货架和放置在其上的货物(见下图):

数组、链表这些结构限制条件的根本原因来自于 计算机硬件的体系结构。
在现今的计算机教育体系中,编程语言、数据结构(含算法)、计算机原理及体系结构几门课是计算机专业的本科生都要学习的。
实际上这几门课之间,也包括其他一些课程(例如编译原理、自动机、数电、模电、操作系统等等 ),有不少 overlap 的知识点和相互引用的地方,要从一个方向讲清楚某个知识点,就不得不涉及其他几个领域的知识。但是因为内容实在太多,不得已被分割为几门课程。
大学课程如此,我们这类入门性质的课程就要灵活得多,不必特意割裂知识间原本的联系,而是用到什么就讲什么。
现实世界由万事万物构成,而计算机能够处理,只有数据。说得更直接一点,计算机能够处理的其实都是数字。因此,当我们用计算机来协助处理日常事物的时候,首先要做的一件事就是数字化。
虽然在实践中,通常存储在计算机存储设备上的数字化数据是二进制形式的。但严格来说,任何把模拟源转换为任意类型数字格式的过程,都可以叫做数字化。
数字化指将信息转换成数字格式的过程。具体而言,就是把一个物体,图像,声音,文本或者信号转换为一系列数字的集合:
在实际运用中,不同编程语言对于同一理论性数据结构的实现可能有所不同。在我们后面具体编程的过程中,用到的实践性数据结构和理论性数据结构也有可能不同。
本章里讲的数组和链表,是理论上的数据结构,我们关注的是逻辑层面的数据组织方式和其上操作的运行方式。
我们先来看看数组和链表的定义。
在计算机科学中,数组是一种由若干元素组成的集合,每一个元素被至少一个索引(index)或者关键字(key)标识,每一个元素的位置都可以通过计算索引得到。
之所以说数组中的每一个元素至少有一个索引,是因为,一个元素还可以有两个三个或者更多的索引。因为,数组可以是1维的,也可以是 2维 3维乃至 n维的。
流程图(Flow Chart)是一种表示算法或工作流的框图。它用不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接。我们正在讲的控制流程,就可以用流程图来表示噢。
流程图有一套相对复杂的符号系统,比如下图这样:

学习算法和编程,到底有什么用?就目前而言,大致有如下几种用处:
这一点不用说了,程序员的日常工作就是编程,程序员面试考的就是算法。要想成为程序员,编程+算法是最最基础要学习的东西。
在互联网公司,有些岗位,虽然自己不需要编程,却总是难免要和程序员打交道,最典型的例如:产品经理。
这样的角色,如果对计算机技术和程序员的思维方式缺乏最根本的了解,日常工作也就无法进行了。学习基础编程和算法则是对这两者有所了解的最快途径。
在我们计算机领域,控制流程的定义就是程序中陈述、指令或函数调用的执行历程。听起来是不是有点抽象?
其实,我们可以从一个更广域的角度去理解,控制流程——控制流程就是步骤和过程,在我们的日常生活中处处都有控制流程,看了你就能秒懂了!
我们要烤一个蛋糕。于是上网搜索到下面这个配方——
原料:鸡蛋,糖,面粉,黄油,牛奶
步骤:
称量出4个鸡蛋,60g糖,90g面粉,50g黄油和60g牛奶
把蛋清和蛋黄分开
用打蛋器打5分钟蛋清,把蛋清打发成泡沫
把蛋黄和其他原料放到一起搅拌成蛋黄糊
把蛋黄糊和蛋清泡沫放到一起搅拌成蛋糕坯
把蛋糕坯放到蛋糕模具中用烤箱在150度烤40分钟
成品:戚风蛋糕
在之前我们给大家科普过了,算法 = 控制流程 + 数据结构。
数据结构是数据的组织形式。在描述算法的时候,我们并不知道实际要用这个算法来处理的数据是什么(其实也本没有必要知道),我们只需要知道将来要处理的数据是如何组织的就可以了。
基于数据的组织形式,定义一个运算/操作的历程,这就是算法的实现。算法实现的结果,就是程序。
当我们有了具体的数据要处理的时候,就要:
1)运行已经编写好的,实现了算法的程序(静态);
2)将具体数据按照既定的数据结构组织好,作为输入传输给运行时程序(动态)。
算法,究竟是什么呢?(令人抓耳挠腮,想不明白)
广义而言,做一件事情/解决一个问题的方法,就是算法。
比如:
举个例子🌰
Case1:烙饼得把面粉加水和成团,擀成片,加油盐后卷成卷切成大面剂子,面剂子封口后擀成圆形,上锅烙,反几次直到两面焦黄,出锅乃成——这是烙饼的“算法“。是不是瞬间 Get!
Case2:做条裙子要先量尺寸,再裁布,然后缝纫镶边装拉锁——这是裙子制作的“算法“。
……
上一章我们讲到了程序的源代码,你是不是很好奇它和程序到底是不是一回事儿啊?
严格来讲,“程序”和“程序的源代码”并不是一回事情噢。
程序的源代码是指用编程语言编写出来的程序的逻辑,是静态的文本,我们暂且可以叫 TA 安静的程序,一般被存储为以特定字符串为后缀的文件。
比如下面就是一个 Python 程序(程序员世界中最著名的打印“Hello World”的程序),被保存为 FirstProgram.py (py 是 python 文件的特定后缀)。
每每提到“编程”这个词,大家都会觉得这是件高端、神秘的事,或者会皱皱眉头,觉得这肯定是个挺难的事儿吧?
基本所有与编程没有打过交道的人,都认为编程似乎被一群秃头的程序员垄断了,是一种旁人无法介入的专属行为。
而就在这一两年里,“少儿编程”的概念又伴随着素质教育、stem 教育迅速崛起。好像一时之间,连小学生、幼儿园小朋友都开始学编程了。而且还有不少幼儿型选手拿了不少编程大奖!
所以,编程到底是个啥玩意儿?是不是真的有这么难呀?
要说编程,首先就要先说一说计算机。计算机大家都不陌生吧,就算是一个完全不懂编程的人,也每天会用到——工作中用来处理资料、文档的台式机、笔记本,看剧的 pad ,日常不离身的智能手机,这些其实都是计算机。
你好,我是悦创。
如今,学习编程的人分为两类,一类是程序员,另一类是期望成为程序员的人。
编程这个事儿,在大多数人眼中还是一种特定领域的、专门的技能,认为学的人都是需要以此谋生的。
其实,作为一个“码龄”超过20年的老程序员,我是这样认为的:在不久的将来(也许三五年,也许十来年之后),编程将从一个职业技能逐步蜕变为职场通用技能。
对此,我们可以类比“识字”这个技能来看——
举个例子🌰
百十年前,大多数老百姓都不认识母语文字。当年具备了“认字”这一技能的人,就可以获得比大多数人更优越的工作环境,报酬更高的职位。那时,识字无疑是一种必备的职业技能。
但到了今天,识字率已经差不多100%了,具备此技能已经不再是职场的加分项了。相反,如果在今天不认字,那恐怕注定只能从事低端工作了。而如今的职场环境,要比之前要求的多,除了基本的电脑办公软件,要求会编程,也在各个互联网公司的面试中开始蔓延开来。