找出两个已排序且同序大小相等的数组的中位数C语言
2011-05-03 15:15
225 查看
给定两个 int 数组,都是已按照升序排好序的,并且大小相同,都是 N.在 O(log2 N)时间找出它们的中位数.搞得略头疼.但总算还是写出了代码.思想上就是,二分查找.虽然我起初用的是顺序查找.看来我的头脑还停留在线性比较上.
新的数组,假想的这个两个数组合并了的数组.其个数为偶数个,取下中位数.根据已知条件,大小相等,且都已按照升序排序.那么,如果当前查看的数是要找的中位数,则它应该满足,大于所有 2N 个数中的 N - 1 个, 并且小于其余的 N 个.这样的话,在它本身数组中,已经有了一部分,另外的一部分,应在另一个数组中.如果当前查看的树的索引为 middle, 当前查看的数组为A,另一个为B.那么,A[middle] >= A[x] {x | 0 < x < middle}.A[middle] >= B[x] {x | 0 < x < middle - 1}.这就是前面所说的大于所有 2N 个数种的 N - 1个;接下来,A[middle] <= A[x] {x | middle < x < N}.A[millde] < B[x] {x | <= middle < N}.也即小于其余的 N 个.只有在这两个条件都得到满足的情况下,A[middle]是要找的中位数.这就是我所能给出的全部分析了,接下来的部分,我的话其实很无力.因为个中道理,我都没有搞懂.所以也就不胡言乱语了.不过好像,已经胡言乱语好一阵了...
呵呵,贴代码了.
新的数组,假想的这个两个数组合并了的数组.其个数为偶数个,取下中位数.根据已知条件,大小相等,且都已按照升序排序.那么,如果当前查看的数是要找的中位数,则它应该满足,大于所有 2N 个数中的 N - 1 个, 并且小于其余的 N 个.这样的话,在它本身数组中,已经有了一部分,另外的一部分,应在另一个数组中.如果当前查看的树的索引为 middle, 当前查看的数组为A,另一个为B.那么,A[middle] >= A[x] {x | 0 < x < middle}.A[middle] >= B[x] {x | 0 < x < middle - 1}.这就是前面所说的大于所有 2N 个数种的 N - 1个;接下来,A[middle] <= A[x] {x | middle < x < N}.A[millde] < B[x] {x | <= middle < N}.也即小于其余的 N 个.只有在这两个条件都得到满足的情况下,A[middle]是要找的中位数.这就是我所能给出的全部分析了,接下来的部分,我的话其实很无力.因为个中道理,我都没有搞懂.所以也就不胡言乱语了.不过好像,已经胡言乱语好一阵了...
呵呵,贴代码了.
/* 9.3-8-2011-05-03-12.56.c -- 第九章第三题 */ #include <stdio.h> #define SIZE (8) #define FAILED (-1) int main (void) ; int median (const int * const arrayA, const int * const arrayB, int left, int right) ; int main (void) { int arrayA[SIZE] = {1, 2, 4, 6, 8, 9, 11, 13} ; int arrayB[SIZE] = {2, 5, 5, 7, 7, 9, 10, 14} ; int size = SIZE ; int value ; value = median (arrayA, arrayB, 0, size - 1) ; if (FAILED == value) value = median (arrayB, arrayA, 0, size - 1) ; printf ("%d/n", value) ; return 0 ; } int median (const int * const arrayA, const int * const arrayB, int left, int right) { int size ; int middle ; size = right - left + 1 ; while (left <= right) { middle = (left + right) / 2 ; if (middle == size - 1) { if (arrayA[middle] <= arrayB[0]) return arrayA[middle] ; else return FAILED ; } else if (arrayA[middle] >= arrayB[right - middle - 1]) { if (arrayA[middle] <= arrayB[right - middle]) return arrayA[middle] ; else right = middle - 1 ; } else left = middle + 1 ; } return FAILED ; }
相关文章推荐
- 找出两个排序数组的中位数
- #google面试题14#找出两个排序数组的合并后的中位数
- 求两个大小为n的已排序数组的中位数
- 求两个相同大小已排序数组中的中位数
- [leetcode] Median of Two Sorted Arrays 两个排序数组找出第k个数,或者中位数
- [各种面试题] 两个排序数组的中位数
- 找出两个数组中相同的元素,不排序直接两次循环取出
- 两个已排序数组,找出相同的部分
- LeetCodeLeetCode 两个排序数组的中位数问题
- 两个排序数组的中位数
- 找出两个排序数组中排在第k位置的数
- 排序数组,找出两个和等于指定数
- leetcode题目 寻找两个排序数组的中位数
- [LeetCode] Median of Two Sorted Arrays 两个排序数组的中位数
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 两个排序数组的中位数
- 两个排序数组的中位数
- 找两个排序数组的中位数
- leetcode解题之4. Median of Two Sorted Arrays java (两个排序数组的中位数)
- 第十五周 项目一拓展:重载[],使得Array对象也可以如C++普通数组一样,用a[i]形式取出值,重载+,使两个Array对象可以整体相加(前提大小相等)