在计算机科学中进行分类与在“真实”世界中进行分类


86

我正在考虑对软件中的算法进行排序,以及可能克服O(nlogn)障碍的可能方法。从实际意义上讲,我认为不可能进行更快的排序,所以请不要以为我可以。

话虽如此,看来对于几乎所有的排序算法,软件都必须知道每个元素的位置。否则有意义的是,它将如何知道根据某些排序标准将每个元素放置在何处?

但是,当我将这种想法与现实世界相冲突时,离心机不知道每个分子在按密度对分子进行“分类”时所处的位置。实际上,它并不关心每个分子的位置。但是,由于每个分子都遵循密度和引力定律,因此它可以在相对较短的时间内对数万亿个项目进行分类-这让我思考。

在每个节点上有一些开销(附加到每个节点上的某个值或方法)是否有可能“强制”列表的顺序?类似于离心机,其中只有每个元素都在乎其在空间中的相对位置(相对于其他节点)。或者,这是否违反了计算中的某些规则?

我认为这里提出的主要观点之一是自然界的量子力学效应以及它们如何同时并行应用于所有粒子。

也许经典计算机会固有地将排序限制在的范围内O(nlogn),因为量子计算机可能能够将阈值越过进入O(logn)并行运行的算法。

离心机基本上是平行气泡排序的观点似乎是正确的,它的时间复杂度为O(n)

我想下一个想法是,如果自然可以分类O(n),为什么计算机不能?


44
离心机只是一个大规模并行气泡排序的实现,没有什么花哨的。
el.pescado

3
当使用n处理器(核心)来整理仅一组n项目时,您可以轻松实现O(n)复杂性。一个苦涩的事实是,我们通常必须在仅具有2..10内核的CPU上对长数组(成千上万个项目)进行排序。
德米特里·拜琴科

24
注意N日志n是数量比较必须以那种进行比较项目配对。不需要排序算法比较项目对;如果可以提出一种不进行成对比较的排序,则可以使其比n log n更快。
埃里克·利珀特

7
您所缺少的是,溶液中的每个分子都是处理单元。没有模拟器可以对分子进行计数-分子可以对自身进行计数。一台类似的计算机将具有与您要排序的项目一样多的处理器核心和独立的内存。O(n)它本身不会告诉您任何内容-仅对比较具有类似约束条件的算法并在类似架构上运行有用;在算法复杂性入门课程中,我们使用了非常简化的模型“计算机”,该模型与离心机或实际计算机
无关

4
我投票结束这个问题是因为题外,因为它属于cs.stackexchange.com
Robert Fraser

Answers:


71

编辑:我误解了离心机的机制,似乎它做了一个比较,在很大程度上是一个平行的比较。但是,有些物理过程对要排序的实体的属性进行操作,而不是比较两个属性。这个答案涵盖了那种性质的算法。

离心机采用的排序机制实际上并不是通过元素之间的比较来起作用的,而是实际上通过隔离每个元素上的属性(“离心力”)来实现的。一些排序算法属于这个主题,尤其是Radix Sort。当该分类算法并行化时,应以离心机为例。

其他一些非比较排序算法是存储桶排序计数排序。您可能会发现,斗式排序也符合离心机的一般概念(半径可能对应于垃圾箱)。

另一个所谓的“排序算法”(其中每个元素被单独考虑)是Sleep Sort。在这里,时间而不是离心力充当用于分类的大小。


这实际上是正确的答案-箱分类/基数排序具有O(n)复杂度,前提是可以在O(1)时间内访问箱和输入。
pjc50

5
我要问“其他人马上想到睡眠排序吗?”。
显然

离心机通过比较元素来起作用。哈希函数是(主要是)密度。例如,如果将丙烷和空气的混合物离心,则会将丙烷分类到边界。但如果将丙烷和水离心,则会将丙烷分类到中心(水密度更高)。此过程几乎与“气泡排序”所命名的物理过程完全相同。
纳特

SleepSort的复杂性实际上不是依赖于调度程序吗?
Morwenn

@Morwenn旧的Linux调度程序是O(1),而新的是O(log n)。睡眠中的恒定因素
不胜枚举

35

总是相对于某些计算模型来定义计算复杂性。例如,如果在Brainfuck中实现,则在典型计算机上为On)的算法可能为O(2 n)。

离心机的计算模型具有一些有趣的特性。例如:

  • 它支持任意并行性;无论溶液中有多少颗粒,都可以同时对其进行分类。
  • 它并没有给出严格的线性按质量排序的粒子,而是非常接近的(低能量)近似值。
  • 检查结果中的单个粒子是不可行的。
  • 无法通过不同的属性对粒子进行分类;仅支持质量。

鉴于我们没有能力在通用计算硬件中实现类似的功能,因此该模型可能没有实际意义。但仍然值得一试,看看是否有什么要学习的。例如,不确定性算法量子算法都一直是研究的活跃领域,尽管目前都无法实现。


自然/物理学通常是并行的(这就是为什么在我们的串行计算机上进行模拟的计算量如此之大)的原因,是的,OP的类比有一个重大缺陷。但是,粒子/分子沿着试管的长度或其他方向移动仍然需要时间,因此,更长的试管就像每个线程需要更多的工作,而更宽的试管则具有更高的并行度。(并且请注意,离心机不会在试管区域内进行排序,因此它是许多并行的类别,没有合并,但可能会有一些相互作用。与并行计算机上的实际类别不同,最终合并)
Peter Cordes

29

诀窍在那里,您只有使用离心机对列表进行排序的可能性。与其他现实世界中的排序一样[需要引用],您可以更改对列表进行排序的可能性,但是如果不检查所有值(原子)就无法确定。

考虑以下问题:“离心机应运行多长时间?”
如果您只运行了一个皮秒,则样本的排序可能会比初始状态少。.或者如果您运行了几天,则样本可能会被完全排序。但是,如果不实际检查内容,您将不会知道。


这是一个很好的观点。你怎么知道的?再说一次,如果现有的规则足够好,您甚至想知道吗?(即,如果您将概率降低到可以忽略的程度)。
克里斯(Kris)

您始终可以计算出颗粒到达离心机末端所需的时间。您知道加速度(w ^ 2 * r,其中w是角速度),并且可以计算时间。
user1952500

1
的确如此,但是由于布朗运动其他原子力和量子物理学(感谢小事情!)的影响,您仍然不能完全确定自己已经对列表进行了排序,直到检查状态为止。
ti7

1
如果没有非常小的粒子,则可以忽略量子效应。如果您的粒子非常小,那么排序算法就不必工作,实际上,由于量子效应,您不能依靠它来工作。而且由于不确定性原理,您不能可靠地检查状态(检查一个粒子将导致其他粒子移动)。
user1952500

1
@Kris好吧,我们知道离心机的分选不是很好。我们只是一直这样做,直到实际应用中的差异不再重要为止,例如防止血液在离心机中凝结。但是,请看一下铀离心机-那些需要对“更紧密”(更难分离)的物品进行分类,并且需要庞大的设施来不断重复进行分类,而这需要花费巨额费用才能生产出少量的所需材料。离心机具有一定的尺寸,分离时间与试管的宽度成正比,而且……您不能只说O(n),是的!
a安

5

基于计算机的“排序”的真实示例是相互协作的自主无人机,称为“无人机群”。无人机既可以作为个人,也可以作为一个团体行动和交流,并且可以跟踪多个目标。无人机共同决定哪些无人机将遵循哪些目标以及避免无人机之间发生冲突的明显需求。早期版本的无人机是在编队中移动通过航路点的,但是编队可能会改变。

对于“排序”,无人机可以被编程为以特定顺序形成线或图案,最初以任何排列或形状释放,并且集体且平行地它们将迅速形成有序线或图案。

回到基于计算机的排序中,一个问题是只有一条主内存总线,并且无法让大量对象并行地在内存中移动。

知道每个元素的位置

在磁带分类的情况下,每个元素(记录)的位置对于“磁带”来说只是“已知”的,对计算机而言不是。基于磁带的排序一次只需要使用两个元素,并且需要一种方法来表示磁带上的运行边界(文件标记或大小不同的记录)。


4

恕我直言,人们过分考虑log(n)。O(nlog(n))实际上是O(n)。您只需要O(n)即可读取数据。

快速排序等许多算法的确提供了一种非常快速的元素排序方法。您可以实施快速排序的变体,这种变体在实践中会非常快。

本质上,所有物理系统都是无限平行的。您可能在沙粒中有大量的原子,自然界有足够的计算能力来确定每个原子中的每个电子应该在哪里。因此,如果您有足够的计算资源(O(n)个处理器),则可以按log(n)时间对n个数字进行排序。

来自评论:

  1. 给定一个具有k个元素的物理处理器,它可以实现最多O(k)的并行度。如果您任意处理n个数字,它仍将以与k相关的速率对其进行处理。另外,您可以从物理上解决这个问题。您可以创建n个重量与您要编码的数字成比例的钢球,这可以通过理论上的离心机解决。但是这里您使用的原子数量与n成正比。在标准情况下,处理器中的原子数量有限。

  2. 对此进行考虑的另一种方式是,假设您在每个数字上附加了一个小型处理器,并且每个处理器都可以与其邻居通信,则可以在O(log(n))时间内对所有这些数字进行排序。


但是,计算不只是利用自然的物理特性来完成某些工作吗?我可能会在这里涉足量子计算,但是如果它可以物理完成,那么它应该能够进行计算吗?也许经典计算是O(nlogn)和O(logn)之间的障碍。
克里斯(Kris)

2
@Kris不完全是。给定一个具有k个元素的物理处理器,它可以实现最多O(k)的并行度。如果您任意处理n个数字,它仍将以与k有关的速率对其进行处理。另外,您可以从物理上解决这个问题。您可以创建n个重量与您要编码的数字成比例的钢球,这可以通过理论上的离心机解决。但是这里您使用的原子数量与n成正比。在标准情况下,处理器中的原子数量有限。
ElKamina

该限制也适用于QM对象吗?出于好奇
Kris

1
@Kris我对QM的理解不够深入,无法回答。
ElKamina

别担心!我只是很好奇,似乎无法入睡哈哈。感谢您提供有趣的答案。
克里斯(Kris)

4

高中毕业后的夏天,我在办公室工作。我曾在AP计算机科学专业学习,其中包括排序和搜索

我将这些知识应用于几个物理系统中,我可以回想一下:

自然合并排序开始...

系统会打印多部分表格,包括文件卡大小的撕纸,需要将其归档在抽屉柜中。

我从一堆它们开始,然后将其分类。第一步是捡起5个左右的东西,数量很少,可以轻松地放在手中。将已分类的小包放下,交叉叠放以使它们分开。

然后,合并每对堆栈,产生一个更大的堆栈。重复直到只有一叠。

…插入排序完成

归档已分类的卡片比较容易,因为每一张卡片都在同一打开的抽屉中更远一些。

基数排序

尽管一再尝试教它,但没人能理解我是怎么这么快的。

需要对一大盒支票存根(打孔卡的大小)进行分类。就像在一张大桌子上玩单人纸牌游戏一样—交易,堆积,重复。

一般来说

30年前,我确实注意到您在问什么:由于比较处理记录以及缓存级别相对较高,因此这些想法​​非常直接地转移到物理系统。

超越众所周知的等同物

我记得有一篇关于您的话题的文章,它提出了意大利面条的种类。修剪一段干面条以指示键值,并用记录ID对其进行标签。这是O(n),只需将每个项目处理一次。

然后,您抓住捆包,然后在桌子上点击一端。它们在底部边缘对齐,现在已排序。您可以轻松摘掉最长的一个,然后重复。读数也是O(n)。

在“现实世界”中有两件事与算法不符。首先,对齐边缘是并行操作。每个数据项也是一个处理器(物理定律适用于它)。因此,通常,您将可用处理扩展为n,实质上是将经典复杂度除以n的一个因子。

其次,对齐边缘如何完成排序?真正的排序是在读数中进行的,即使您确实比较了所有信息以找到最长的信息,也可以让您一步一步找到最长的信息。同样,除以n,因此现在找到最大的就是O(1)。

另一个例子是使用模拟计算:物理模型“立即”解决了问题,准备工作为O(n)。原则上,计算是根据交互组件的数量而不是准备项目的数量进行缩放。因此,计算将按n²缩放。我正在考虑的示例是加权多因子计算,该计算是通过在地图上钻孔,悬挂穿过孔的弦上的权重并将所有弦收集在环上来完成的。


意大利面条的种类很有趣。我很喜欢思考,但是批评扫描最长的面条的动作。因为您扫描了面条,所以这实际上不是O(1)操作。想象一下一万条面条和几条类似长度的面条……这不是O(1)的“ eyeball it”操作。实际上,必须扫描所有未分类的面条才能找到最长的面条。
ThisClark

您可以通过将手掌摊在整个束上并拉出与您的手接触的一根最高的面条来“扫描”所有面条。如果面条的长度非常接近,请使用更精确的“手”表面抓住最高的面条。面条没有像选择类别那样被顺序选择,而是一次被全部选择,因此有O(n)个“计算”功能可用。
Bradd Szonye '17

1
@ThisClark,您需要一个更精确的夹具:一个与底部的挡块平行的平面,用于将面条对齐。小心降低其高度,直到碰到一根面条(最高的)并置于压缩状态。平面相对于每个面条的高度的比较是通过该面条并行进行的。您建议需要更高的系数,但是该参数不会改变Big-O。
JDługosz

3

排序仍然是O(n)总时间。之所以比那快是因为并行化

您可以将离心机视为Bucketsort由n个原子组成,在n个核上并行化(每个原子充当处理器)。

由于处理器数量有限,O(n / C)仍为O(n)(CPU通常具有<10个内核且GPU <6000),因此可以通过并行化使排序更快,但只能以一个恒定的因子进行排序。


2

离心机不对节点进行分类,而是对节点施加力,然后它们平行地对其进行反应。因此,如果要实现一个冒泡排序,其中每个节点都基于其“密度”平行地上下移动,那么将有一个离心机实现。

请记住,在现实世界中,您可以运行大量并行任务,而在计算机中,您可以拥有的最大并行任务数量等于物理处理单元的数量。

最后,您也将受限于元素列表的访问,因为它不能被两个节点同时修改...


1

在每个节点上有一些开销(附加到每个节点上的某个值或方法)是否有可能“强制”列表的顺序?

使用计算机程序进行排序时,我们选择要排序的值的属性。这通常是数字的大小或字母顺序。

类似于离心机,其中只有每个元素都在乎其在空间中的相对位置(相对于其他节点)

这种类比恰当地使我想起了简单的气泡排序。每次迭代中冒出的数字越小。就像您的离心机逻辑一样。

因此,要回答这个问题,我们实际上不是在基于软件的排序中做这种排序吗?


1
我想你是正确的。我认为我在这里失去类推的地方是我忘记了每个分子都是并行作用的。因此,这就像是并行气泡排序...
Kris

1

首先,您正在比较两种不同的上下文,一种是逻辑(计算机),另一种是物理(到目前为止)已证明我们可以使用数学公式对其中的某些部分进行建模,并且作为程序员,我们可以使用此公式进行仿真逻辑工作中的物理学的某些部分(例如游戏引擎中的物理引擎)。

其次,在计算机(逻辑)世界中,我们有一些可能性,这在物理学中几乎是不可能的,例如,我们可以访问内存并每次都找到每个实体的确切位置,但是在物理学中,这是一个巨大的问题,海森堡的不确定性原理

第三,如果您想将离心机及其在现实世界中的操作映射到计算机世界,就好比某人(上帝)给了您一台应用了所有物理规则的超级计算机,并且您正在其中进行小分类(使用离心机),并说您的排序问题已在o(n)中解决,您就忽略了后台正在进行的庞大物理模拟...


0

另一个观点是,您用离心机描述的内容类似于所谓的“意大利面排序”(https://en.wikipedia.org/wiki/Spaghetti_sort)。假设您有一盒不同长度的未煮熟的意大利面条棒。将它们握在拳头中,然后松开手以将其垂直放下,以便将末端全部放在水平桌子上。繁荣!它们按高度排序。O(恒定)时间。(或者O(n),如果您包括按高度挑出杆子,然后将它们放在..意大利面条架上,我猜是吗?)

您可以在其中注意到,意大利面条的个数为O(常数),但是由于意大利面条的发声速度有限,最长面条的长度为O(n)。因此,没有什么是免费的。


我在11个小时前说过同样的话。然后我继续说明物理系统如何让您除以n或除以n²并保持算法和计算模型。
JDługosz

0

考虑:“离心机分类”真的更好地扩展吗?想一想当您扩大规模时会发生什么。

  • 试管必须越来越长。
  • 沉重的东西必须走得越来越远才能走到最底下。
  • 惯性矩增加,需要更多的功率和更长的时间才能加快分拣速度。

同样值得考虑离心机分类的其他问题。例如,您只能在狭窄的尺寸范围内操作。计算机排序算法可以处理1到2 ^ 1024甚至更高的整数,不费吹灰之力。将比氢原子重2 ^ 1024倍的东西放入离心机中,好吧,这是一个黑洞,星系已被破坏。算法失败。

当然,真正的答案是计算复杂度与某些计算模型有关,如其他答案所述。在常见的计算模型(例如RAM模型或IO模型或多带Turing机器)的上下文中,“离心排序”没有意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.