对已知统计分布的数据进行sortingalgorithm?
我想到,如果你知道有关要分类的数据的分布情况(从统计angular度来说),那么如果考虑到这些信息,sortingalgorithm的性能可能会受益。
所以我的问题是,有没有任何sortingalgorithm考虑到这种信息? 他们有多好?
编辑:一个例子来澄清:如果你知道你的数据的分布是高斯,你可以估计平均和平均在你处理数据。 这会给你估计每个数字的最终位置,你可以用它们把它们放在最后的位置。
编辑#2:我很惊讶的答案是不是一个维基链接到通话页面讨论这个问题。 这不是一个很常见的情况(例如高斯情况)?
编辑#3:我为这个问题增加了一个赏金,因为我正在寻找来源的确切答案,而不是猜测。 就像“在高斯分布数据的情况下,XYZalgorithm平均速度最快,正如史密斯等人所certificate的那样[1]”。 但是,欢迎任何其他信息。
请注意 :我将奖励最高票数的答案。 投票明智!
如果你正在sorting的数据有一个已知的分布,我会使用一个桶分类algorithm。 您可以添加一些额外的逻辑,以便根据分布的属性计算各个桶的大小和/或位置(例如:对于高斯,您可能每隔(σ/ k)距离均值就有一个桶,其中西格玛是分布的标准偏差)。
通过以这种方式进行已知分配并修改标准桶sortingalgorithm,您可能会得到“ 直方图sorting”algorithm或与其相近的东西。 当然,你的algorithm计算速度比直方图sortingalgorithm快,因为你可能不需要做第一遍(在链接中描述),因为你已经知道分布。
编辑:给出你的问题的新标准(虽然我以前的答复关于直方图sorting链接到可敬的NIST,并包含性能信息),这是来自国际并行处理会议同行评议期刊文章:
使用概率分布进行sorting的自适应数据分区
作者声称,这种algorithm比stream行的快速sortingalgorithm具有更好的性能(高达30%)。
听起来像你可能想要读取自我改善algorithm :他们实现了任意input分布的最终预期运行时间。
我们给出了两个问题的自我改进algorithm:(i)对数字序列进行sorting,(ii)计算平面点集的Delaunay三angular剖分。 两种algorithm都能达到最佳的预期限制复杂度 algorithm从一个训练阶段开始,在这个阶段他们收集关于input分布的信息,然后是一个稳定的机制,在这个机制中algorithm解决了它们的优化版本。
如果您已经知道您的input分布近似为高斯,那么就空间复杂性而言,另一种方法可能会更有效率,但就预期运行时间而言,这是一个非常好的结果。
了解数据源分布,可以build立一个好的散列函数。 了解分布情况,哈希函数可能被certificate是一个完美的散列函数,或者接近完美的input向量。
这种function将大小为n的input分成n个分箱,这样最小的项目将映射到第一个分箱,最大的项目将映射到最后一个分箱。 当散列是完美的,我们将实现sorting只是将所有的项目插入到箱。
如果哈希函数的计算代价为O(1),并且下划线哈希数据结构操作为O(1),那么将所有项插入到哈希表中,然后按顺序提取它们将是O(n) )。
我会使用斐波那契数组实现哈希表。
对于哈希函数不完美(但接近完美)的input向量,它仍然比O(nlogn)好。 当它是完美的 – 这将是O(n)。 我不知道如何计算平均复杂度,但如果被迫,我会打赌O(nloglogn)。
计算机sortingalgorithm可以分为两类,基于比较的sorting和不基于比较的sorting。 对于基于比较的sorting,其最佳情况下的sorting时间为Ω(nlogn),而在最坏情况下的sorting时间可以上升到O(n2)。 近年来,已经提出了一些改进的algorithm来加速基于比较的分类,例如根据数据分布特征的先进的快速分类。 然而,这些algorithm的平均sorting时间只是Ω(nlog2n),只有在最好的情况下才能达到O(n)。 与基于比较的sorting不同,基于比较的sorting,例如计数sorting,桶sorting和基数sorting主要取决于键和地址的计算。 当密钥的取值范围从1到m时,非比较sorting的计算复杂度为O(m + n)。 特别是,当m = O(n)时,分拣时间可以达到O(n)。 但是,当m = n2,n3,…时,不能获得线性分类时间的上限。 在非基于比较的sorting中,桶sorting将具有相似关键字的一组logging分发到适当的“桶”中,然后对每个桶中的logging应用另一sortingalgorithm。 通过桶sorting,将logging划分成m个桶的耗时较less,而每个桶中只包含less量logging,这样就可以非常快地应用“清理sorting”algorithm。 因此,与Ω(nlogn)algorithm相比,桶sorting有可能渐近地节省sorting时间。 显然,如何将所有logging统一分配到桶中,在桶分类中起着至关重要的作用。 因此,您需要的是一种根据数据分布构造散列函数的方法,用于根据每个logging的关键字将n个logging均匀分布到n个桶中。 因此,在任何情况下,所提出的桶sortingalgorithm的sorting时间将达到O(n)。
检查这篇文章: http : //ieeexplore.ieee.org/xpls/abs_all.jsp?number=5170434&tag=1
桶sorting会给你一个线性时间sortingalgorithm,只要你可以计算O(1)时间每个点的CDF。
您也可以在其他位置查找的algorithm如下所示:
a = array(0, n - 1, []) // create an empty list for each bucket for x in input: a[floor(n * cdf(x))].append(x) // O(1) time for each x input.clear() for i in {0,...,n - 1}: // this sorting step costs O(|a[i]|^2) time for each bucket // but most buckets are small and the cost is O(1) per bucket in expectation insertion_sort(a[i]) input.concatenate(a[i])
运行时间为O(n),因为期望有O(n)对(x,y),使得x和y落入同一个桶中,并且插入sorting的运行时间正好是O(n +配对在同一个桶中)。 分析类似于FKS静态完美哈希 。
编辑:如果你不知道分布,但你知道它来自哪个家庭,你可以通过计算均值和方差来估计O(n)中的分布,然后使用相同的algorithm,在这种情况下计算cdf是非平凡的)。
您可以在快速sorting中使用该信息来select枢轴值。 我认为这会提高algorithm避开O(N ** 2)最差情况下复杂度的概率。
我认为循环sorting属于这一类。 当你知道每个元素最终的确切位置时,就可以使用它。
Cyclesort有一些很好的属性 – 对于某些受限制的数据types,它可以在线性时间内进行稳定的原地sorting,同时保证每个元素最多只能移动一次。