• 数据结构与算法参考答案(第十六周)


    一、假设序列由n个关键字不同的记录构成,要求不经排序而从中选出关键字从大到小顺序的前kk<<n)个记录,试问如何进行才能使所作的关键字间比较次数达到最小?

    答:

    用堆排序。在建立一个含n个元素的堆时,进行关键字的比较的次数不超过4n,调整新建堆时的比较次数不超过2log2n次。

    该算法实现的伪代码如下:

    /*

    函数名称:选出关键字从大到小顺序的前kk<<n)个记录

    函数传入参数:相关参数

    函数返回值:void

    */

    void Merge(RcdType SR[], RcdType TR[], int i, int m, int n) {

    int j, k;

    for(j=m+1,k=i; i<=m&&j<=n; ++k) {

    if(LQ(SR[i].key, SR[j].key))

    TR[k] = SR[i++];

    else

    TR[k] = SR[j++];

    }

    while(i<=m) {

    TR[k++] = SR[i++];

    }

    while(j<=n) {

    TR[k++] = SR[j++];

    }

    }

    void MSort(RcdType SR[], RcdType TR[], int s, int t) {

    int m;

    RcdType R[MAXSIZE+1];

    if(s==t)

    TR[s] = SR[s];

    else {

    m = (s+t)/2;

    MSort(SR, R, s, m);

    MSort(SR, R, m+1, t);

    Merge(R, TR, s, m, t);

    }

    }

    n个元素中求前k个最大元素,在堆排序情况下比较次数最多不超过4n + 2klog2n

     

    二、对一个由n个关键字不同的记录构成的序列,你能否用比2n-3少的次数选出这n个记录中关键字取最大值和关键字取最小值的记录?若能,请说明如何实现?在最坏情况下至少进行多少次比较?

    答:

    能实现。

    算法设计:首先我们需要2个一组进行比较,将较大的元素放入序列S1,将较小的元素放入序列S2,若最终只剩下一个元素则同时加入序列S1S2。最后在S1中求最大值和在S2中求最小值。

    第一趟:n个数据两两比较,共n / 2次,小者放偶数位,大者放奇数位。第二趟:对奇数位元素继续两两比较,共n / 4次,对偶数位元素也两两比较,共n / 4 次,总共n / 2次。第log2n趟:对奇数位元素继续两两比较,共1次,对偶数位元素也两两比较,共1次,总共2次。

    n为偶数,则共需要k+(k-1)+(k-1)=3k-2次,若n为奇数,则共需要k+k+k=3k

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    桃李春风一杯酒,江湖夜雨十年灯
    实现.net下的动态代理(续)多对象Mixin
    队列不存在,或您没有足够的权限执行该操作另一种原因
    .NET托管内存类应用的内存泄漏分析和诊断(转)
    移动硬盘 执行页内操作时的错误修复方法
    阮一峰:四位计算机的原理及其实现
    一款mvvm框架运用介绍(转)
    C#制作CAB压缩包压缩解压类
    ASP.NET C# 向 ACCESS 插入日期型数据 标准表达式中数据类型不匹配
    SQL Server日志清除的两种方法
  • 原文地址:https://www.cnblogs.com/lightac/p/13558297.html
Copyright © 2020-2023  润新知