假设我有n
个具有不同(可能是随机)权重的对象。对象标记为1
到n
,并且未对其进行排序。
我打算根据权重对n
个对象进行排序。我唯一拥有的工具是一个带有两个板的刻度,我可以通过它来成对地比较对象,然后注册成对的'日志上的结果。我想知道,在最坏情况中,我需要多少次按比例进行称重操作。
我认为这很难,我认为我必须进行称重操作的次数是
(n-1) + (n-2) + (n-3) + ... + 3 + 2 + 1 + 0
因此,结果将是(n-1)*n/2
。因此,大O将是O(n2)
但我不确定我的计算是否正确。我想知道是否有人可以建议这个解决方案是否错误。如果是这样,那么答案是正确的。
我的理由是,对于对象编号n
,我必须将它与n-1
对象进行比较,然后我将能够记录有多少对象比它更重/更轻。因此,我将知道对象n
在所有对象中的位置。
对于对象编号n-1
,我必须使用n-2
个对象进行称量操作...对象编号1
我必须使用0
进行称量操作对象。因此,总称重操作可能是:
(n-1) + (n-2) + (n-3) + ... + 3 + 2 + 1 + 0
答案 0 :(得分:4)
这是计算机科学的标准结果。您可以使用merge sort执行Θ(n log(n))
比较。
没有渐近更好的方法的证明如下:对象最初可以是n!
个不同的排列,并且单个称量最多可以将可能性的数量减半。所以log2(n!) = O(n log2(n))
是任何最优排序算法比较次数的最坏情况下限。
答案 1 :(得分:1)
您可以优化结果。结果将是O(nlogn)
。但怎么样?让我们看看,假设你已经平衡了i对象并对它们进行了排序..
1, 2, 3 ,4 , ...... , i.
现在,当您必须选择(i+1)th
时,您可以使用二进制搜索。首先从您选择的对象中选择中间对象,然后与当前对象进行比较,如果它比当前对象重,则对象将放置在中间的左侧,否则它将放置在中间的右侧。所以任何ith
对象都需要log(n)
个步骤。因此,对于n个对象,您需要O(nlogn)
个步骤。