【发布时间】:2011-07-04 01:05:14
【问题描述】:
我们知道有几种排序,例如插入排序,对“大部分排序”的数组非常有用,而对于随机数据则不是很好。
假设我们想要描述这种算法相对于输入数据的“排序”程度的性能改进/退化。什么是生成“递增排序”或“递增随机”元素数组的好方法?我们如何衡量输入的“排序性”?
【问题讨论】:
我们知道有几种排序,例如插入排序,对“大部分排序”的数组非常有用,而对于随机数据则不是很好。
假设我们想要描述这种算法相对于输入数据的“排序”程度的性能改进/退化。什么是生成“递增排序”或“递增随机”元素数组的好方法?我们如何衡量输入的“排序性”?
【问题讨论】:
Number of Inversion 是衡量数组排序程度的常用指标。
如果i<j 和pi >pj,则排列p 中的一对元素(pi,pj) 称为排列中的反转。例如,在排列中(3,1,2,5,4)包含3个反转(3,1)、(3,2)和(5,4)。
排序后的数组取反为 0,反向排序的数组取 n*(n-1)/2。
【讨论】:
您可以通过中断在已排序数据集上运行的现代Fisher-Yates shuffle 来生成“部分排序”数据集。
此外,如果您只需要几组基本固定的部分排序数据,那么您可以为每个数据生成一个位置与值的柱形图,然后只关注它们。这可以让您快速了解集合的一般随机性,以及诸如有多少本地化顺序之类的信息。
【讨论】:
还考虑创建一个二进制堆,然后使用数组表示作为您的起点。在数组中实现的二叉堆不是排序的,而是有序的。我认为它会被认为是“部分排序的”。
【讨论】: