我怎么写比O(n!)更差的排序

时间:2020-03-05 18:42:42  来源:igfitidea点击:

我为娱乐写了一个O(n!)排序,如果不完全替换它,就不能对其进行简单优化以使其运行得更快。 [而且,在排序之前,我不只是随机分配项目]。

我如何编写一个甚至更糟糕的Big-O排序,而不仅仅是添加多余的垃圾,以减少时间复杂度?

http://en.wikipedia.org/wiki/Big_O_notation具有各种时间复杂性,并且按增长顺序排序。

编辑:我找到了代码,这是我的O(n!)确定性排序,带有有趣的技巧,可生成列表的所有组合的列表。我有一个稍长一些的get_all_combinations版本,该版本返回可迭代的组合,但是不幸的是我无法将其设为单个语句。 [希望我没有通过以下代码中的错误修正和删除下划线来引入错误]

def mysort(somelist):
    for permutation in get_all_permutations(somelist):
        if is_sorted(permutation):
            return permutation

def is_sorted(somelist):
    # note: this could be merged into return... something like return len(foo) <= 1 or reduce(barf)
    if (len(somelist) <= 1): return True
    return 1 > reduce(lambda x,y: max(x,y),map(cmp, somelist[:-1], somelist[1:]))

def get_all_permutations(lst):
    return [[itm] + cbo for idx, itm in enumerate(lst) for cbo in get_all_permutations(lst[:idx] + lst[idx+1:])] or [lst]

解决方案

回答

克里斯和我在另一个问题中提到了Bozosort和Bogosort。

回答

我能想到的一种方法是通过一个函数来计算每个元素的发布位置,该函数逐渐将大元素移到末尾,将小元素移到末尾。如果使用基于触发的函数,则可以使元素在列表中振荡,而不是直接朝其最终位置移动。在处理完集合中的每个元素之后,请进行完整遍历以确定数组是否已排序。

我不太肯定这会给你O(n!),但它应该仍然很慢。

回答

总会有NeverSort,它是O():

def never_sort(array)
  while(true)
  end
  return quicksort(array)
end

PS:我真的很想看看确定性O(n!)排序;我想不出O(n!),但是在经典计算中有一个有限的上限(又是确定性的)。

PPS:如果我们担心编译器将空的while块清除掉,则可以通过在块的内部和外部使用变量来强制不要这样做:

def never_sort(array)
  i=0
  while(true) { i += 1 }
  puts "done with loop after #{i} iterations!"
  return quicksort(array)
end

回答

我认为,如果我们进行大量复制,则可以得到"合理的"蛮力搜索(N!),每种情况下花费N ^ 2次,得出N!* N ^ 2

回答

有一种(已证明!)最差的排序算法,称为慢排序,该算法使用乘和降范式并在指数时间内运行。

虽然算法较慢,但它不会稳定地进行,而是执行随机跳转。此外,慢速排序的最佳情况仍然是指数,而不变。

回答

如何遍历所有n个整数t的所有数组(n个整数元组是可数的,所以这是可行的,尽管这当然是无限循环),对于每个数组:

  • 如果它的元素恰好是输入数组的元素(请参见下面的算法!),并且对该数组进行了排序(例如,线性算法,但我敢肯定我们会做得更糟),则返回t;
  • 否则继续循环。

要检查长度为n的两个数组a和b是否包含相同的元素,如何使用以下递归算法:循环遍历0和n-1之间的所有索引对(i,j),并且对每个这样的对

  • 测试a [i] == b [j]:
  • 如果是,则仅当通过从a中删除a [i]和从b中删除b [j]获得的列表的递归调用返回TRUE时,才返回TRUE;否则,返回TRUE。
  • 继续循环一对,如果所有一对都完成了,则返回FALSE。

时间将很大程度上取决于输入数组中整数的分布。

认真地讲,这样的问题有道理吗?

编辑:

@Jon,随机排序平均将为O(n!)(由于存在n!个排列,因此我们找到正确的排序的概率为1 / n!)。这适用于不同整数的数组,如果某些元素在输入数组中多次出现,则可能会略有不同,然后取决于输入数组的元素分布(以整数为单位)。

回答

我们总是可以进行随机排序。它通过随机重新排列所有元素,然后检查是否已排序来工作。如果没有,它将随机地求助于它们。我不知道它如何适合big-O表示法,但肯定会很慢!

回答

这是我们可以获得的最慢的有限排序:

将Quicksort的每个操作链接到Busy Beaver功能。

到我们进行> 4次运算时,我们将需要向上箭头表示法:)