在阅读this question并通过答案中提出的各种电话簿排序方案后,我发现BOGO的概念非常有趣。当然这种类型的排序算法是没有用的,但它确实在我的脑海里提出了一个有趣的问题 - 它们是一个无法完成的排序算法吗?
换句话说,是否存在一个过程,人们可以尝试比较和重新排序固定的数据集,但却无法实现实际的排序列表?
这更像是一个理论/哲学问题,而不是一个实际问题,如果我更像一个数学家,我可能会证明/反驳这种可能性。有没有人问过这个问题,如果有的话,可以说些什么呢?
答案 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)
这个怎么样:
这是一种排序算法 - 猴子可能会做的那种。有没有保证你会到达排序列表?我不这么认为!
答案 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()