1-4课:程序、编程和算法之间到底有什么三角关系?

1-4课:程序、编程和算法之间到底有什么三角关系?

算法与程序

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

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

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

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

1)运行已经编写好的,实现了算法的程序(静态); 2)将具体数据按照既定的数据结构组织好,作为输入传输给运行时程序(动态)。

运行时程序会按照既定的步骤处理接收到的输入数据,产生运算结果,并输出。

如此说来,也可说算法是静态程序的内容,而算法 + 数据 = 动态程序

enter image description here

算法与编程

算法和编程,又是怎样的关系呢? 其实,很简单一句话就能给大家说明白 那就是所谓编程,就是实现算法的过程!!!

对编程的误解

很多同学在开始有意向学习编程的时候,很粗糙的认为学习编程就是学编程语言,以为学会了编程语言的句法、语法就会 编程了。

NO!这样想就错了,这里有一个很重大的误解,就是简单地把编程语言等同于自然语言了。

大家都有学习外语的经历吧,回头想想,中小学学英语的时候,我们要做的事情不过就是:认字母,背单词,记语法——什么时态、语态、主格、宾格、定语从句、状语从句等等。

每每被动词变形、虚拟语气,和英语阅读时半篇儿不认识的单词搞得七荤八素的时候,就觉得:记住了足够多的单词和语法,自然就会用英语听说读写了。

至于听说读写的内容,我们并不用操心,反正我们每天中文也要说话、阅读、写作,学会了英语,不过就是用哇哩哇啦的发音和曲里拐弯的字母来代替声韵母、方块字做同样的事情罢了。

中文英文(或者任何一种自然语言)最基础的部分都是用来应对日常生活的。我们每个人都对自己的日常生活十分熟悉,对于需要输入(听、读)输出(说、写)的内容早已掌握。而自然语言的形式又特别复杂,所以在学习外语的初中级阶段,大都会将绝大部分精力放在词汇语法上。

但是编程语言这种东西,它的作用不是用来日常聊天或者生活用语的。

虽然不管那种语言第一个程序都是 “Hello World” ,但那是运行环境因为自己能够正常实现功能而对世界发出的欢呼,并不是人与人之间打招呼。

那么多编程语言,无论学其中哪一种,我们都不是为了去问邻居“吃了吗”,跟超市导购讨价还价,或者撩哪个心仪的妹子/汉子……

点击了解更多《编程算法同步入门》

学习编程的目的

那我们学编程是用来干什么的呢?

从微观角度说,计算机能够处理的“物料”是数据,所有计算机能做的事情,都要通过数据的变化来体现。因此,如果我们编写程序的目的不是为了让数据发生变化那就毫无意义。

让数据发生变化就需要运算,而运算的过程就是算法。

从宏观角度说,算法是对解决某类问题/完成某类任务的方法的描述。人类发明计算机是用来解决问题的,如果写出来的程序不能解决问题,这个程序就不应该存在。

因此,任何有存在价值程序,必然都实现了算法。我们学编程就是为了实现算法的。

算法是编程的核心!

经典算法

说到这里,有些人可能要抬杠了:

人类要解决的问题无穷无尽,我堆砌一些符合编程语言词法句法的代码,让它们能在运行时跑起来。然后就说这个程序解决的就是让我能写出一个程序的问题,它不也是个算法吗?

人生苦短,文字游戏在这里玩不通,也没必要去制造悖论~

固然人类要解决的问题千奇百怪,有些问题事到临头也许确实要做点明知徒劳也不得不为之的处理。但毕竟我们现在是在学习阶段嘛,学习阶段就应该珍惜时光,尽量在最短的时间内学会能处理计算机世界中最常遇到的问题的算法

计算机从被发明出来到现在半个多世纪的时间里,虽然它能够提供的服务日益翻新,但其实有一些逻辑层面的基础问题,在大多数应用领域都会用到。许多应用层繁多的花样,最终对应的都是共同的基础问题

计算机领域的科研人员、开发者,在几十年的工作中,针对一些历史悠久,应用广泛,经常高频出现的问题,研发出了对应的精致、高效的算法。这些算法我们称为经典算法

本门课程要学习的就是这些算法中的一部分。

经典算法著作

计算机专业讲述算法的经典书籍主推下面这两部:

1. 《编程的艺术》

enter image description here

《编程的艺术》,书名英文 The Art of Computer Programming,简称为TAOCP。

作者Donald Knuth,中译高德纳,是1974年图灵奖得主。目前隐居深山,专注写作本书。

本书预计出版七卷,到目前为止只出版了前三卷(各一册),和第四卷的 A 分卷(第四卷计划分为ABCD四个分卷),A分卷又包括0-4五个分册。

第一卷首次出版于1968年,第四A卷的五个分册已经在2005- 2011陆续出版。目前只有第一卷有中译本。

这是一本算法的集大成之作,虽然还未完成,但已经被列为20世纪最佳12部学术专著之一, 与“量子力学”、 “相对论”、 “博弈论”等重要著作并列经典。

如果立志研究计算机算法,这部著作是经典中的经典无疑。即使是职业程序员,能够通读第一卷也是凤毛麟角,真能把第一卷读下来,都学会,在工业界差不多就可以算是算法大拿了。

这部书对于初学者并不合适,不过既然要学习计算算法,总要知道它。

关于本书还有个有意思的事情:

高德纳宣布任何发现书上的错误并写信告知他的人,都能得到256美分——刚好是十六进制的一美元 (one hexadecimal dollar)。

高德纳确实履行了他的诺言,每位发现错误并指出的读者,都能得到一张2.56美元(或其倍数,如果能同时发现不止一个错误的话),有高德纳签名的支票。

在现今已经50岁往上的那代程序员里,高德纳的支票是一种很酷的收藏品,也是自身能力的背书。作者的一位前老板就有这样一张支票,他把它放在一个镜框里,摆在自己办公桌上。

2.《算法导论》

enter image description here

《算法导论》,英文名 Introduction to Algorithms,首次出版于1990年,此后又出版了第二版(2001)和第三版(2009)。

三版都有中译本:

enter image description here

原本预计2014年要出第四版,不过被推迟到了2019年。

本书在首版发行后的二十多年中 ,迅速成为了美国许多大学算法课的课本,并在学术论文中被引用了超过万次!

第一版的作者是三个人: Cormen , Leiserson , Rivest ,再版时又加上了第四位作者Stein,他们的姓氏首字母缩写CLRCLRS已经成了一个业界术语,专门用来指代本书的作者。

《算法导论》不仅讲解了经典算法,算法的数学性质,还介绍了这些算法的设计技术和应用领域。具体的算法过程用伪代码书写,避免了和某一种编程语言的绑定。

无论是用做学习算法的教材,还是在实际工作中应用算法的参考,都是极好的。

不过原版1300多页,中译本780页——这样的砖头读一遍还是蛮辛苦的。另外,正是因为没有和具体的编程语言绑定,如果要实现其中算法,则需要能够自己编写实际的代码,也就是要预先具备编码能力再读本书为好。

对于编程和算法都是零基础的入门者,本书还是有些艰深。

小贴士:虽然本书各章自成体系,可以作为独立的学习单元,但如果一个人能够直接选出基础重点章节进行自学,那就不是零基础了,是吧~

点击了解更多《编程算法同步入门》

分享交流

我们为本课程付费读者创建了微信交流群,以方便更有针对性地讨论课程相关问题。入群方式请到第 2-1 课末尾添加小助手的微信号,并注明「同步入门」。

阅读文章过程中有任何疑问随时可以跟其他小伙伴讨论,或者直接向作者提问(作者看到后抽空回复)。你的分享不仅帮助他人,更会提升自己。

上一篇
下一篇
内容互动
写评论
加载更多
评论文章