新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 计算机科学论坛计算机理论与工程『 计算机考研交流 』 → [原创]北大06年试卷中的编程题(凭印象) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 80584 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]北大06年试卷中的编程题(凭印象) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     dwchang 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/5/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给dwchang发送一个短消息 把dwchang加入好友 查看dwchang的个人资料 搜索dwchang在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看dwchang的博客楼主
    发贴心情 [原创]北大06年试卷中的编程题(凭印象)

    有两个已排好序(从小到大)的数组A和B,长度均为n,把它们合并为一个数组,要求时间代价为O(logn),请给出算法。
    ps:个人认为需要建堆,然后调整。欢迎大家讨论。

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/12 11:41:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客2
    发贴心情 
    这个不可能吧?
    时间代价为O(logn),连扫描一遍数据都不够………

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/12 11:59:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客3
    发贴心情 
    会不会是“空间代价为O(logn)”?

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/12 12:02:00
     
     holmesyj 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2006/5/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给holmesyj发送一个短消息 把holmesyj加入好友 查看holmesyj的个人资料 搜索holmesyj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看holmesyj的博客4
    发贴心情 
    倒,建议楼主发贴前先动动脑子。
    首先说明一下,不是编程题,是算法设计题,不要求写具体算法,只要写思路。
    题目是这样的:有两个已排好序的数组A和B,长度均为n,找出这两个数组的中间元素。要求时间代价为O(logn)。
    然后再论证平均时间复杂度(要不就是最坏时间复杂度)为O(logn)。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/19 12:52:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客5
    发贴心情 
    以下是引用holmesyj在2006-5-19 12:52:00的发言:
    倒,建议楼主发贴前先动动脑子。
    首先说明一下,不是编程题,是算法设计题,不要求写具体算法,只要写思路。
    题目是这样的:有两个已排好序的数组A和B,长度均为n,找出这两个数组的中间元素。要求时间代价为O(logn)。
    然后再论证平均时间复杂度(要不就是最坏时间复杂度)为O(logn)。


    什么叫“找出这两个数组的中间元素”呀?@_@
    是说想像他们已经合并成了一个长度为2n的数组C,然后取C的中数,是这样吗?:)


    [此贴子已经被作者于2006-5-19 17:45:07编辑过]

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/19 15:54:00
     
     teng_t1986 帅哥哟,离线,有人找我吗?天秤座1986-10-22
      
      
      威望:1
      头衔:智能缔造者
      等级:计算机学士学位(版主)
      文章:368
      积分:2273
      门派:IEEE.ORG.CN
      注册:2006/4/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给teng_t1986发送一个短消息 把teng_t1986加入好友 查看teng_t1986的个人资料 搜索teng_t1986在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给teng_t1986 访问teng_t1986的主页 引用回复这个贴子 回复这个贴子 查看teng_t1986的博客6
    发贴心情 
    我认为不要建堆,可以先比较两个数组的中间位置的值,根据比较结果把一个指针右移另一个左移(即始终保证一个指针右半边长度加另一个指针左半边长度和为n),直到两指针值相等或与前一次寻找位置相邻是算法结束。
    因为过程为binary search,所以时间代价为O(logN),对吗?

    ----------------------------------------------
    书山奋战不觉难,
    一刻光阴莫等闲。
    长路遥遥飞浩志,
    前尘洗却作泥丸。
    粗茶薄被心灯暖,
    明月清窗几案寒。
    欲待桂枝香万里,
    海阔天空俱欢颜。

    My blog:http://hi.baidu.com/tengteng2007

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/19 20:54:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客7
    发贴心情 
    中间有几个细节问题,我还没想明白。
    比如,先取i=j=n/2,那么当A[i]<B[j]时,将i和j分别改成多少呢?是改成3n/4和n/4吗?如果这样的话,如何保证i和j的取值范围“收敛”于一点呢?如果只是i++,j--的话,就不是“二分搜索”了。
    不知道你是怎么考虑的?

    以下是引用teng_t1986在2006-5-19 20:54:00的发言:
    我认为不要建堆,可以先比较两个数组的中间位置的值,根据比较结果把一个指针右移另一个左移(即始终保证一个指针右半边长度加另一个指针左半边长度和为n),直到两指针值相等或与前一次寻找位置相邻是算法结束。
    因为过程为binary search,所以时间代价为O(logN),对吗?

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/20 9:45:00
     
     Supremgoooo 帅哥哟,离线,有人找我吗?
      
      
      等级:大四下学期(考上研究生啦!)
      文章:201
      积分:1872
      门派:XML.ORG.CN
      注册:2006/4/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Supremgoooo发送一个短消息 把Supremgoooo加入好友 查看Supremgoooo的个人资料 搜索Supremgoooo在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看Supremgoooo的博客8
    发贴心情 
    这道题是学习指导与习题解析224页的7.13题,也是去年的一道家庭作业,我已经做了3个月了,之间问过许多老师或同学,所有答案都是:不会
    有那个超级超级超级牛人能给个程序?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/21 23:16:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客9
    发贴心情 
    下面的是phoenixinter牛人给的算法:

    Say the two arrays are sorted and increasing, namely A and B.
    It is easy to find the median of each array in O(1) time.
    Assume the median of array A is m and the median of array B is n.
    Then,
    1' If m=n, then clearly the median after merging is also m, the algorithm holds.
    2' If m<n, then reserve the half of sequence A in which all numbers are greater than
       m, also reserve the half of sequence B in which all numbers are smaller than n.
       Run the algorithm on the two new arrays.
    3' If m>n, then reserve the half of sequence A in which all numbers are smaller than
       m, also reserve the half of sequence B in which all numbers are larger than n.
       Run the algorithm on the two new arrays.

    Time complexity: O(logn)

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/22 4:42:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客10
    发贴心情 
    实现了一下。
    蛮有意思的一道题。
    呵呵。


    #include <iostream>
    #include <time.h>
    using namespace std;


    int find_nth(int A[],int B[], int A_start, int A_end, int B_start, int B_end, int n) //从 A[start]..A[end],B[start]...B[end] 中找出第 n 小的数。
    {
     if(A_end<A_start)
      return B[B_start+n-1];
     else if(B_end<B_start)
      return A[A_start+n-1];
     else if (n == 1)
      return A[A_start]<=B[B_start]?A[A_start]:B[B_start];  //当 n = 1 时,第 n 小的数就是两个数中较小的那个。
     else if(n == 2)
     {
      if(A[A_start]<=B[B_start])
       return find_nth(A,B,A_start+1,A_end,B_start,B_end,n-1);
      else
       return find_nth(A,B,A_start,A_end,B_start+1,B_end,n-1);
     }
     else
     {
      int A_mid, B_mid;
      A_mid = A_start + (n-1)/2;
      B_mid = B_start + (n-1)/2;
      if (A[A_mid]==B[B_mid])
       return A[A_mid];
      else if (A[A_mid]<B[B_mid])  //这时,A[A_start]...A[A_mid]一定比"第 n 小的数"小,B[B_mid+1]...B[B_end]一定比"第 n 小的数"大,不必再考虑。
       return find_nth(A, B, A_mid, A_end, B_start, B_mid, n - (A_mid - A_start));
      else
       return find_nth(A, B, A_start, A_mid, B_mid, B_end, n - (B_mid - B_start));
     }
    }

    void insertionSort(int X[], int start, int end)
    {
     int i,j,temp;
     for(i = start; i<=end; i++)
     {
      temp = X[i];
      for(j=i-1; j>=start && X[j]>temp; j--)
       X[j+1]=X[j];
      X[j+1]=temp;
     }
    }

    void main()
    {
     const int k=4;
     int A[k],B[k],i;
     srand( (unsigned)time( NULL ) );
     for(i=0;i<k;i++)
     {
      A[i]=rand();
      B[i]=rand();
     }
     insertionSort(A,0,k-1);
     insertionSort(B,0,k-1);
     cout<<"find_nth(A,B,0,"<<k-1<<",0,"<<k-1<<","<<k<<") = "<<find_nth(A,B,0,k-1,0,k-1,k)<<endl;

     //下面将A、B归并到数组C中,并直接输出C[k-1],作为对照。 
     int C[2*k],s,t;
     s=0;
     t=0;
     for(i=0;s<k&&t<k;i++)
     {
      if(A[s]<=B[t])
       C[i]=A[s++];
      else
       C[i]=B[t++];
     }
     while(s<k)
     {
      C[i++]=A[s++];
     }
     while(t<k)
     {
      C[i++]=B[t++];
     }
     cout<<"C["<<k-1<<"] = "<<C[k-1]<<endl;
    }


    [此贴子已经被作者于2006-5-22 12:07:32编辑过]

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/22 9:44:00
     
     GoogleAdSense天蝎座1984-10-28
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/25 22:49:27

    本主题贴数47,分页: [1] [2] [3] [4]... [5]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms