目录
前言
这篇文章上半介绍了早期编程的方式和语言,下半简单简单介绍了算法和数据结构,希望读者阅读后能有所收获。
一 早期编程方式
1.汇总机器
早期汇总机器被用来进行人口普查,将一个人的信息存在一张纸上,利用打孔记录要收集的信息,将纸卡插入机器,就能得到总的值。
但是,早期汇总机不能算作计算机,因为它只能汇总数据。
2.插线板
如何告诉计算机我们要做什么呢?
早期科学家们将程序存在插线板上,通过连接不同的线来运行不同的程序
这样做的后果是每次更改程序要耗费大量的时间。
3.存储程序计算机
随着内存价格下降,容量变大 ,程序存在内存中变得可行。
将程序放在内存中还能方便CPU的读取。
内存如果足够,不仅可以存要运行的程序,还可以存程序需要的数据,还可以存新数据。程序和数据存在一个地方叫“冯诺依曼结构”。
冯诺依曼计算机:一个处理器(带ALU)、数据寄存器、指令寄存器、指令地址寄存器、内存(负责存数据和指令)。
4.面板编程
用一大堆开关和按钮代替插线,面板上的指示灯代表各种函数的状态和内存中的值。
因为早期家用的计算机使用了大量的开关,因为负担不起昂贵的外围设备必入穿孔纸卡读取器
但是,这几种编程的方法过于复杂,比如插线板换一次程序可能就需要好几周的时间,因此我们需要更简单的方法告诉计算机我们要做什么。
二 编程语言
1.机器码
计算机直接使用的程序语言,其语句就是机器指令码,机器指令码是用于指挥计算机应做的操作和操作数地址的一组二进制数。
2.汇编语言(汇编器)
汇编语言是任何一种低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,不同平台之间不可直接移植。
汇编器能读取用“汇编语言”写的程序,然后转成“机器码”
随着汇编器的升级,编程变得越来越简单。汇编器可以自己搞定跳转地址,不用担心比如jump因为增加代码改变地址而无法使用。/font>
但是汇编器仍然强迫程序员思考,用什么寄存器和内存地址。(在使用汇编语言时我们需要知道如数据要存放在哪里)。
3.高级语言(编译器)
编译器负责把高级语言转成低级语言(比如汇编和机器码)
如果使用汇编语言我们需要从内存取值,和寄存器打交道,以及其它底层细节,但如果我们使用高级语言就能让程序很简单
程序员只需要创建 代表内存地址的抽象,叫”变量“给变量取名字,例如运算加法时只需要给变量赋值、相加即可。我们不需要知道编译器把它放在哪了。
使用高级语言会让运行速度变慢,但编程速度大大增加
三 算法
1.介绍
不同的“算法”,意思是解决问题的具体步骤
记载最多的算法之一是“排序”,排序的种类有很多,如“冒泡排序”,“意面排序”, “选择排序”,“归并排序”等。
即使结果一致,有些算法更好。一般来说,代码越少越好,但有时会关心占多少内存等其他因素。
算法的输入大小和运行步骤之间的关系,叫算法的复杂度。表示运行速度的量级,算法的运行复杂度叫——大O表示法。
2.复杂度
1.时间复杂度:
O(N):
这个表达式运行了(3N+1)次,但在这个计算中N是要取无穷大的,因此O(3N+1)写成O(N).
O(N2):
根据我们N取无穷大的原则,第一个for循环N次,第二个for循环N次,因此这个时间按复杂度就是O(N2)。
O(N2+N):
由于上文提到过的N趋向于无穷大,因此此时依然是O(N2).
O(1):
占用内存的大小不随变量变化。
O(logN):
怎样得出的呢?
2.空间复杂度:
O(1):
O(N):
占用空间的大小随着n的增大而增大,同理O(N2)就是把一维数组换成二维数组即可。
3.几种排序算法
1.冒泡排序:叫冒泡排序是因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
冒泡排序利用两个for语句进行,每次只能使一个数归位(第一次则是将最大数放在最后面)
2.选择排序: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。这个的复杂度是 O(n^2)。
3.归并排序:将一个数组分成多个只有一个元素的数组,对比后合并成更大的数组,再对比、合并。每次对比时先比较第一位,将小的放在新的数组中,再比较两个数组新的第一位。它的时间复杂度是O(n*log n),因此归并比排序比选择排序更有效率。
四 数据结构
1.介绍
数据结构是计算机存储、组织数据的方式。
2.几种数据结构
1.数组可能是我们最开始认识的数据结构,通过数组我们可以把多个类型相同的数储存起来。
2.有时候我们需要储存不同类型的数据,比如一本书的书名,价格等,这时需要用到结构体。
3.链表是一种灵活数据结构,能存很多个节点(一个包含指针的结构体)。灵活性是通过每个节点指向下一个节点实现的。
数组大小需要预先定好,链表大小可以动态增减。将新节点插入其中即可。
链表也很容易重新排序,两端缩减,分割,倒叙等。很多复杂的数据结构 都用链表(最出名的是 队列和 栈)
队列”就像邮局排队,谁先来谁排在前面,这叫先进先出。
想象有一个指针叫“邮局队列”,指向链表的第一个节点,读取完一个节点(比如Hank),这样Hank就“出队了”,如果我们想让某人(某节点)入队,只需要把最后一个节点指向新的节点即可。
栈是后进先出:可以想象成松饼,每做一个就放在最上面,吃的时候先吃上面的。同样的也存在“入栈”和“ 出栈”
4.如果节点里面含有了两个指针,就能叫“树”。
抽象树:最高的节点叫“根节点”。根节点下面的所有节点,都叫“子节点”。任何子节点的直属上层节点,叫“母节点”,没有任何“子节点”的节点,也就是“树”结束的地方,叫“叶节点”。
若树中的节点最多只有两个子节点,那么这个树又叫二叉树。
树的一个重要性质是,根到叶是单向的。
5.节点如果随意连接可以用图表示。
最后
博主码文不易,如果觉得这篇文章对你有帮助的话,可以点赞、收藏、关注。你的支持是我创作的最大动力!