编程语言
首页 > 编程语言> > 关于中位数的问题 implemented by C++

关于中位数的问题 implemented by C++

作者:互联网

文章目录

中位数

对于一个有序序列来说,很简单,如果长度为 nnn 的话,那么中位数就是序列中 n/2n/2n/2 位置的数组元素了

一个序列的中位数

如果:

两个序列的中位数

合并序列找到中位数

如果我们希望找到两个有序序列的中位数的话,很快我们就可以想到,merge lists then find the median,将两个序列合并然后再找到中位数,这样的算法的复杂度自然就是序列合并算法的复杂度了,设两个序列的长度分别为m和n:
(0)O(N)=O(min(m,n)) O(N) = O(min(m, n)) \tag{0} O(N)=O(min(m,n))(0)
显然,这样的算法的复杂度就是 O(n)O(n)O(n),n的一次方的复杂度。这样我们自然会想到:我们能不能想到一个算法的复杂度是 logn\log{n}logn 呢?答案是肯定的。

不合并序列

基本思想

分别找到两个序列 A,BA,BA,B 的中位数a,ba,ba,b,然后:

重复以上过程,直到两个序列都只剩下一个元素,较小的一个即为中位数。

C++实现

我们还需要注意的是序列长度的奇偶性(partiality),我们需要根据序列长度确定是否要保留原来序列的中间点。
对于偶数,你可以简单的考虑剩下两个元素的情况,这个时候中间点就是第一个元素,那么自然的:

// ptr for starts and ends during the very iteration
int start_A = 0, end_A = length - 1, start_B = 0, end_B = length - 1;
int median_A = 0, median_B = 0;
// iterations
while(start_A != end_B && start_B != end_B){
	// get medians' position
	median_A = (start_A + end_A) / 2;
	median_B = (start_B + end_B) / 2;
	if(A[median_A] == B[median_B]){
		std::cout << A[median_A] << std::endl;
	}
	else if(A[median_A] > B[median_B]){
		if((end_A - start_A)%2 == 0){
			end_A = median_A;
			start_B = median_B + 1;
		}
		else{
			end_A = median_A;
			start_B = median_B;
		}
	}
	else{
		if((end_A - start_A)%2 == 0){
			end_B = median_B;
			start_A = median_A + 1;
		}
		else{
			end_B = median_B;
			start_A = median_A + 1;
		}
	}
}
std::cout << A[median_A] <= B[median_B]?A[median_A]:B[median_B] << std::endl;

标签:end,ba,median,中位数,C++,start,序列,implemented
来源: https://blog.csdn.net/Lyn_B/article/details/99635047