在两个排序数组中实现查找中位数的solution非常棒。但是,我仍然对计算 K
的代码感到困惑var aMid = aLength * k / (aLength + bLength)
var bMid = k - aMid - 1
我想这是这个算法的关键部分,我真的不知道为什么这样计算。为了更清楚地解释我的意思,核心逻辑是分而治之,考虑到不同大小 列表应该区别对待的事实。我想知道为什么这个公式运作得很好。
有人可以给我一些有关它的见解。我搜索了很多在线文档,很难找到材料来解释这部分。
非常感谢提前
答案 0 :(得分:1)
该链接显示了计算每个数组中比较点的两种不同方法:一个总是使用k/2
,即使数组没有那么多元素;另一个(你引用)试图根据数组的大小分配比较点。
从这两个例子中可以看出,两者都不是最优的,只要两个分量的大小在K中是一般的线性,计算比较点的方式并没有多大差别。例如,对于其中一个比较点,使用固定大小为5的情况。)
该算法在每次迭代时通过aMid或bMid有效地减小了问题的大小。理想情况下,问题大小将减少k / 2;如果两个阵列至少有k / 2个成员,则应该使用这个计算。如果一个有两个成员,你可以将数组的比较点设置为它的最后一个元素,并计算另一个比较点,使总数为k - 1.如果最终丢弃某个数组中的所有元素,然后可以立即返回另一个数组的元素k。
该策略通常会比链接中的任何一个提议执行更少的迭代,但它仍然是O(log k)。