【问题标题】:Sorting when comparisons cost no time当比较不花费时间时进行排序
【发布时间】:2018-04-02 19:54:48
【问题描述】:

我想在这个成本模型下对一个数组 A 进行排序:

  1. 对于任何值 x,A[i] = x 形式的赋值的成本为 1。此外,A[i] = A[j] 的成本为 1。

  2. 其他操作,例如比较和赋值 for x = A[i](其中 x 不是数组中的位置)的成本为 0。

问题:

  1. 给出对数组 A 进行排序所需的最坏情况时间的下限。您的答案应该是关于 n 的精确表达式,而不是使用渐近符号。

  2. 描述一种使用 O(n) 空间的排序算法。运行时应该与 1 中给出的下限完全匹配(完全一致,不是渐近的)。

  3. 描述一种最适合此成本模型的就地排序算法。运行时应与 1 中给出的界限完全匹配(完全一致,而非渐近)。

我的尝试:

  1. n.这是因为,在最坏的情况下,数组的 n 个元素位于它们不应该在的索引中。因此需要 n 次赋值才能使数组按排序顺序。

  2. 我的伪代码算法:

    def weird_sort(A):
        B = an array the same size of A
        C = an array of bools (default True) the same size of A
        for i in range(0, A.size):
            min = first index in c that is True
            for j in range(0, A.size):
                if (A[j] < A[min]) and (C[j]):
                    min = j
            B[i] = A[min]
            C[i] = False
        A = B
    

我相信这需要 n 时间来运行,因为我们将任何东西分配给 A 的唯一一次是在最后一行,我们将 B 的内容复制到 A。

  1. 不知道从哪里开始。在我看来,为了使所有内容保持原样,我们必须交换数组 A 中的内容,但我不知道如何使用 n/2 交换对数组进行排序。有人可以让我朝着正确的方向前进吗?你也可以仔细检查我对 1 和 2 的回答吗?

【问题讨论】:

  • 这对cs.stackexchange.com来说可能是一个更好的问题
  • 这听起来就像发明循环排序的确切情况。 :-)

标签: arrays algorithm performance sorting


【解决方案1】:

我认为就地允许O(1) 附加变量,否则我认为不可能

首先让我们解决子问题:给定i,找到应该在i-th 位置的数字。由于比较是免费的,因此可以使用暴力破解。

现在复制第一个元素(到附加变量),找到最小的元素并将其放在位置 1。现在这个元素在位置 i。让我们找到应该在位置i的元素并将它复制到这里(假设它在位置j上),现在找到属于位置j的元素,等等。最终我们找到了我们最初复制的元素,把它放回去.因此,我们使用k 赋值(在循环结构中)将k 变量设置到它们的位置。 现在对所有其他元素执行相同的操作。你不记得每个变量是否放在它的位置,但你可以免费检查它是否在它的位置。

如果 A 中有相同的元素,这应该更小心,但它仍然可以工作

【讨论】:

    【解决方案2】:

    虽然在谈到高效排序算法时,我们通常倾向于谈论快速排序,这种算法对比较次数进行了优化。

    但是,其他算法尝试优化内存访问次数(如您的情况)。其中一些被称为缓存遗忘算法(不对特定的内存层次结构参数做出假设)和缓存感知算法(它们针对特定的内存层次结构进行了调整)。您可以找到多种此类算法,因此您可能有兴趣看看它们。

    作为一个例子,Harald Prokop's PhD thesis 讨论了缓存忽略算法,并提出了分布排序,它对可能适合内存层次结构较低分区的子组中的数据进行部分排序。

    分布排序使用O(n ln(n))工作并导致O(1+ (L/n)*(1+logz(n))缓存未命中来对n个元素进行排序。

    其中 L 是缓存库的大小,z 是缓存本身的大小。性能模型仅假设只有一个缓存级别,尽管由于遗忘属性,它可以适应所有缓存级别。

    基本概念是分配成本根据元素在内存层次结构中的位置而变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2020-11-04
      相关资源
      最近更新 更多