打印
[其它应用]

两个有序数组求中位数

[复制链接]
407|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
onlycook|  楼主 | 2023-6-13 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
两个有序数组求中位数问题;
这个题有很多方法:
方法一:排序,找到中位数;
方法二:归并排序的思想
方法三:转换成求第k小值  
*/


/*
思路:使用二分查找,时间复杂度为log(m+n). 该方法的核心是将原问题转变成
一个寻找第k小数的问题(假设两个原序列升序排列),
这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的 问题,
原问题也得以解决。首先假设数组A和B的元素个数都大于k/2,
我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k /2小的元素
和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。
如果A[k/2-1]<B[k/2-1],这表示 A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。
换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将 其抛弃。
*/
#include<iostream>


using namespace std;


double findKth(int a[], int m, int b[], int n, int k)
{
if (m>n)
{
return findKth(b,n,a,m,k);
}


if (m==0)
{
return b[k-1];
}
if (k==1)
{
return min(a[0], b[0]);
}


int pa = min(k/2, m);
int pb = k - pa;
if (a[pa-1]<b[pb-1])
{
return findKth(a+pa, m-pa, b,  n, k-pa);
}
else if (a[pa-1]>b[pb-1])
{
return findKth(a, m, b+pb, n-pb, k-pb);
}
else
{
return a[pa-1];
}
}


class Solution
{
double findMedian(int A[], int m, int B[], int n)
{
int total = m + n;
if (total&0x1)
{
return findKth(A, m, B, n, total/2+1);
}
else
{
return (findKth(A, m, B, n, total / 2) + findKth(A,m,B,n,total/2+1))/2;
}
}
};

使用特权

评论回复
沙发
LLGTR| | 2023-7-24 15:40 | 只看该作者
这种算法就要看效率了。

使用特权

评论回复
板凳
heimaojingzhang| | 2023-7-25 09:02 | 只看该作者
如果是偶数个中位数的话 我们如何取舍呢

使用特权

评论回复
地板
keaibukelian| | 2023-7-25 12:19 | 只看该作者
在时间复杂度和空间复杂度之间如何做取舍呢

使用特权

评论回复
5
观海| | 2023-7-25 15:28 | 只看该作者
对单片机的压力最小的算法是哪种呢

使用特权

评论回复
6
paotangsan| | 2023-7-25 15:40 | 只看该作者
哪种算法所耗费的资源比较少?哪种的算法又是最快的呢

使用特权

评论回复
7
guanjiaer| | 2023-7-25 19:40 | 只看该作者
使用哪种方法来解决问题 还得看数组的规模吧

使用特权

评论回复
8
micoccd| | 2023-7-26 13:50 | 只看该作者
我都是冒泡,然后找,高级点的不太会

使用特权

评论回复
9
OKAKAKO| | 2023-9-26 10:03 | 只看该作者
基本排序算法

使用特权

评论回复
10
小夏天的大西瓜| | 2023-9-27 13:14 | 只看该作者
简单的冒泡或比较大小排序,再找值

使用特权

评论回复
11
星辰大海不退缩| | 2023-9-27 16:45 | 只看该作者
递归法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

393

主题

1480

帖子

3

粉丝