我一直试图理解为什么以下算法无效。
1) Calculate the medians m1 and m2 of the input arrays ar1[]
and ar2[] respectively.
2) If m1 and m2 both are equal then we are done.
return m1 (or m2)
3) If m1 is greater than m2, then median is present in one
of the below two subarrays.
a) From first element of ar1 to m1 (ar1[0...|_n/2_|])
b) From m2 to last element of ar2 (ar2[|_n/2_|...n-1])
4) If m2 is greater than m1, then median is present in one
of the below two subarrays.
a) From m1 to last element of ar1 (ar1[|_n/2_|...n-1])
b) From first element of ar2 to m2 (ar2[0...|_n/2_|])
5) Repeat the above process until size of both the subarrays
becomes 2.
6) If size of the two arrays is 2 then use below formula to get
the median.
Median = (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1]))/2
我的困难在于步骤3和4,它们是算法的核心。这是我的想法:
如果m1> m2然后m1大于合并数组中元素的一半,那么我们为什么要探索ar1 [0 ... | n / 2 |]?
答案 0 :(得分:2)
看一下下面的例子。它演示了您要询问的案例。
ar1[] = {6, 7, 8, 9, 10}
ar2[] = {1, 2, 3, 4, 5}
如果m1> m2然后m1大于合并数组中元素的一半,那么我们为什么要探索ar1 [0 ... | n / 2 |]?
理解此算法的关键是查看您在每个步骤中消除的内容,而不仅仅是您要保留的内容。确实,自m1 > m2
以来,我们知道m1
大于合并数组中元素的一半。但它并没有告诉我们与合并中位数m1
相关的位置。我们真正了解ar1
与合并中位数之间的关系,我们可以从m1
中删除大于m2
(并且小于ar2
)的所有内容。合并清单的中位数在剩下的位置。
ar1[] = {6, 7, 8}
ar2[] = {3, 4, 5}
答案 1 :(得分:2)
我们知道m1大于或等于ar1的前半部分。 m2和ar2也一样。同时我们也知道m1小于或等于ar1的后半部分。
让我们考虑案例m1>平方米
ar1: [.....m1.....]
ar2: [.....m2.....]
ar1+ar2: [.....m2..m1........]
让我们调用合并数组m *的中位数。由于ar1和ar2的前半部分在m1之前。我们有m1 => m *,这意味着在ar1中不需要考虑大于m1的值。所以我们只需要查看上半部分或ar1。
同样,由于ar1和ar2的后半部分位于m1之后,我们得到m2< = m *,这意味着不需要考虑小于m2的值,我们只需要查看下半部分AR2。
这正是第3步和第4步所做的。