中位数问题:
第一题:
给定一个集合,首先该集合为空,之后不断往集合中加入整数,请依次输出每次加入一个整数后,集合里的中位数,请给出你的算法。如下面的例子
集合 中位数
{1} 1
{1,2} 1
{1,2,4} 2
{1,2,4,7} 2
{1,2,4,7,13} 4
思路:
每次插入一个元素,用二分插入法找到其位置,然后取出下标为 n/2的元素作为中位数
package org.jyjiao;
import java.util.List;
import java.util.*;
public class Mid1{
List<Integer> list=new ArrayList<Integer>();
int getPosition(int data,int left,int right){
int p=-1;
int mid,mid_data;
while(left<=right){
mid=(left+right)/2;
mid_data=list.get(mid).intValue();
if(data==mid_data){
p=mid;
break;
}else if(data>mid_data){
left=mid+1;
}else{
right=mid-1;
}
}
if(left>right){
p=left;
}
return p;
}
public void displayMid(int n){
int i=0;
int a;
while(i<n){
a=(int)(Math.random()*100);
if(i==0){
list.add(a);
System.out.println(a+":"+list);
}else{
int index=getPosition(a,0,list.size()-1);
if(index==list.size()){
list.add(new Integer(a));
}else{
int len=list.size();
list.add(list.get(len-1));
for(int j=len-1;j>index;j--){
list.set(j,list.get(j-1));
}
list.set(index,new Integer(a));
}
System.out.println(list.get(list.size()/2)+":"+list);
}
i++;
}
}
public static void main(String[] args){
Mid1 m=new Mid1();
m.displayMid(10);
}
}
注:这道题用LinkedList, 效率会高很多:
package org.jyjiao;
import java.util.List;
import java.util.*;
public class Mid12{
List<Integer> list=new LinkedList<Integer>();
int getPosition(int data,int left,int right){ //二分插入求新数据的位置
int p=-1;
int mid,mid_data;
while(left<=right){
mid=(left+right)/2;
mid_data=list.get(mid).intValue();
if(data==mid_data){
p=mid;
break;
}else if(data>mid_data){
left=mid+1;
}else{
right=mid-1;
}
}
if(left>right){
p=left;
}
return p;
}
public void displayMid(int n){
int i=0;
int a;
while(i<n){
a=(int)(Math.random()*100);
if(i==0){
list.add(a);
System.out.println(a+":"+list);
}else{
int index=getPosition(a,0,list.size()-1);
/*if(index==list.size()){
list.add(new Integer(a));
}else{
int len=list.size();
list.add(list.get(len-1));
for(int j=len-1;j>index;j--){
list.set(j,list.get(j-1));
}
list.set(index,new Integer(a));
}
*/
list.add(index,new Integer(a)); //改为这样
System.out.println(list.get(list.size()/2)+":"+list);
}
i++;
}
}
public static void main(String[] args){
Mid1 m=new Mid1();
m.displayMid(10);
}
}
-----------------------------------------------------------------------------------------------------------
第二题:
两个有序数组A和B,求归并后的中位数,O(logn)算法
思路:
若A和B的长度都为1,则令归并后的中位数为B中的元素 若A和B的长度大于1,用O(1)的复杂度,从A和B中选出各自的中位数,假设为m,n 若m==n,则归并后的中位数仍然为m,结束 若m<n,则保留A中大于等于m的数,B中小于等于n的数,递归,直到m==n,或者某个集合的长度减为1 若m>n,则保留A中小于等于m的数,B中大于等于n的数,递归,停止条件同上。
|
package org.jyjiao;
public class Max3 {
int getMid(int[] array1, int[] array2, int l1, int r1, int l2, int r2) {
int mid1, mid2, mid_data = -1;
if (l1 == r1) {
mid_data = array1[l1];
} else if (l2 == r2) {
mid_data = array2[l2];
} else {
mid1 = (l1 + r1) / 2;
mid2 = (l2 + r2) / 2;
if (array1[mid1] == array2[mid2]) {
mid_data = array1[mid1];
} else if (array1[mid1] < array2[mid2]) {
l1 = mid1;
r2 = mid2;
mid_data=getMid(array1, array2, l1, r1, l2, r2); //注意返回值
} else {
r1 = mid1;
l2 = mid2;
mid_data=getMid(array1, array2, l1, r1, l2, r2);
}
}
return mid_data;
}
public static void main(String args[]) {
int[] array1 = {1,3,5,7,9,11,13};
int[] array2 = {2,4,6,8,10,12,16};
Max3 m=new Max3();
int mid=m.getMid(array1,array2,0,array1.length-1,0,array2.length-1);
System.out.println("mid="+mid);
}
}
-------------------------------------------------------------------------------------------------------------
第三题:求无序数组的中位数:
即求第 n/2大的数,平均复杂度为: n+n/2+n/4+n/8+...=2n
package org.jyjiao;
public class Mid2 {
int partion(int[] array,int left,int right){
int index=-1;
int mid=(left+right)/2;
int mdata=array[mid];
array[mid]=array[right];
array[right]=mdata;
int i=left,j=right;
while(i<j){
while((array[i]<mdata)&&(i<j)){
i++;
}
if(i<j){
array[j]=array[i];
j--;
}
while(array[j]>mdata&&(i<j)){
j--;
}
if(i<j){
array[i]=array[j];
i++;
}
}
array[i]=mdata;
index=i;
System.out.println("i="+i+"j="+j);
return index;
}
int getMid(int[] array,int left,int right){
int ret=-1;
int mid=(array.length-1)/2;
while(true){
ret=partion(array,left,right);
if(ret==mid){
ret=mid;
break;
}else if(ret<mid){
left+=1;
}else{
right-=1;
}
}
return array[ret];
}
public static void main(String[] args){
int[] array={1,53,95,7,-19,32,4,56,81,10,22,12};
Mid2 m=new Mid2();
int ret=m.getMid(array,0,array.length-1);
System.out.println("ret="+ret);
}
}
变种:http://blog.chinaunix.net/u3/94271/showart_2020121.html
分享到:
相关推荐
在统计学中,中位数和四分位差是两种重要的集中趋势和分散度测量方法。它们被广泛用于描述和理解数据集的特征,尤其是在非正态分布或存在极端值的情况下。SPSS(Statistical Product and Service Solutions)是一款...
3. 由分组资料确定中位数由组距数列确定中位数,应先按的公式求出中位数所在组的位置,然后再按下限公式或上限公式确定中位数。 下限公式:Me = L + (fm / 2 - 1) / d × (U - L) 上限公式:Me = U - (fm / 2 - 1)...
在编程领域,寻找两个有序序列的中位数是一项常见的任务,尤其在算法设计和数据分析中。这个题目要求我们使用C++编程语言来实现一个减治法(Divide and Conquer,也译为分治法)的解决方案。减治法是一种有效的算法...
### 线性时间选择中位数算法 #### 实验目的 1. **掌握线性时间选择的基本算法及其应用:** 线性时间选择算法是一种可以在平均或最坏情况下达到线性时间复杂度的选择算法,它主要用于在无序数组中找到第k小的元素。...
### 分治法求解两个有序数组的中位数 #### 分治法简介 分治法是一种重要的算法设计思想,其核心在于将一个复杂的问题分解成若干个规模较小但结构相似的子问题,然后递归地解决这些子问题,并将各个子问题的解组合...
在计算机科学领域,算法是解决问题的关键工具,而中位数作为一种重要的统计概念,常常被用于数据分析和算法设计中。本文将深入探讨如何在给定两个升序序列的情况下找到它们的中位数。升序序列意味着元素按从小到大的...
根据给定文件的信息,本文将深入探讨一种时间复杂度为O(n)的寻找中位数算法,并通过具体的源代码示例来分析其工作原理及实现细节。 ### 时间复杂度为O(n)的找中位数算法 #### 一、算法背景与目标 在计算机科学中...
在C语言中,中位数是指一组数据按照升序或降序排列后位于中间位置的数值。如果数据的个数是奇数,则中位数是正中间的那个数;如果是偶数,则中位数通常取中间两个数的平均值。这个题目涉及到的核心知识点包括数组...
试设计一个O(log n)时间的算法,找出X 和Y 的2n 个数的中位数。 ★数据输入 输入数据第1 行是每个数组中元素个数n;接下来的2 行中每行有n 个整数,分别为X和Y 中元素。 ★数据输出 将计算出的X 和Y 的中位数保留一位...
条件中位数是一种在可靠性工程中广泛使用的统计方法,尤其适用于处理无失效数据的情况。它在分析系统可靠性时,能够估计在特定条件下系统的寿命分布。本文档“条件中位数及其改进算法的Matlab实现”提供了如何利用...
在C/C++编程中,求一个整数数组的中位数是一项常见的任务,尤其是在数据分析、算法竞赛或处理统计信息时。中位数是将一组数值从小到大排列后处于中间位置的数,当数值个数为奇数时,中位数是正中间的那个数;如果是...
C的平均数中位数众数,想到ing却平均数中位数众数,平均数中位数众数。平均数中位数众数,平均数中位数众数。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] ...
"带权中位数查找O(n)C++"是一个关于高效算法实现的话题,它涉及到如何在一组数据中快速找到带权重的中位数,且该过程的时间复杂度仅为线性,即O(n)。下面将详细解释这个概念及其在C++中的实现。 首先,我们要明确...
由于给出的文件内容是OCR扫描的结果,存在一些文字识别错误或漏识别,但可以确定的是,文件内容涉及到中考数学试题中平均数、中位数、众数、方差等统计概念的应用。以下将详细介绍这些知识点: 1. 平均数(Mean):...
《中位数问题分析》 在信息技术领域,处理大规模数据并从中提取关键信息是一项常见的挑战。本文主要探讨了如何在内存有限的情况下,高效地从大量无序整数中找到中位数。这个问题的核心在于,即使面对无法直接放入...
中位数问题是一个经典的问题,特别是在数据处理和排序算法中。本篇文章将详细探讨C++实现的中位数算法,并结合提供的压缩包文件进行解析。 中位数是指一组数值序列中处于中间位置的数,当数值个数为奇数时,中位数...
中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
在AVL树中查找中位数是一项关键的操作,因为中位数是排序数据的重要统计量,常用于数据分割、快速查找等。中位数在AVL树中的定义可能略有不同,因为树中的节点可能有重复值。如果树允许重复节点,并且我们要找到的是...
在统计学中,中位数是一组数值中间的数,将这组数分为相等的两部分,一半的数比中位数小,另一半则比中位数大。对于两个等长的有序序列,我们可以直接取它们中间位置的数作为中位数,如果序列长度为奇数,则中位数是...