利用分治法来求两个排序数组的中位数
2015-12-20 20:23
411 查看
有两个数组 ar1[] 和ar2[] 两个数组的长度都为n
求ar1[]和ar2[]的中位数
可以借鉴归并排序的思想 实质上就是将将两个已经排好序的数组 合并成一个数组 的过程只是在这个过程中添加了一个计算从小到大的次序的数
(count ) 当count =n 和n+1时记录下这两个数 然后在这两个数中间取平均值 就可以了 但是这个算法的复杂度是o(n)
如果我们想达到log(n)的复杂度的话 则可以用分治法来实现
求出 ar1[]的中位数 m1 ar2[]的中位数 m2
1.如果m1==m2 则返回m1就可以了
2.如果m1>m2 则取ar1[]中的前半部分和 m2中的后半部分 作为新的数组
3.如果m1
求ar1[]和ar2[]的中位数
可以借鉴归并排序的思想 实质上就是将将两个已经排好序的数组 合并成一个数组 的过程只是在这个过程中添加了一个计算从小到大的次序的数
(count ) 当count =n 和n+1时记录下这两个数 然后在这两个数中间取平均值 就可以了 但是这个算法的复杂度是o(n)
如果我们想达到log(n)的复杂度的话 则可以用分治法来实现
求出 ar1[]的中位数 m1 ar2[]的中位数 m2
1.如果m1==m2 则返回m1就可以了
2.如果m1>m2 则取ar1[]中的前半部分和 m2中的后半部分 作为新的数组
3.如果m1
int median(int arr[], int n) { if (n%2 == 0) return (arr[n/2] + arr[n/2-1])/2; else return arr[n/2]; } int getMedian(int ar1[], int ar2[], int n) { int m1; int m2; if (n <= 0) return -1; if (n == 1) return (ar1[0] + ar2[0]) / 2; if (n == 2) return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2; m1 = median(ar1, n); m2 = median(ar2, n); /* 相等可直接返回 */ if (m1 == m2) return m1; if (m1 < m2) { if (n % 2 == 0) return getMedian(ar1 + n/2-1, ar2, n/2 + 1); else return getMedian(ar1 + n/2, ar2, n/2+1); } else { if (n % 2 == 0) return getMedian(ar2 + n/2-1, ar1, n/2+1); else return getMedian(ar2 + n/2, ar1, n/2+1); } } int main() { int ar1[] = {1, 12, 10, 26, 38}; int ar2[] = {2, 13, 17, 30, 45}; int n1 = sizeof(ar1)/sizeof(ar1[0]); int n2 = sizeof(ar2)/sizeof(ar2[0]); if (n1 == n2) printf("Median is %d", getMedian(ar1, ar2, n1)); else printf("Doesn't work for arrays of unequal size"); return 0; }
相关文章推荐
- HTML笔记摘录
- jQuery之imgAreaSelect插件使用方法
- uva 10120——Gift?!
- 修改unity GI cache位置
- JavaWeb--概述
- PHP$this的用法和访问限定符
- 【Mysql】Mysql数据表区分大小写问题解决方案
- 2015总结和2016展望
- Apache Mesos 和数据中心操作系统的崛起
- Lex使用指南
- CSDN-markdown语法之怎样使用LaTeX语法编写数学公式
- 信息安全系统设计基础期末总结
- Node.js转化GBK编码 - iconv-lite
- 数据结构实验之排序五:归并求逆序数
- VIJOS1456最小总代价
- POJ 1001 解题报告
- LDR ADR
- 苹果的开发者账号
- html5声频audio和视频video
- 【mysql】高可用集群之MMM