Clog n的一个算法问题的设计[C++代码]
Design of an algorithm problems of Clog n[C++ code]
两个排序的整数数组 A[1..N]
和 B[1..N]
以 升序 .
提供
Q:设计 一个 O(log N)-time
算法,用于找出所有 2N 个整数的 中位数 。 N可能不是2的幂.
为了简单起见,我们可以假设 O(1)
算法 return m
这样:
2^m < N < 2^m+1
我的问题:
N
不一定是2
的幂,什么意思? (明白了)
- 我不知道如何更改输入并使长度成为 2 的幂 找到
min
和 max
数组 A
和 B
. 中的元素
您可以使用二进制搜索方式在 O(logN)
时间内解决此问题。考虑以下两个数组:
1 1 2 2 3
1 2 3 4 5
现在合并的中位数是:
1 1 1 2 2 2 3 3 4 5 => 2
让我们看看如何找到它。首先猜测中位数是每个数组的中心:
1 1 2 2 3 => 2
1 2 3 4 5 => 3
从逻辑上讲,我们知道组合中位数不可能小于 小于 2 或 大于 小于 3。相反,它必须是在这两个值 之间的某处。所以我们可以丢弃第一个数组 smaller than 2 和第二个数组 larger than 3 的所有内容。这不会影响位置中位数,因为我们在合并中位数所在的 两侧 两侧丢弃了 相等 数量的元素。从概念上讲,这给我们留下了:
2 2 3 => 2
1 2 3 => 2
现在我们已经有了一致的中值,但基本思想是继续丢弃两个数组中每一个中的一半条目,直到我们有一个中值。
此算法的性能与二分查找一样好,即 O(logN)
。
两个排序的整数数组 A[1..N]
和 B[1..N]
以 升序 .
Q:设计 一个 O(log N)-time
算法,用于找出所有 2N 个整数的 中位数 。 N可能不是2的幂.
为了简单起见,我们可以假设 O(1)
算法 return m
这样:
2^m < N < 2^m+1
我的问题:
N
不一定是2
的幂,什么意思? (明白了)- 我不知道如何更改输入并使长度成为 2 的幂 找到
min
和max
数组A
和B
. 中的元素
您可以使用二进制搜索方式在 O(logN)
时间内解决此问题。考虑以下两个数组:
1 1 2 2 3
1 2 3 4 5
现在合并的中位数是:
1 1 1 2 2 2 3 3 4 5 => 2
让我们看看如何找到它。首先猜测中位数是每个数组的中心:
1 1 2 2 3 => 2
1 2 3 4 5 => 3
从逻辑上讲,我们知道组合中位数不可能小于 小于 2 或 大于 小于 3。相反,它必须是在这两个值 之间的某处。所以我们可以丢弃第一个数组 smaller than 2 和第二个数组 larger than 3 的所有内容。这不会影响位置中位数,因为我们在合并中位数所在的 两侧 两侧丢弃了 相等 数量的元素。从概念上讲,这给我们留下了:
2 2 3 => 2
1 2 3 => 2
现在我们已经有了一致的中值,但基本思想是继续丢弃两个数组中每一个中的一半条目,直到我们有一个中值。
此算法的性能与二分查找一样好,即 O(logN)
。