【问题标题】:Profiling sorting algorithms against partially sorted data针对部分排序的数据分析排序算法
【发布时间】:2011-07-04 01:05:14
【问题描述】:

我们知道有几种排序,例如插入排序,对“大部分排序”的数组非常有用,而对于随机数据则不是很好。

假设我们想要描述这种算法相对于输入数据的“排序”程度的性能改进/退化。什么是生成“递增排序”或“递增随机”元素数组的好方法?我们如何衡量输入的“排序性”?

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:

    Number of Inversion 是衡量数组排序程度的常用指标。

    如果i<jpi >pj,则排列p 中的一对元素(pi,pj) 称为排列中的反转。例如,在排列中(3,1,2,5,4)包含3个反转(3,1)(3,2)(5,4)

    排序后的数组取反为 0,反向排序的数组取 n*(n-1)/2。

    【讨论】:

      【解决方案2】:

      您可以通过中断在已排序数据集上运行的现代Fisher-Yates shuffle 来生成“部分排序”数据集。

      此外,如果您只需要几组基本固定的部分排序数据,那么您可以为每个数据生成一个位置与值的柱形图,然后只关注它们。这可以让您快速了解集合的一般随机性,以及诸如有多少本地化顺序之类的信息。

      【讨论】:

      • 似乎中断Fisher-Yates shuffle会产生一个由一大块排序数据和一大块随机数据组成的数组。如果我们想生成一个包含大量短期排序和随机数据的序列怎么办?
      • 嗯。没想到。不同的排序算法有不同的排序模式;有几个在执行过程中创建了排序数据的短期运行。 Sedgewick 的算法书(例如)将帮助您选择一个这样做的。诀窍是弄清楚何时停止它......
      【解决方案3】:

      还考虑创建一个二进制堆,然后使用数组表示作为您的起点。在数组中实现的二叉堆不是排序的,而是有序的。我认为它会被认为是“部分排序的”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2018-10-23
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        相关资源
        最近更新 更多