Algorithm 就地分拣

Algorithm 就地分拣,algorithm,sorting,Algorithm,Sorting,“就地排序”是什么意思?就地排序是指不需要额外空间的排序。据报道,它说 就地算法是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间 是就地排序的一个示例。我认为这些术语没有密切关系: 就地排序是指通过直接修改列表中的元素顺序对现有列表进行排序。相反的方法是保持原始列表不变,并按顺序创建一个包含元素的新列表 自然排序是一个描述完整对象如何以某种方式排序的术语。例如,您可以说0低于1(整数的自然顺序),或者A按字母顺序在B之前(字符串的自然顺序)。一般来说,你很难说Bob比Al

“就地排序”是什么意思?

就地排序是指不需要额外空间的排序。据报道,它说

就地算法是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间


是就地排序的一个示例。

我认为这些术语没有密切关系:

就地排序是指通过直接修改列表中的元素顺序对现有列表进行排序。相反的方法是保持原始列表不变,并按顺序创建一个包含元素的新列表


自然排序是一个描述完整对象如何以某种方式排序的术语。例如,您可以说0低于1(整数的自然顺序),或者A按字母顺序在B之前(字符串的自然顺序)。一般来说,你很难说Bob比Alice大或小,因为这在很大程度上取决于特定属性(按姓名、年龄、收入等字母顺序排列)。因此,人们没有自然的顺序。

我不确定这些概念是否足够相似,可以按照建议进行比较。是的,它们都涉及排序,但一个是关于人类可以理解(自然)的排序,另一个定义了一种算法,通过覆盖现有结构而不是使用额外的数据结构(如冒泡排序),在内存方面实现高效排序

就地算法的思想并不是排序所独有的,但排序可能是最重要的情况,或者至少是最著名的情况。这个想法是关于空间效率的——使用最小数量的RAM、硬盘或其他存储设备。这在几十年前尤其重要,当时硬件非常有限

其思想是在包含输入的相同内存空间中生成输出,方法是连续转换该数据,直到生成输出。这避免了需要使用两倍的存储—一个区域用于输入,一个大小相等的区域用于输出

排序是一个相当明显的例子,因为排序可以通过重复交换项目来完成——排序只会重新安排项目。交换不是唯一的方法——例如,使用了一种稍微不同的方法,这相当于进行一系列交换,但速度更快

另一个例子是——同样,这可以通过交换项目来实现。通过从最低有效位开始并向上传播进位,也可以就地添加两个非常大的数字(结果替换其中一个输入)

回到排序,当你想到成堆的卡片时,重新安排“原位”的好处就更加明显了——最好避免复制穿孔卡片只是为了对它们进行排序

一些排序算法允许这种就地操作,而其他算法则不允许

然而,所有的算法都需要一些额外的工作变量存储空间。如果目标仅仅是通过连续修改输入来生成输出,那么定义这样做的算法就相当容易了:保留一大块内存,用它来生成一些辅助数据结构,然后用它来指导这些修改。您仍然通过“就地”转换输入来生成输出,但是您正在挫败整个练习的要点—您没有节省空间

因此,在位定义的常规定义要求您达到某种空间效率标准。使用与输入成比例的额外空间(即O(n)额外空间)并仍然将算法称为“就地”是绝对不可接受的

就地算法目前声称,就地算法只能使用恒定数量的额外空间(O(1))

在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间

本节中规定了一些技术细节,但结论仍然是,例如,快速排序需要O(logn)空间(true),因此没有到位(我认为这是错误的)

O(对数n)比O(n)小得多-例如,16777216的基2对数为24

快速排序和heapsort通常都被认为是适当的,并且heapsort可以用O(1)个额外的空间来实现(我之前对这一点错了)。Mergesort更难就地实现,但异地版本对缓存非常友好-我怀疑现实世界的实现接受O(n)空间开销-RAM很便宜,但内存带宽是一个主要瓶颈,因此用内存换取缓存效率和速度通常是一个不错的选择

[EDIT当我写上述内容时,我假设我考虑的是数组的就地合并排序。链表的就地合并排序非常简单。关键区别在于合并算法——合并两个链表而不复制或重新分配很容易,对较大数组的两个子数组也一样(并且没有O(n)辅助存储)AFAIK不是。]

快速排序也具有缓存效率,即使是就地缓存,但由于其最坏情况的表现,可能会取消其作为就地算法的资格。存在一种退化情况(在非随机版本中,通常是在输入已排序时),其中运行时为O(n^2),而不是预期的O(n log n)。在这种情况下,额外的空间要求也增加到O(n)。然而,对于大型数据集和一些基本预防措施(主要是随机枢轴选择),这种最坏情况下的行为变得荒谬地不可能

我个人的观点是O(logn)额外的空间对于就地算法是可以接受的——这不是欺骗,因为它不会破坏就地工作的原始点

不过,我的意见当然只是我的意见

一分机