给定两个有序列表,大小分别为m和n。给出一个算法,以O(logn+logm)时间找出两个列表合并后的有序列表中第k小元素

题目

给定两个有序列表,大小分别为m和n。给出一个算法,以O(logn+logm)时间找出两个列表合并后的有序列表中第k小元素

算法思想

设两个数组为A[1...m],B[1...n],则中间位置分别为m/2与n/2,假设A[m/2]>B[n/2],那么A[m/2...m]在A+B的n/2+m/2之后,此时,若k<n/2+m/2,那么就可以排除A[m/2...m]的元素,在剩余元素再进行上述操作,若k>n/2+m/2,那么就可以排除B[1...n/2]的元素,再剩余元素中寻找第k-n/2小项。

代码:

#include <iostream>
#define MAXLEN 100
using namespace std;
int Search(int A[],int B[],int aLeft, int aRight, int bLeft, int bRight, int k)
{
    int aMiddle = (aLeft + aRight) / 2;
    int bMiddle = (bLeft + bRight) / 2;
    if (aLeft > aRight)
        return B[bLeft + k - 1];
    if (bLeft > bRight)
        return A[aLeft + k - 1];
    if (A[aMiddle] > B[bMiddle])
    {
        if (k <= (aMiddle - aLeft) + (bMiddle - bLeft) + 2)
            return Search(A, B, aLeft, aMiddle - 1, bLeft, bRight, k);
        else
            return Search(A, B,aLeft, aRight, bMiddle + 1, bRight, k - (bMiddle - bLeft) - 1);
    }
    else
    {
        if (k <= (aMiddle - aLeft) + (bMiddle - bLeft) + 2)
            return Search(A, B, aLeft, aRight, bLeft, bMiddle - 1, k);
        else
            return Search(A, B, aMiddle + 1, aRight, bLeft, bRight, k - (aMiddle - aLeft) - 1);
    }
}
int main(void)
{
    int alen, blen,k;
    int A[MAXLEN],B[MAXLEN];
    cin >> alen;
    for (int i = 0; i < alen; i++)
    {
        cin >> A[i];
    }
    cin >> blen;
    for (int i = 0; i < blen; i++)
    {
        cin >> B[i];
    }
    cin >> k;
    cout << "第" << k << "小元素是" << Search(A, B, 0, alen - 1, 0, blen - 1, k) << endl;
    system("pause");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,059评论 0 13
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 6,620评论 5 24
  • (十七) 这座八角形的建筑物,其实是一个虚拟的空间,它于公元2403年建成。高端科学技术研究室,是地球人科...
    文心妙运阅读 161评论 0 0
  • 文章首发notes.hudabai.com.未经允许,禁止转载! 第一次看到这句话是在msn的登录界面(11年左右...
    我不乖还会惹麻烦阅读 816评论 0 0
  • 今天社区服务将回访单送回来了,而且给你称重了,7.9斤,没少长啊,心中高兴,呦呦在变大,而且呦呦的消化也在变好,最...
    申玉磊阅读 280评论 0 1