是否存在按O(∞)排列排序的排序算法?

时间:2011-08-04 19:15:42

标签: algorithm sorting big-o infinite

在阅读this question并通过答案中提出的各种电话簿排序方案后,我发现BOGO的概念非常有趣。当然这种类型的排序算法是没有用的,但它确实在我的脑海里提出了一个有趣的问题 - 它们是一个无法完成的排序算法吗?

换句话说,是否存在一个过程,人们可以尝试比较和重新排序固定的数据集,但却无法实现实际的排序列表?

这更像是一个理论/哲学问题,而不是一个实际问题,如果我更像一个数学家,我可能会证明/反驳这种可能性。有没有人问过这个问题,如果有的话,可以说些什么呢?

7 个答案:

答案 0 :(得分:4)

[edit:] 没有具有有限状态的确定性过程需要“O(无穷大)”,因​​为最慢的可能是在所有可能的状态中前进。这包括排序。

[更早,更具体的答案:] 没有。对于大小为n的列表,您只有大小为n的状态空间!在其中存储进度(假设排序的整个状态存储在元素的排序中,并且确实是“做某事”,确定性地)。

所以最坏的可能行为会在终止之前循环通过所有可用状态并占用与n成比例的时间! (冒着混淆事项的风险,必须有一条通过状态的路径 - 因为那是“所有状态”你不能让一个进程从状态X移动到Y,然后从状态X移动到Z,因为这需要附加状态,或者是非确定性的)

答案 1 :(得分:3)

创意1:

function sort( int[] arr ) {
    int[] sorted = quicksort( arr ); // compare and reorder data
    while(true); // where'd this come from???
    return sorted; // return answer
}

创意2

您如何定义O(infinity)? Big-O的正式定义仅表明f(x)=O(g(x))暗示M*g(x)f(x)的上限,给定足够大的x和一些常数M。< / p>

通常当你谈论“无限”时,你正在谈论某种无限制的限制。所以在这种情况下,唯一合理的定义是O(infinity)O(function that's larger than every function)。显然,比每个函数都大的函数是上限。因此从技术上讲,一切都是“O(infinity)

创意3

假设你的意思是theta符号(紧束缚)......

如果你施加额外的限制,即算法是智能的(当它找到排序的排列时返回)并且必须在有限的时间内访问列表的每个排列,那么答案号。列表只有N!个排列。这种排序算法的上限是有限的有限数,有限数。

答案 2 :(得分:2)

您的问题与排序没有太大关系。保证永远不会完成的算法将是相当沉闷的。实际上,即使是可能会或可能也不会完成的算法都会非常沉闷。更有意思的是一种算法,该算法最终会保证完成,但是对于任何可以自身的函数F,其最坏情况下的计算时间相对于输入的大小将不能表示为O(F(N))在有限的时间内计算。我的预感是可以设计出这样的算法,但我不确定如何。

答案 3 :(得分:1)

这个怎么样:

  1. 从第一项开始。
  2. 翻转硬币。
  3. 如果它是正确的,请用下一个项目切换它。
  4. 如果它是尾巴,请不要切换它们。
  5. 如果列表已排序,请停止。
  6. 如果没有,请转到下一对......
  7. 这是一种排序算法 - 猴子可能会做的那种。有没有保证你会到达排序列表?我不这么认为!

答案 4 :(得分:1)

是 -

SortNumbers(collectionOfNumbers)
{
  If IsSorted(collectionOfNumbers){
     reverse(collectionOfNumbers(1:end/2))     
  } 

  return SortNumbers(collectionOfNumbers)
}

答案 5 :(得分:1)

  Input:      A[1..n] : n unique integers in arbitrary order
  Output:     A'[1..n] : reordering of the elements of A
              such that A'[i] R(A') A'[j] if i < j.
  Comparator: a R(A') b iff A'[i] = a, A'[j] = b and i > j

更一般地说,使比较器成为(a)不可能与输出规范协调的东西,因此不存在任何解决方案,或(b)不可计算(例如,按照以下顺序对这些(输入,图灵机)对进行排序机器停止输入所需的步数。

更一般地说,如果你的程序无法停止有效输入,那么该程序不是解决输入/输出域问题的算法......这意味着你没有算法所有,或者你所拥有的只是一个算法,如果你适当地限制域。

答案 6 :(得分:0)

让我们假设你有一个随机的硬币鳍,无限的算术和无限的有理数。然后答案是肯定的。你可以编写一个排序算法,它有100%的机会成功地对你的数据进行排序(所以它确实是一个排序函数),但平均来说这将花费无限的时间来完成。

以下是Python中对此的模拟。

# We'll pretend that these are true random numbers.
import random
import fractions

def flip ():
    return 0.5 < random.random()

# This tests whether a number is less than an infinite precision number in the range
# [0, 1].  It has a 100% probability of returning an answer.
def number_less_than_rand (x):
    high = fractions.Fraction(1, 1)
    low = fractions.Fraction(0, 1)

    while low < x and x < high:
        if flip():
            low = (low + high) / 2
        else:
            high = (low + high) / 2

    return high < x

def slow_sort (some_array):
    n = fractions.Fraction(100, 1)
    # This loop has a 100% chance of finishing, but its average time to complete
    # is also infinite.  If you haven't studied infinite series and products, you'll
    # just have to take this on faith.  Otherwise proving that is a fun exercise.
    while not number_less_than_rand(1/n):
        n += 1
    print n
    some_array.sort()