我为我的娱乐写了一个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]

===============>>#1 票数:8

有一种(经过验证的!)最差的排序算法称为慢排序 ,它使用“乘法和投降”范式,并以指数时间运行。

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

===============>>#2 票数:3

克里斯和我在一个不同的问题上提到了BozosortBogosort

===============>>#3 票数:2

永远都是NeverSort,即O(∞):

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

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

PPS:如果你担心编译器在清空那个空的块时,你可以强制它不要在块内外使用一个变量:

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

===============>>#4 票数:1

这是您可以得到的最慢,有限的排序:

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

当你获得> 4次操作时,你需要使用向上箭头表示法:)

===============>>#5 票数:1

您可以随时进行随机排序。 它通过随机重新排列所有元素,然后检查它是否已排序。 如果没有,它会随机调整它们。 我不知道它如何适合大O符号,但它肯定会很慢!

===============>>#6 票数:0

我能想到的一种方法是通过一个函数计算每个元素的post位置,这个函数逐渐变化,将大元素移动到结尾,将小元素移动到开头。 如果您使用了基于触发器的函数,则可以使元素通过列表填充,而不是直接朝向它们的最终位置。 处理完集合中的每个元素后,再进行完全遍历以确定数组是否已排序。

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

===============>>#7 票数:0

我认为,如果你进行大量的复制,那么你可以得到一个“合理的”暴力搜索(N!),每个案例需要N ^ 2次,给N!* N ^ 2

===============>>#8 票数:0

如何循环遍历所有n个整数的数组(整数的n元组是可数的,所以这是可行的,虽然它当然是无限循环),并且对于以下每个:

  • 如果它的元素正好是输入数组的元素(参见下面的算法!)并且数组已经排序(例如,线性算法,但我确定我们可以做得更糟),然后返回t;
  • 否则继续循环。

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

  • 测试a [i] == b [j]:
  • 如果是这样,当且仅当通过从a中删除[i]并从b中删除b [j]获得的列表上的递归调用返回TRUE时,返回TRUE;
  • 继续循环夫妻,如果所有夫妻都完成,则返回FALSE。

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

但是,说真的,有这样一个问题吗?

编辑:

@Jon,你的随机排序平均在O(n!)中(因为有n!排列,你有1 / n!找到正确的概率)。 这适用于不同整数的数组,如果某些元素在输入数组中有多个出现,则可能略有不同,然后依赖于输入数组元素的分布(在整数中)。

  ask by sphereinabox translate from so

未解决问题?本站智能推荐: