如何在O(logn)时间内找到5个排序列表的中位数?

时间:2012-01-30 00:49:40

标签: algorithm median

以下是问题:

有5个排序列表A,B,C,D,E,它们具有相同的长度n。问题是找到一个算法,该算法可以在O(logn)时间内对这5个列表进行中值。我正在考虑一个大致的想法,但我无法弄清楚它需要的确切复杂性。

假设A,B,C,D,E的中位数是a,b,c,d,e。我们有a<b<c<d<e。很明显,我可以扔掉阵列A的前半部分和阵列E的后半部分。现在我有5个新阵列:B,C,D保持不变,每个都有n个数字; A'和E'每个都有n / 2个数字。然后我将A'和E'的中位数计算为'和e',将它们与b,c,d进行比较。如果5个中位数的新顺序为a'<b<e'<c<d,那么我将通过'(n / 4个数字)的前半部分和数组D的最后n / 4个数,因为我们需要丢弃相同的数字最终中位数的两边。这个过程继续......

我有种感觉算法是O(logn)。但我不知道确切的证据。在第一个登录步骤中,我们肯定可以将候选数字减少到3n,将5个列表中的所有剩余数字相加。我们第一次踢出n个数字,第二次至少有n / 2个数字,第三次是n / 4个数字,依此类推。但是,在我得到3n个剩余数字后,我不知道如何分析。

这个算法能不能给我O(logn)?

1 个答案:

答案 0 :(得分:2)

是的,它实际上可以。看看那些陈述

  • 只有我们有一个清单才能得到最终结果。除非我们至少有两个清单,否则我们不能谈论这个。
  • 算法的每一步我们都减少了两半的列表。如果列表中只有一个元素,我们将删除整个列表。
  • 让我们算一下,删除列表需要多少步骤。在我们最终删除列表时,在第一次删除时,我们将删除n / 2个项目,第二个 - n / 4,依此类推,直到剩下一个元素。这将需要log(n)操作(不知道它是真的log(n)还是log(n)+1,但在两种情况下它都是O(log(n)))。
  • 因此,我们需要消除5个列表(在最后列表中查找中值的操作可以推广到减少列表的操作)。需要O(log(n))来消除其中一个,所以我们也会在O(log(n))中做所有的事情,因为5是常数。