精华内容
下载资源
问答
  • includeusing namespace std;void Mid(int a[],int aleft,int aright,int b[],int bleft,int bright){double mid;int n=aright-aleft+1;int k1=(aleft+aright)/2;int k2=(bleft+bright)/2;if(aright-aleft==1&...

    include

    using namespace std;

    void Mid(int a[],int aleft,int aright,int b[],int bleft,int bright)

    {

    double mid;

    int n=aright-aleft+1;

    int k1=(aleft+aright)/2;

    int k2=(bleft+bright)/2;

    if(aright-aleft==1&&bright-bleft==1)

    {

    cout<

    return ;

    }

    if((aleft==aright)&&(bleft==bright))

    {

    mid=(a[aleft]+b[bleft])/2.0;

    cout<

    return;

    }

    else

    {

    if(a[k1]==b[k2])

    {

    mid=a[k1];

    cout<

    }

    if(a[k1]

    {

    Mid(a,k1,aright,b,bleft,k2);

    //cout<

    }

    if(a[k1]>b[k2])

    {

    Mid(a,aleft,k1,b,k2,bright);

    //cout<

    }

    }

    }

    int main()

    {

    int a[]={1, 12, 15, 26, 38};

    int b[]={13, 14, 40, 42, 45};

    Mid(a,0,4,b,0,4);

    system("pause");

    }

    展开全文
  • 利用分治策略试设计一个O (log n)时间的要输入的内容在文件1.txt,输出的结果在文件2.txt。#include#includeusing namespace std;template T mid(T *a,T *b,int len){if(len==1)return *aif(len==2){int temp=*a...

    利用分治策略试设计一个O (log n)时间的

    要输入的内容在文件1.txt中,输出的结果在文件2.txt中。

    #include

    #include

    using namespace std;

    template

    T mid(T *a,T *b,int len)

    {

    if(len==1)

    return *a

    if(len==2)

    {

    int temp=*a>=*b?*a:*b;

    if(temp==*a)

    return temp

    else

    return temp

    }

    int n;

    if(len%2==0)

    n=len/2;

    else

    n=len/2+1;

    if(*(a+n-1)==*(b+n-1))

    return *(a+n-1);

    else if(*(a+n-1)

    return mid(a+n-1,b,n);

    else if(*(a+n-1)>*(b+n-1))

    return mid(a,b+n-1,n);

    }

    int main()

    {

    int a[5];

    int b[5];

    ifstream f1("1.txt");

    ofstream f2("2.txt");

    int len;

    f1>>len;

    for(int i=0;i

    f1>>a[i];

    for(i=0;i

    f1>>b[i];

    int *pa=a;

    int *pb=b;

    int m=mid(pa,pb,len);

    cout<

    f2<

    f1.close();

    f2.close();

    return 1;

    }

    运行结果:

    0_13294616297q0V.gif

    展开全文
  • 算法实验之分治法求中位数

    千次阅读 2012-04-14 00:45:58
    利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。 要输入的内容在文件1.txt中,输出的结果在文件2.txt中。 [cpp] view plaincopy #include  #include  using ...
    
    

    利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。

    要输入的内容在文件1.txt中,输出的结果在文件2.txt中。

    1. #include<iostream>  
    2. #include<fstream>  
    3. using namespace std;  
    4. template <class T>  
    5. T mid(T *a,T *b,int len)  
    6. {  
    7.     if(len==1)  
    8.         return *a<*b?*a:*b;  
    9.     if(len==2)  
    10.     {  
    11.         int temp=*a>=*b?*a:*b;  
    12.         if(temp==*a)  
    13.             return temp<*(b+1)?temp:*(b+1);  
    14.         else  
    15.             return temp<*(a+1)?temp:*(a+1);  
    16.     }  
    17.     int n;  
    18.     if(len%2==0)  
    19.         n=len/2;  
    20.     else  
    21.         n=len/2+1;  
    22.     if(*(a+n-1)==*(b+n-1))  
    23.         return *(a+n-1);  
    24.     else if(*(a+n-1)<*(b+n-1))  
    25.         return mid(a+n-1,b,n);  
    26.     else if(*(a+n-1)>*(b+n-1))  
    27.         return mid(a,b+n-1,n);  
    28.   
    29. }  
    30. int main()  
    31. {  
    32.     int a[5];  
    33.     int b[5];  
    34.     ifstream f1("1.txt");     
    35.     ofstream f2("2.txt");  
    36.     int len;  
    37.     f1>>len;  
    38.     for(int i=0;i<len;i++)  
    39.         f1>>a[i];   
    40.     for(i=0;i<len;i++)  
    41.         f1>>b[i];  
    42.     int *pa=a;  
    43.     int *pb=b;  
    44.     int m=mid(pa,pb,len);  
    45.     cout<<m<<endl;  
    46.     f2<<m;  
    47.     f1.close();  
    48.     f2.close();  
    49.     return 1;  
    50. }  

    运行结果:

    展开全文
  • 问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的...求中位数的算法是这样的,若n是奇数,即数组X和Y中各有奇数个数字,因为X和Y已经排好序了,所以去数组下标为(n-1)/2处的数即为中位数。若n是...

    问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数。试设计一个O(logn)时间的分治算法,找出XY的2n个数的中位数

    思想:

    对于数组X[0:n-1]和Y[0:n-1]先分别找出X和Y的中位数xa和yb。求中位数的算法是这样的,若n是奇数,即数组X和Y中各有奇数个数字,因为X和Y已经排好序了,所以去数组下标为(n-1)/2处的数即为中位数。若n是偶数,则取(n-1)/2向下取整和向上取整这两个位置的数的平均值作为中位数。

    两者进行比较,

    (1)若xa=yb则xa或者xb即为整个2n个数中的中位数,算法结束。因为:若每个数组中数字的个数是偶数个,则X中小于中位数的有n/2个,大于中位数的有n/2个,同理Y也是如此,所以在整个2n数组中比xa=yb小的共有n个数,比n大的共有n个数,即为中位数。若每个数组中数字的个数是奇数,则X中小于xa的有(n-1)/2个,大于xa的也有(n-1)/2个,同理Y中也是如此,所以对于xa或者是yb则整个2n数组中小于和大于他们的数分别为(n-1)个,取这两个数的平均值(xa+yb)/2=xa=yb即为中位数.

    (2) 若xa>yb,则说明整个2n个数的的中位数一定在X数组的前一半和Y数组的后一半中,因为:若中位数在X数组的中位数之后,则比它小的数共有X数组中大于n/2个数以及Y数组中大于n/2个数总计超过了n个数,不符合中位数的定义。若中位数是在Y数组的前一半之中,则比它大的数字共有Y中包括中位数在内的后半部数加上X数组包括中位数在内的后半部,这样也超过了n个数,不符合中位数的定义。

    (3) 若xa<yb,则同上理由,整个2n的数的中位数应该在X数组的后一半和Y数组的前一半中。

    确定中位数所在的数组范围后,递归调用求中位数算法对这个范围的数组求中位数重复上述过程,直至:

             1.出现xa=yb情况,找到了中位数算法结束。

        2.数组分割至左右两部数组只有一个数字的情况,求其平均值即为中位数

     

    代码:

     1 /*
     2 思路:求两有序数组x和y的第k个数,思路如下:
     3 若k为1,则返回两数组的最小值
     4 取x的第i个数x0,取y的第(k-i)个数y0
     5 若x0=y0,则x0即为所求
     6 若x0<y0,则丢弃x的前i个数,k=k-i,递归
     7 若x0>y0,则丢弃y的前(k-i)个数,k=i,递归
     8 */
     9 import java.util.Scanner;
    10 import java.util.List;
    11 import java.util.ArrayList;
    12 
    13 public class Solution{
    14    
    16     public int findOneSideMedian(int a[]){
    17         int mid;
    18         int length=a.length;
    19         //if(a[])数组长度a.length
    20         if((length&0x01)==0){//判断子数组的长度是奇数还是偶数
    21             mid=(a[length/2]+a[length/2-1])/2;
    22         }else{
    23             mid=a[length/2];
    24         }
    25         return mid;
    26     }
    27     
    28     public double findMedian(int x[],int y[] int n){
    29         if(n==0){
    30             break;
    31         }
    32         int mid_x=findOneSideMedian(x);
    33         int mid_y=findOneSideMedian(y);
    34         if(n==1){
    35             return (mid_x+mid_y)/2;
    36         }
    37         if(mid_x==mid_y){
    38             return mid_x;
    39         }else if(mid_x>mid_y){
    40             int[] x2=Arrays.copyOfRange(x,0,n/2);
    41             int[] y2=Arrays.copyOfRange(y,Math.ceil(n/2),n);
    42             n=n/2;
    43             findMedian(x2,y2,n);
    44         }else if(mid_x<mid_y){
    45             int[] x2=Arrays.copyOfRange(x,Math.ceil(n/2),n);
    46             int[] y2=Arrays.copyOfRange(y,0,n/2);
    47             n=n/2;
    48             findMedian(x2,y2,n);
    49         }
    50     }
    51 }

    转载于:https://www.cnblogs.com/f91og/p/6022464.html

    展开全文
  • 问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有...求中位数的算法是这样的,若n是奇数,即数组X和Y中各有奇数个数字,因为X和Y已经排好序了,所以去数组下标为(n-1)/2处的数即为中位数。若n是偶数,则取(n-1...
  • (1)设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数,设计一个算法复杂度为O(logn)的分治算法,找出X和Y中2n个数中的中位数。(中位数:个数为奇数:中间位置上的数;个数为偶数,中间两个数的...
  • 分治法中位数问题,C++

    千次阅读 2019-04-12 19:00:13
    采用分治法完成如下任务:...利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。 数据输入 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两...
  • 分治法求两个有序数组的中位数 算法步骤(基本原理是获取第k小的数) 先取两个中间索引x_mid,y_mid; 下面来比较 如果x[x_mid]比较小,那么就看x_mid最大是第几小(记作m) ①m<k; 则把x_mid及以前的全部删除,...
  • 分治法寻找两个有序数组的中位数 题意 给定两个大小为 m 和 n 的有序数组A 和 B。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 保证A 和 B 不会同时为空。 样例1 A = [1, 3] B=...
  • 也是看了一篇很好的博客,思路很清晰,只是有些地方感觉博主没有详细解释...请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。示例 1:nums1[1,3]nums2[2]中位数:2.0示例 2:nums1[1,2]nums2[...
  • 一个数组的中位数 if (judge(y - x + 1 )) // a查询个数为偶数 return (a[(y + x) / 2 ] + a[(y + x) / 2 + 1 ]) / 2.0 ; // a中位数 else return a[(y + x) / 2 ]; } int find( ...
  • 输入两段相同长度的正序序列,出合并后的中位数,例如: //input.txt 2 5 15 3 21 //output.txt 5 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_SIZE 1000 4 ...
  • 可以直接中位数 { cout "mid=" ( max ( a [ aleft ] , b [ bleft ] ) + min ( a [ aright ] , b [ bright ] ) ) / 2.0 endl ; return ; } if ( ( aleft == aright ) && ( b...
  • 利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。  数据输入 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。...
  • 利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。 « 数据输入 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的...
  • 所谓分治法就是将相邻得两相加,然后再相加,得到得就是 二进制1得个。int Function(unsigned int n) { n = (n & 0x55555555) + ((n >> 1) & 0x55555555); n = (n & 0x33333333) + ((n >> 2) & 0x...
  • ar1[]和ar2[]的中位数 可以借鉴归并排序的思想 实质上就是将将两个已经排好序的数组 合并成一个数组 的过程只是在这个过程中添加了一个计算从小到大的次序的数 (count ) 当count =n 和n+1时记录下这两个数 然后...
  • 利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。 数据输入 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。 ...
  • 题目:有两个长为n的非递减数组A和B,...设计算法C的中位数(第n小数)。 思路:O(n)的算法很容易找到,关键是用二分的思想设计logn算法。这题关键是用好a和b数组中脚标和为定值的元素的大小关系。  
  • 利用分治策略试设计一个O (log n)时间的算法出这2n个数的中位数。 数据输入 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。 ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

分治法求中位数