在高中的时候发现自己的数学还可以,但是大学之后就不太行了,包括后来学习算法或者给人讲一个普通的算法时候也会很难让人理解和明白。所以自己在想的是,如何将算法或者数学讲明白。
理清本质
算法的定义:
In mathematics and computer science, an algorithm (/ˈælɡərɪðəm/ (About this soundlisten)) is a finite sequence of well-defined, computer-implementable instructions, typically to solve a class of specific problems or to perform a computation
来自wiki
敲重点: finite instructions有限的指令,specific明确的。
从这里我们可以看到算法是有限的步骤,解决某种模式问题。和我们的架构有点相同,每种架构都是为了解决特定的问题。
但又和架构不同:
1)架构是结构总分思维,而算法是过程思维。
2)架构的结构是静态的,算法的结构则是动态的。
这两点也就决定学习算法会比较困难,因为人的思维能力是有限的。但有的时候我们也并不会这么觉得,我们可以记忆很多很复杂的事情,比如背诵一个十万字的作文,这又是为什么呢? 我们思考之后就会得出结论,你的记忆是什么样的。是不是现有一个合乎逻辑的结构,空间或者时间也好,然后辅助以画面或者印象去记忆的?从这点来说,人要处理复杂的事情时,一定是遵循逻辑,然后按结构化思维去做。
对于算法是否也可以这样做? 算法可以用总分结构吗?
Expressing algorithms
1 High-level description
2 Implementation description
3 Formal description
来自wiki
答案是可以的,但是不是还是觉得即便结构化还是仍然很难去讲明白,想清楚?
要回答这个问题,我们先试着去想一下算法是怎么来的吧。也就是算法的设计。
Typical steps in the development of algorithms:
Problem definition
Development of a model
Specification of the algorithm
Designing an algorithm
Checking the correctness of the algorithm
Analysis of algorithm
Implementation of algorithm
Program testing
Documentation preparation
从这里我们就可以知道为什么即便算法有了总分的结构后还是会难以理解。因为算法一开始就是进化的,先假设后证明的,而不是我们日常思维的结构。这个就代表了观察问题的角度不同,带来的解决方式也会不同,我们学习算法的本质是在学习一个模式,这个模式不具备通用性和逻辑的公理性(公理性: 无需证明,就像我们使用加减,并不会思考为什么加法就是对的)。
如何把算法讲明白
从上面来说,首先是逻辑合理性。如何能够使用公理性的基础结论,去尽可能简化表达逻辑的步骤。
在逻辑合理性之后之后就可以通过算法的几种抽象高度,去抓重点地去表达算法的步骤。
说到这里,基本上就结束了,其实对于数学也和算法一样。下次用这样的想法来试试KMP算法。