算法实现——X和Y的中位数问题

来源:互联网 发布:优化设计吧 编辑:程序博客网 时间:2024/05/29 16:19
问题描述:设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个O(log n)时间的算法,找出X和Y 的2n个数的中位数。例如,当n=7,X=[1,3,6,7,8,9,10];Y=[2,4,5,11,12,13,14]时,X 和Y的中位数是7。«算法设计:对于给定的n 个元素的数组X[0:n-1]和Y[0:n-1],试设计一个O(log n)时间算法,计算X 和Y 的中位数。«数据输入:输入数据由文件名为input.txt的文本文件提供。文件的第1行是每个数组中元素个数n;接下来的2行中每行有n 个整数,分别为X 和Y 中元素。«结果输出:将计算出的X 和Y 的中位数输出到文件output.txt中。输入文件示例 输出文件示例input.txt     output.txt7             7   1 3 6 7 8 9 102 4 5 11 12 13 14
#include <iostream>#include <fstream>#include <string>using namespace std;bool  IsMiddle( int a[], int b[], int max, int &i, int& upper, int& lower , int& result ){ bool bResult = false; if ( a[i] >= b[max-i-2] && a[i] <= b[max-i-1] ) {  result = a[i];  if ( i== max-1 )  {   result+=b[0];  }  else  {   result += ( a[i+1] < b[max-i-1] ) ? a[i+1] : b[max-i-1];  }  bResult = true; } else {  if ( a[i] < b[max-i-2])  {   lower=i;   i=upper;  }  else  {   upper=i;   i=lower;  }  if ( a[i] >= b[max-i-2] && a[i] <= b[max-i-1] )  {   bResult = true;  } } result/=2; return bResult;}int   GetMiddle( int a1[], int a2[], int length ){ int result=0; int i1, i2, u1=length-1, l1=0, u2=length-1, l2=0; int index=0; while ( abs( l1-u1) >1 || abs( l2-u2) >1 )  {  i1 = ( l1 + u1) /2;  if ( abs( l1-u1) >1 )  {   if ( IsMiddle( a1, a2, length, i1, u1, l1, result ) )   {    break;   }  }  i2 = ( l2+u2) /2;  if ( abs( u2-l2) >1 )  {   if ( IsMiddle( a2, a1, length, i2, u2, l2 , result ) )   {    break;   }  } } return result;}int  main() {  string inFileName("c:\\inFile.txt"); string outFileName("c:\\outFile.txt"); ifstream inFile( inFileName.c_str(), ios_base::in); if ( inFile.fail() ) {  cerr<<" Open file: " << inFileName << " failed! Exit...";  return -1; } ofstream outFile( outFileName.c_str(), ios_base::out | ios_base::trunc ); if ( outFile.fail() ) {  cerr<<" Open file:" << outFileName << " failed! Exit...";  inFile.close();  return -1; } int len =0; while ( !(inFile>> len) ) {  inFile.clear();  inFile.get(); } if ( len <=0 ) {  inFile.close();  outFile.close();  cerr <<"Array length less or equal than zero! Exit...";  return -1; } int *a1 = new int[len]; int *a2 = new int[len]; int number=0, i=0; for (  i=0; i<len *2 && !inFile.eof(); i++ ) {  while ( !(inFile>>number) && !inFile.eof() );  if ( i <len )  {   a1[i]=number;  }  else  {   a2[i%len]=number;  } } inFile.close(); if ( i< 2*len ) {  cerr<<"Elements  count not matched...";  outFile.close();  delete []a1;  delete []a2;  return -1; }  int mid = GetMiddle( a1, a2, len); printf( "中间数: %d\n", mid ); outFile<<mid; outFile.close(); delete []a1; delete []a2; return 0;}
2.有两个链表[1,3,5],[2,4,7],设计一个算法将这两个链表合并为一个元素值递减的有序单向链表
3.:输入二叉树的两个节点,输出它们的最近公共祖先节点struct node{Node *left;Node *right;Node *parent}
4.上亿个单词,如何设计算法去掉其中重复的单词,要求写出程序,并估算时间和空间复杂度