数据结构与算法:认识计算机程序和算法
浩哥带你聊聊算法那些事:认识计算机程序和算法
1. 人类发展史
在人类的历史长河中,一颗火的种子结束了石器时代;
从遥远的外太空飘来的陨石带来的一种元素结束了青铜时代进入了铁器时代;
詹姆斯·瓦特对蒸汽机的改进,推进了第一次工业革命(18世纪60年代)开启了蒸汽机时代;
有一个时代人们开始天马行空,不用煤油就可以点亮的灯、没有翅膀就可以飞的人、不用走路就可以日行千里、相隔万里就可以通信…这个时代就是电气时代,被誉为第二次工业革命(19世纪80年代中期)功不可没的还有发明交流电的伟大科学家尼古拉·特斯拉;
1946年世界上第一台通用计算机横空问世,1969年阿帕网(互联网前身)拉近了人与人之间的距离,使人类进入了信息时代;
在这伟大的时代交替期,我们即将迎来人类发展的天花板:智能时代。
每次人类的发展都是对生产力劳动力的一次解放,不知不觉中我们已经忘记了原始的记忆,其实我们能做的远不止如此。
2. 计算机发展史
好了言归正传,说好的计算机发展史怎么聊到人类的发展史了,
这里小编也是感慨一下啦。
计算机可以看到是人类发展史信息时代的产物,而且至今还是延续冯诺依曼体系结构。
现在使用的通用计算机都是围绕这五大基本结构来优化设计的:
2.1 CPU发展
运算器、控制器可以集成到一起就变成了CPU(就像人的大脑负责思考和控制):起初先电子管后有晶体管、集成电路、超大规模集成电路。就是在一定的面积内集成了更多的电路,越来越精密越来越复杂。
2.2 存储器发展
存储器(记忆单元,将计算好的结果进行存储):
因为速度和价格问题分为寄存器、内存、硬盘等。
寄存器是最快的在cpu内部存取很快,
内存是cpu和硬盘之间的过渡区,cpu太快、硬盘太慢,这里就体现出计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
1725年打孔卡(PUNCHED CARD)和打孔纸带(PUNCHED TAPE),最早的机械化信息存储形式
1928年磁带(MAGNETIC TAPE),磁性存储时代的开始
1932年磁鼓内存(DRUM MEMORY),硬盘驱动器(HDD)的前身
看着是不是挺小的,其实很大。1946年SELECTRON管,第一个随机存取数字存储器
1947年延迟线存储器(DELAY LINE MEMORY),一种顺序存取的内存形式
1947年磁芯存储器(MAGNETIC-CORE MEMORY),随机存取存储器(RAM)的早期版本
1951年磁带(MAGNETIC TAPE),首次被用于计算机上存储数据
1956年硬盘驱动器(HARD DRIVE),磁盘存储时代开始了
1965年只读式光盘存储器(CD-ROM)/数字多用途光盘 DVD(FLOPPY DISK)
1971年软盘(FLOPPY DISK)
1999年SD存储卡(SECURE DIGITAL MEMORY CARD)
2000年USB闪存驱动器(U盘)
2006年云存储
2.3 输入设备
世界上第一个鼠标是用木头做的,而且最早的专利名字叫做“显示系统X-Y位置指示器”。1964年,在斯坦福研究院工作的道格拉斯·恩格尔巴特,制作出了世界上第一个鼠标。
19世纪初意大利人佩莱里尼·图里为其盲人女友发明的打字机,后面才演变成了键盘。
2.4 输出设备
第一阶段:CRT 小时候常见的大屁股电脑。
第二阶段:LCD 等离子、液晶显示器等。
第三阶段:OLED 曲面屏、可折叠的屏幕。
3. 计算机程序发展史
正所谓一阴一阳之谓道,有了硬件就必定会有对应的软件加以辅助。
那程序的发展史是什么样的呢?
我们一起来探讨一下吧。
3.1 机器语言
对于计算机来说最简单最直接的语言就是机器语言(0和1),
因为现今的计算机都是按二进制来设计的,只能识别高低电平也就是0和1。
虽然这个是语言对于计算机来说效率最高,但是对于人类来说实在是太难了,你想想所有的信息都用0和1来表示对于我们的记忆来说实在是太痛苦了。
其实也有其他进制的计算机,而且在前苏联的科学家研究所知三进制(真、假、不知道)
计算机信息处理能力是效率最高的。那为什么在价格比二进制更便宜,编程更方便的三进制计算机为啥没有得到发展呢?这就要说命运造化弄人了,也许在另一个平行世界“我们”正在使用三进制计算机吧。
3.2 汇编语言
能不能像翻译一样将特定字符指定对应的二进制,做一次翻译,对人类更友好编程呢?20世纪50年代人们就发明了汇编语言来替代机器语言进行愉快的编程了。它就像助记符,但是可移植性比较差了。
3.3 高级语言
1956年FORTRAN语言作为世界上第一个被正式推广使用的高级语言开启了高级语言的启蒙,后面的高级语言如雨后春笋一般疯狂发展。
其中高级语言大致可以分为面向过程和面向对象语言,也有在此之间游荡的。
语言 | 类型 | 年代 |
---|---|---|
C语言 | 面向过程 | 1972 |
SQL语言 | 面向过程 | 1978 |
C++ 语言 | 面向过程/对象 | 1980 |
MATLAB语言 | 面向对象 | 1984 |
Python语言 | 面向对象 | 1991 |
Visual Basic语言 | 面向对象 | 1991 |
Ruby语言 | 面向对象 | 1993 |
Lua语言 | 面向对象 | 1993 |
Java语言 | 面向对象 | 1995 |
JavaScript语言 | 面向对象 | 1995 |
PHP语言 | 面向对象 | 1995 |
C#语言 | 面向对象 | 2001 |
Scala语言 | 面向对象 | 2003 |
Go语言 | 面向对象 | 2009 |
计算机编程语言只是一种工具,就像锤子、螺丝刀、美工刀等,各有优势和特点。
4. 算法的发展史
公元前4000年,远古的苏美尔人使用一周七天,一年十二个月的等历算法,算是开启了算法史。
我们来看看算法的定义:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰
指令
,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
------来自百度百科
最重要的五个特性:有穷性、确切性、输入、输出、可行
常用的方法:递推法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法、回溯法等。
其实说白了就是对已有问题的解决方案且可行:
比如我想从杭州东站到华为研究所,可以坐地铁也可以坐公交也可以自己开车或者骑自行车,每种方案都是可行的就是最终可以到达但是需要的时间(时间复杂度)和钱财(空间复杂度)是不同的。如果我高兴也可以绕地球一圈。。。
这样看来是不是算法并没有那么神秘和高大上了吧,每天我们都在使用着算法就是没有注意到而已。
学习一样东西了解一下历史还是有必要的,因为在每个时代的使命和任务是不同的,在变化的过程中多多思考不变的是什么?
让我们愉快的开启算法之旅吧~
参考文档:
程序员上下50年
计算机存储历史
作为程序员必须知道的编程语言编年史
算法的发展史
如有错误请大佬指正~