回应模式 - 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.60466973

2023-12-08(五)17:47:18 ID: 22b93o1 (PO主)

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

归并排序为何是合理的?为什么这种方法可以将列表从小到大排序?也许许多人已经感觉出来了它的正确性,但是算法不需要感觉,只需要证明。

归并排序由两段重复组成:重复的分解和重复的拼接。分解这个步骤仅提供拼接的顺序,或者说“分解”本身就是对于这种拼接顺序的解释。

我们将这种重复的拼接定义为一种循环(loop)。循环就是不停地做一件事,在这里就是不停地以排序的方式合二为一。在每一个循环中,所有小的列表被两两相拼,使其数量减半,长度翻倍(在假设列表长度是2的次方的情况下)。

在循环的时候,我们希望每个被拼接的列表保持一个特质,那就是它们都是有序的,是从小到大排列的。这种在循环中保持的特性被称为“循环不变式(loop invariant)”。

我们用数学归纳法(如果不知道这个是什么,请先自行了解数论基础,或者试着直接理解以下内容)看看循环不变式在循环中有没有被保持。

在拼接开始的时候,每一个列表仅有一个元素。一个元素的列表我们在这里默认已经从小到大排序,所以循环开始的时候所有列表是有序的。

在每一个循环中,一个列表由两个小列表拼接而成。拼接方式是比较列表中数的大小,大的摆后面,小的摆前面,如前文所叙述的一样。通过这种摆法,我们保证了没有大的数在小的数前面,即列表在循环后依然有序。

循环的结束条件是所有列表归一。因为列表在拼接后始终有序,最后所得的列表也是有序的。

论证完毕,循环不变式成立,循环后可以得到有序列表。

列表在每个循环中慢慢变好,Getting Better all the time。

无标题无名氏No.60467010

2023-12-08(五)17:50:58 ID: 22b93o1 (PO主)

在每个循环中,我们以算法所规定的方式“维护”了循环不变式,使其保持而不是消失,而这个循环不变式保证了最后所得列表有序。

这种“维护”和对于数据结构的维护在本质上是一致的——利用某种方法来保证某一有用性质不消失。

无标题无名氏No.60501049

2023-12-11(一)18:15:47 ID: kdXdPyz

保持性质不变的思想(*´∀`) 好棒

无标题无名氏No.60511489

2023-12-12(二)15:52:49 ID: rteIOXe

>>No.60460658
毕业两年竟然看归并排序都陌生起来了(;´Д`)
不过po配joy division感觉很妙|∀` )

无标题无名氏No.60516560

2023-12-12(二)23:43:06 ID: 24DtIFq

喜欢po的语言风格,摩多摩多!

无标题无名氏No.60579607

2023-12-18(一)23:47:36 ID: 22b93o1 (PO主)

http://music.163.com/album/2064268/

接下来,我会讲为什么我们要排序。

除了符合我们人类对于秩序的喜好外,一个排序的列表最大的特点是便于搜索。

在这里,搜索特指这个问题:输入一个数字n和一个列表l,能否从列表中找到一个元素的索引i,使该元素(标为l[i],指代位于列表第i-1个的元素)和给定的数字n相等。如果列表中不存在和这个数字相等的元素,则输出-1以表示列表中没有匹配元素。

可以理解为,在一个图书馆(列表)里找到想要的书(数字)。

一个列表可以有重复的数字元素,输入的数字可能匹配到多个元素,此时只要找到任意一个对应元素所在的索引即可。

这里稍微谈谈索引的概念:元素在这个列表中从左到右排第N个,索引即为N-1。

或者我们可以这样理解:对于[1, 4, 1, 4]这个列表,l0[0,0]指代1,l1[0,1]为4,l2[0,2]为1,l2[0,3]为4。

为什么从0开始为列表中的元素标索引?现在我的解释是因为索引在计算机中也表示成二进制数字,而0000 0000显然比0000 0001更适合作为索引的开始。我们之后会从储存地址的角度做更严谨的解释。

我们现在使用的列表储存的都是数字,接下来可能会储存“不可能一样”的数据类型或者“用途一样,但储存在不同地方”的数据类型,在谈地址的时候也会更明确地谈论这一点。

搜索问题定义完成,我们继续谈论如何搜索。首先我们先看看对于一个无法通过前N项元素推断出第N+1项元素有何性质的列表(注意,这个定义比“随机数字”更加广泛和固定,我们可以不知道X岛的下一条回复是什么,但这个回复不会是根据某种分布随机生成的数字)来说该如何搜索。

最简单,最合适,最保守的搜索方式是从列表的第0个元素开始(从这里开始我们从索引的角度描述列表),将每个元素和输入的数字n比对。如果一样,就结束算法,输出目前元素所在的索引,如果不一样就比对下一个。这个索引可以通过保持一个变量,每搜索一次就进一位(increment)的方式维护。这是最初级的循环不变式:我们维护的这个变量在循环中一定等于目前比对过元素的索引。如果比对所有元素但没有输出过数字,则输出-1,因为全对比了也找不到匹配元素。

我们评估一下这种算法。在最差(即需要进行最多运算)的情况下,我们需要O(n)的时间复杂度来输出一个-1或者最后一个索引。不知道时间复杂度的,还是建议看算法导论或其他教程。

在最优情况下,我们只需要进行一次对比即可,时间复杂度为O(1)。

我们再从搜索空间(search space)的角度来看。搜索空间即答案可能处于的集合。换句话说,就是列表中可能和输入数字相等的元素。

在没有比对的时候,任何列表中的元素都有可能是我们想要的那个,但是我们不知道。此时搜索空间等同于列表。

在我们对比的过程中,我们确定了一些元素不可能和输入数字相等,那么搜索空间的大小就变小了,我们只需要从更小的空间中搜索元素了。当搜索空间为0,即没有元素的时候,我们一定能得到一个结果:这个空的搜索空间中不可能存在我们想要搜索到的元素。

在我们提到的一个个去对比的算法中,搜索空间在每一次对比后被删除一个元素,因为对比后我们知道这个元素不可能是结果(或者就是结果,那么我们可以直接结束算法)。初始搜索空间大小为n,每一次对比必定使大小减一。在越来越狭小的空间里,我们可以越来越逼近答案。

Hawkwind的In Search of Space专辑让我迷醉:一点太空,一点迷幻,一点硬摇滚。冷淡高傲的嗓音,宇宙般无处不在,平淡却宏伟的bassline,在深沉幻想中拨动的吉他riff,并不刻意去愉悦或者折磨耳朵的合成音,我不敢相信身处他们的live中该有多震撼。

无标题无名氏No.60579613

2023-12-18(一)23:48:21 ID: 22b93o1 (PO主)

专辑封面不能忘

无标题无名氏No.60639992

2023-12-25(一)00:23:38 ID: 22b93o1 (PO主)

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

对于一个从小到大排序的列表来说,我们有更好的方式来搜索这个列表:首先将要搜的数字n与列表最中间的第x/2个元素做比较,x为列表长度,即其所包含的元素个数(推荐没有接触过这种算法的读者先自行拟一个列表试一试下面的算法,可以让你快速理解那些让人头大但不得不写的原理阐述)。

如果n比这个元素小,则证明n在列表的第零个元素到第x/2-1个元素之间,因为这些元素小于等于第x/2个元素,而第x/2个元素大于n,换句话说,第x/2+1到第x个元素不可能存在n,因为n<第x/2个元素<第x/2+1和之后的元素;如果n比这个元素大,则n在第x/2+1到第x个元素之间。

如果n和第x/2个元素一样大...那我们已经找到了结果。

简而言之,对于目前的列表,将n与中间元素作比较,然后要么得到结果,要么抛去一半的列表得到新的“目前的列表”,不断重复直到得到结果。

这个算法叫二分算法(binary search),或者说折半算法。每一次比较,我们都可以将搜索空间减半,抛去一半必然不可能存在结果的元素。其时间复杂度为O(log(x))(这是什么意思?请自行参照书本)。

顺带一提,在这里,我们可以初步看到离散数学和连续数学的区别。对于一段数轴来说,你不可能通过这个算法在有限的时间内找到一个无理数,因为“日取其半,万世不竭”(为什么?提示:在数轴上随机选中任意数的可能性为0);而对于一个存在有限个数字的列表来说,你可以将搜索空间不断折半,缩小到1,然后通过最后一次对比判断n是否在列表中,是否需要输出-1。

列表这个数据类型的特性是“读取列表中任意索引的元素都只需要固定的常数时间”,提取第0个元素和第x/2个元素消耗都是固定的,这也是支撑二分搜索时间复杂度为O(log(x))的前提条件。如果提取第x/2个元素需要一路扫过去,消耗时间大于提取第0个元素,这个算法就不是那么有效了。

为什么我们假设列表具有这样的特性?因为我们在现实中可以利用数据磁盘来做到几乎相同时间的读取,与列表性质吻合,所以这种假设所得的算法对于数据磁盘上的数据操作是有用的。“列表这种数据类型在现实中有用”的证明就涉及到计算机硬件了。

抛去不必要的东西这件事,本身就很有必要。就像Afraid to Shoot Strangers这首歌,精髓全在两段solo上,其他部分就显得可有可无了。

无标题无名氏No.60640070

2023-12-25(一)00:29:03 ID: 22b93o1 (PO主)

>>No.60639992
这一段的“数轴”,特指开始和结尾为有理数的数轴