回应模式 - No.60413427


No.60413427 - 科学


计算机导读从摇滚开始无名氏No.60413427 只看PO

2023-12-04(一)01:21:43 ID:22b93o1 回应

这是一个从零开始的计算机学教程。教程里不会出现太过于深奥的内容,而是鼓励肥哥们根据串内的推荐自行学习。这个串只起到初步解释和导读的作用。

为了让计算机学更加有趣,也为了满足我的摇滚癖好,计算机和摇滚会在这个串里有机地结合起来,毕竟学习时听听音乐不也挺好嘛(ゝ∀・)

Tips无名氏No.9999999

2099-01-01 00:00:01 ID: Tips

( `д´)╮=͟͟͞͞ д) ゚д゚ )

无标题无名氏No.60417768

2023-12-04(一)14:01:56 ID: 22b93o1 (PO主)

>为什么计算机用二进制?

计算机使用二进制的一个原因是在设计电路的时候可以运用布尔运算的理论,并将1和0看作“是”和“否”这两种传统逻辑学中符合“排中律”的逻辑。

但这并非是其全部原因。

https://www.zhihu.com/question/314924440?utm_id=0

↑根据这个证明,我们可以证明出以自然常数e作为进制时,计算机处理储存的信息的效率最高。但e进制在计算机中难以从底层实现,也不符合人类的普遍认知,难以让人接受。所以我们使用二进制或者三进制。实际上,苏联曾经使用过三进制来建立计算机,但是苏联没了,所以我们还是用二进制计算机。

无标题无名氏No.60418320

2023-12-04(一)14:54:18 ID: bWO3KdY

订阅!催更!

无标题无名氏No.60419046

2023-12-04(一)16:04:00 ID: jrcONSH

荆门九派

无标题无名氏No.60419291

2023-12-04(一)16:22:59 ID: 22b93o1 (PO主)

>>No.60417637
哦对了,还有一种特殊的运算叫做取反(NEG),只接受一个输入。输入1(高电平电流)时,它输出0(低电平电流)。输入0时,它输出1。

正是有了这个运算,我们才能把6种不同的运算缩减到3种。

比如说定义AND运算:
输入1和1,输出1
输入1和0,或者0和1,输出0
输入0和0,输出0

那么输出正好和它相反的运算(NAND)为:
输入1和1,输出0
输入1和0,或者0和1,输出1
输入0和0,输出1

这个运算就相当于先AND再NEG,就不需要专门定义为特殊的运算了。

无标题无名氏No.60421323

2023-12-04(一)19:07:36 ID: ifgDoRm

゚∀゚)σ订阅

无标题无名氏No.60423437

2023-12-04(一)22:02:56 ID: 22b93o1 (PO主)

https://y.music.163.com/m/song/3424884

>计算机本质与抽象化

计算机是做什么用途的?简单来说,对计算机输入数据,计算机处理数据,计算机输出数据。这就是计算机的本质。

输入和输出数据的过程根据计算机的不同而不同,例如通过键盘可以输入键位信息,而通过显示屏可以输出图像信息。

处理数据的过程极为复杂。从物理的角度,无数电流流经电路,电平不断变化,这就是数据的处理。从数学的角度,计算机根据指令对数据进行有条件的,存在循环的,会终止的更改,使其变为我们想要的样子。从软件工程的角度,无数底层指令在我们输入高级编程语言时被一齐使用,以更改一个或多个存储于某处的数字(我们称其为变量)。

为了不让我们在思考数学公式时还要陷于对于用什么编程语言的思考,或者在编程时还要进行对于逻辑门中电平会怎样流动的回想,我们引入了一种叫做“抽象化”的东西,以屏蔽不必要的细节。

抽象化,就是把一个现实存在的,有复杂机理的东西封装(encapsulate)为不透明的黑盒,而我们没必要透过黑盒去了解其原理,也能使用这个黑盒。

计算机本身就是一个巨大的黑盒。一个人不需要懂计算机有啥零件,也可以流畅地使用计算机。这个人不需要知道什么是累加器,也可以在计算机上进行加减乘除运算。

哪怕是一个资深的软件工程师,也可以选择放弃了解一个程序的基本原理,只要知道输入一样数据,对应的输出应该是什么就可以。

那么,一个程序员可以在不知道计算机基本原理的情况下进行编程吗?

我的回答是,可以,但仅限于可以。缺乏了对于各种数学和工程原理的认知,一个程序员在遇到深奥问题时不知道如何解决。更重要的是,缺乏了基础知识的根基与基础知识所代表思想的指引,一个程序员没法更进一步地学习。

学习是计算机相关从业者很重要的一环。IEEE将“终身学习”作为软件工程师应有的品质。计算机相关的理论很容易化为实际的程序,所以计算机的发展很快,跟不上发展的节奏就会被远远落下。

抽象化是一道隐藏着智者的高墙。你能听见来自墙的另一边的声音,却不知道那是谁传出的,就像平克弗洛伊德的迷墙一样。对于未知的恐惧,是否能激励你学习各种原理呢?

无标题无名氏No.60433781

2023-12-05(二)18:40:02 ID: 22b93o1 (PO主)

https://y.music.163.com/m/song/19553390

>算法

算法,Algorithm,顾名思义,即计算的方法。在计算机学的意义下,算法接受输入,进行计算,然后输出。与“计算机”这种概念不同的是,每个算法都是为了一种设计算法时就预先定下的理念或者目的所创造的,也就是说,其目的性很强。而计算机可以用来干繁多的事物。

用个粗鲁的比方:榨汁机和人都需要吃水果,但榨汁器有着将水果转化为果汁的目的,而人广泛来说没有这么明确的目的。

算法在数学意义上可以理解为一种函数,function。Function这个词本身就有功能的意思。举个例子,加法是一种算法,其接受两个变量(不要忘了,变量是存储于某处的数据,之后会有更加明确的定义),输出一个数字,那个数字是变量中两数之和。

就像把一个盒子(变量)里的苹果(数据)和另一个盒子(变量)里的香蕉(数据)同时放进“乘法”这种榨汁机里,它们会变成处理好的果汁(数据)。别忘了再拿个杯子(变量)把果汁(数据)装进去。

我们写作:
c←x(a,b)

其中x指代乘法,a,b与c为变量。a与b为输入,箭头符号指赋值,即让输出的数字被装到c中,或者说更改c的内容,使其与输出的数字相同。这样,我们想要这个数字的时候就可以问c要。

为了写法简便,我们用等于号(=)来替代箭头符号,此时的等于号表示赋值而不是相等。

也就是,c=x(a,b)

乘法这种算法用x(a,b)的形式不符合我们的数学认知,所以我们可以简写为a*b,即c=a*b。

这代表使用算法将a与b相乘,将算法的返回值(即算法输出的那个值)赋值给c。

而乘法的实现原理,是将a与b的每一位相乘,将得到的结果在进位后相加。如果不知道二进制乘法是怎么进行的,建议先自行学习二进制乘法。大多数情况下用不到,但身为计算机系不会这个有点丢人,而且终究还是有用的。

好好珍惜这个简单的算法,一般的算法不会这么简单。

一个人的脑中藏着无数个变量,而这些变量在神经元的电信号传播中不断变换。我们是藏在变量之中的游魂。

又如同马克思曾经说过的,“一切已死的先辈们的传统,像梦魇一样纠缠着活人的头脑”。我们在潜移默化之中,已经被文化传统赋予了一些先辈的值。

无标题无名氏No.60434046

2023-12-05(二)19:07:45 ID: ndoIol0

゚∀゚)σ订阅

无标题无名氏No.60436181

2023-12-05(二)22:24:39 ID: 22b93o1 (PO主)

https://y.music.163.com/m/song/3955886

算法是计算机学中我最喜欢的一部分:优雅,美丽,包含着数学的纯粹和计算机的伟力。在学习算法的过程中,你会接触的大数远远大过世界上所有原子数量的总和,你会遇到的计算次数轻易超出群星之数。你会看见均称美丽的树与图。算法是计算机的灵魂。当学习算法时,请试图保持Maria一样的热情。

我很久没关心算法的教科书更新了。如果想要学习算法,我会推荐比较老的《算法导论(Introduction to Algorithms)》。

但这里还是简单地解释一下算法这种研究的目的和意义。在了解算法之前,请确保你有一些基本的函数和统计学知识。例如什么是“期望值”,什么样的函数比什么样的函数增长更快。

天道无情。对于世界来说,没有聪明的东西,没有愚蠢的东西。一切方法都只是方法。

但对于一个内卷严重的人类社会来说,这个世界上存在“笨方法”和“聪明方法”,这是大家都知道的事情。

算法是对于一种问题提出的,那么我就举一个简单的问题:排序问题。这个问题要求输入一串数字,例如9,5,2,7(注意,一串数字也可以是一个输入,这一点之后会详细说明,但结合“许多字节可以存放许多个数据”的说法,你们应该可以初步理解);然后输出从小到大排列后的数字,也就是2,5,7,9。

那么,有什么笨方法可以进行这样的排序呢?科学家能想到的(想一个笨方法也需要聪明的脑袋),最笨的方法是将数字随机打乱,然后从前往后确认一遍这串数字是否以从小到大排列,确认的方法是从第二个数开始,比较第n个数和第n-1个数,如果第n个数据比第n-1个数小,那么说明并没有排列好,停止检查,重新打乱,再次检查,直到排列好。

按平均期望来说,随机打乱n个数,假设这些数都不相同,打乱后正好排好序的可能性是1/(n!),也就是说平均n!次打乱之后可以得到一次正好排列好的。别忘了我们每次打乱顺序之后都要检查一遍是否排列好。假设每次检查都要比较n/2次(实际上大多数情况下比这个少,取决于数的分布规律),那么我们平均需要比较n/2*(n!)次。

但是如果运气很好,理论上来说我们只要打乱一次就能获得排列好的数字。此时只需要1次打乱数字,n/2次比较大小(运气好不代表我们可以省略比较大小的过程,算法可不知道自己运气好,它只会执行它被要求做的事情)。

但如果运气最差,那么我们在有限次打乱中永远获得不了排列好的数字,因为这种可能性是存在的:m次打乱获得不了排列好的数字的可能性是(1-1/(n!))^m。仅当m趋向于无限时,这个可能性趋向于0,也就是我们一定能获得排序好的数字。

也就是说,这个算法平均情况下大概需要进行n!次打乱和n/2*(n!)次比较,最好情况下约需要进行1次打乱和n/2次比较,最差情况下需要无限次打乱。

我们说这种算法是不明智的,我们不会使用这种算法,是因为我们进行了类似于上述的分析,发现它花费的计算时间理论上来说非常多,不值得我们使用。

这种算法的名字叫做猴子算法,灵感出自猴子莎士比亚打字机。或者叫它Bogosort也可以,sort是排序的意思,Bogo是这种算法的名字。在常规情况下,这种排序方式就是浪费资源。但在量子计算机的环境下,这种算法颇有启发性。