数据结构与算法参考答案(第十六周)
一、假设序列由n个关键字不同的记录构成,要求不经排序而从中选出关键字从大到小顺序的前k(k<<n)个记录,试问如何进行才能使所作的关键字间比较次数达到最小?
答:
用堆排序。在建立一个含n个元素的堆时,进行关键字的比较的次数不超过4n,调整新建堆时的比较次数不超过2log2n次。
该算法实现的伪代码如下:
/* 函数名称:选出关键字从大到小顺序的前k(k<<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,若最终只剩下一个元素则同时加入序列S1和S2。最后在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次。
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法