algorithm - 如何使用2n / 3比较对0/1数组进行排序?

时间:2012-04-01 14:39:58

标签: algorithm sorting data-structures

Algorithm Design Manual中,有这样的消费税

  

4-26考虑使用排序n 0和1的序列的问题   比较。对于两个值x和y的每个比较,算法   学习x< y,x = y或x>你持有。

     

(a)给出一个算法,在最坏的情况下进行n-1次比较。   表明您的算法是最佳的。

     

(b)给出算法在平均情况下进行2n / 3次比较的排序   (假设n个输入中的每一个都是0或1,概率相等)。节目   你的算法是最优的。

对于(a),我认为这很容易。我可以选择[n-1]作为枢轴,然后执行类似于快速分区的操作,扫描0到n - 2,找到左侧全部为0且右侧全部为1的中间点,这需要进行n - 1次比较

但对于(b),我无法得到线索。它说“n个输入中的每一个都是0或1,概率相等”,所以我想我可以假设0和1的数字相等?但是我怎样才能得到与1/3相关的结果?将整个阵列分成3组?

由于

2 个答案:

答案 0 :(得分:11)

" 0或1,概率相等"是"平均值"案件。其他情况可能会有更糟糕的时机。

提示1:2/3 = 1/2 + 1/8 + 1/32 + 1/128 + ......

提示2:将序列视为一对序列并比较每对中的项目。一半将返回平等;一半不会。在不相等的一半中,你知道该对中的哪个项目是0,哪个是1,所以那些不需要进行比较。

答案 1 :(得分:0)

不,这意味着在任何位置,您都有相同的机会(概率)输入值为0或1.这为您提供了第一条线索: 您的算法将被随机化。

运行时将依赖于某个随机变量,您需要采用预期值来获取 平均复杂度 。请注意,在这种情况下,您必须在复杂性分析期间进行详细说明,因为它们需要精确的常量(2/3n而不仅仅是O(n)

修改
提示 即可。在排序后的数组(最后得到的数组)中,只有两种可能的元素,才会发生变化。