数据结构之树形结构2_堆试卷.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
特点: 不稳定 时间复杂度最坏情况下不超过 o(nlog2n) 课后练手:何老板捡钻石 题目描述: “欢迎来安哥拉观光,运气好能捡到钻石,运气不好就踩中地雷,看了这则旅游广告,何老板决定去安哥拉碰碰运气。到了安哥拉才发现有个坑爹的规定:游客最多只能带走n颗钻石,否则就视为走私。 何老板运气很好,他很快就搜集齐了n颗钻石,他把它们编号1到n放进了箱子。在回机场的路上,何老板发现路边还可以零星的捡到一些钻石。沿路何老板总共发现了m颗钻石,他把它们编号为n+1到n+m。何老板是个聪明人,他只会带走较重的钻石,如果捡起的钻石比箱子里的都要轻,何老板就直接把它扔掉,否则他就把箱子中最轻的钻石扔了,把新捡的放进箱子。请问何老板沿途把哪些钻石从箱子里扔了出去,请按先后顺序打印出被扔出的钻石的编号。(假定每颗钻石的重量都不同,不超过int范围)。 输入格式: 第一行,两个空格间隔的整数n和m,(n=20000,m=100000) 第二行,n个空格间隔的整数,表示已装到箱子中的n颗钻石的重量 第三行,m个空格间隔的整数,表示沿途捡到的m颗钻石的重量 输出格式: 只有一行:若干个空格间隔的整数,表示从箱子里扔出的钻石的编号 样例输入: 5 5 8 5 9 3 7 4 2 1 15 8 样例输出: 4 6 2 int main() ...... scanf(%d%d,n,m); for(i=1;i=n+m;i++) { scanf(%d,heap[i]); number[i]=i; } for(i=n/2;i=1;i--) ShiftDown(i,n); x=n+m; for(i=n+1;i=n+m;i++) { if(heap[i]heap[1]) { printf(%d ,number[1]); heap[1]=heap[i]; number[1]=number[i]; ShiftDown(1,n); } } ....... void ShiftDown(int i,int n) ...... t=heap[i]; y=number[i]; k=i*2; while(k=n) { if((kn)(heap[k]heap[k+1]))k++; if(theap[k]) { heap[i]=heap[k]; number[i]=number[k]; i=k; k=2*i; } else break; } heap[i]=t; number[i]=y; ...... 课后作业:1821 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(还有其它)。该集合被称为S集合的“丑数集合”。 对于输入的集合S去寻找“丑数集合”中的第N小的“丑数”。 样例: 4 19 //求第19个丑数 2 3 5 7 //给定的S集合 结果: 2 3 4 5 6 7 8 9 10 12 14 15 16 18 20 21 24 25 27 以样例数据(2 3 5 7)为例: ★初始:建立一个小根堆,把数字1放入堆中; ★每次从堆中取出堆顶元素k,再把2k,3k, 5k, 7k放入堆中; ★从2开始,取出的第n个元素就是第n小的丑数; ★每取出一个数,插入4个数,因此任何堆里的元素是O(n)的,时间复杂度为O(4nlogn) 上述解法有没有问题呢? 产生了相同的数字怎么处理?比如2*3,和3*2 main( ) ...... long long i,k,x,m,tmp,cnt=0; scanf(%I64d%I64d,k,m); for(i=1;i=k;i++)scanf(%I64d,a[i]); heap[1]=tmp=1; n=1; //数字1进堆,n记录堆中数字个数 while(cntm) //cnt记录产生的丑数的个数 { tmp=heap[1]; //tmp用于判重,记录当前取出的堆顶元素 Del(); cnt++; for(i=1;i=k;i++) { x=tmp*a[i]; if(x=i

文档评论(0)

502992 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档