zoukankan      html  css  js  c++  java
  • 求两个等长的有序序列的中位数(2011计算机统考试题)

      1 /********************************************************************
      2     created:    2014/01/05
      3     created:    22:01
      4     file base:    main
      5     file ext:    cpp
      6     author:        Justme0 (http://blog.csdn.net/Justme0)
      7     
      8     purpose:    求两个等长的有序序列的中位数,时间复杂度O(log(n))
      9 *********************************************************************/
     10 
     11 #define _CRT_SECURE_NO_WARNINGS
     12 #include <iostream>
     13 #include <vector>
     14 #include <cassert>
     15 #include <algorithm>
     16 using namespace std;
     17 
     18 template <class Iterator>
     19 Iterator search_middle(Iterator begin1, Iterator end1, Iterator begin2) {
     20     while (begin1 + 1 != end1) {
     21         int len = end1 - begin1;
     22         int m = (len - 1) / 2;    // m 是中位数的下标
     23         bool is_odd = (len % 2 == 1);
     24 
     25         if (begin1[m] < begin2[m]) {
     26             if (is_odd) {
     27                 begin1 += m;
     28             } else {
     29                 begin1 += m + 1;
     30             }
     31         } else if (begin2[m] < begin1[m]) {
     32             if (is_odd) {
     33                 begin2 += m;
     34                 end1 -= m;
     35             } else {
     36                 begin2 += m + 1;
     37                 end1 -= m + 1;
     38             }
     39         } else {
     40             return begin1 + m;
     41         }
     42     }
     43 
     44     return *begin1 < *begin2 ? begin1 : begin2;
     45 }
     46 
     47 void input(vector<int> &v, int len) {
     48     for (int i = 0; i < len; ++i) {
     49         int elem;
     50         cin >> elem;
     51         v.push_back(elem);
     52     }
     53 }
     54 
     55 void output(vector<int> &v) {
     56     for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
     57         cout << *it << " ";
     58     }
     59     cout << endl;
     60 }
     61 
     62 int main(int argc, char **argv) {
     63     freopen("cin.txt", "r", stdin);
     64 
     65     int len;
     66     while (cin >> len) {
     67         vector<int> v1, v2;
     68         input(v1, len);
     69         input(v2, len);
     70 
     71         vector<int> v3(v1.size() * 2);
     72         merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
     73         int b = v3[(v3.size() - 1) / 2];
     74 
     75         int a = *search_middle(v1.begin(), v1.end(), v2.begin());
     76         assert(a == b);
     77         cout << a << " " << b << endl;
     78         if(a != b) {
     79             output(v3);
     80             cout << "a=" << a << endl;
     81             cout << "b=" << b << endl;
     82         }
     83     }
     84 
     85     return 0;
     86 }
     87 
     88 /* cin.txt
     89 1
     90 1
     91 0
     92 
     93 1
     94 -3
     95 3
     96 
     97 2
     98 1 2
     99 2 3
    100 
    101 3
    102 0 5 6
    103 2 2 2
    104 
    105 4
    106 1 2 3 4
    107 6 7 8 9
    108 
    109 4
    110 1 2 6 7
    111 3 4 5 6
    112 
    113 5
    114 12 22 222 333 3333
    115 10 13 44 55 66
    116 
    117 10
    118 3 3 22 34 44 333 2222 11111 11112 11113
    119 -5 -4 0 1 444 4444 44444 44445 444444 444445
    120 */
  • 相关阅读:
    零售定价(最终价格计算)(三)
    SAP数据表(一)商品表
    BizTalk 2006 R2 如何实现EDI报文的接收处理
    Simulate a Windows Service using ASP.NET to run scheduled jobs
    看曾士强评胡雪岩
    Smart Client Software Factory 初试
    Asp.net Dynamic Data之四定义字段的显示/编辑模板和自定义验证逻辑
    To set a 64bit mode IIS installation to 32bit mode
    集中日志查询平台方案(Draft)
    .net开发框架比较
  • 原文地址:https://www.cnblogs.com/jjtx/p/3506359.html
Copyright © 2011-2022 走看看