首页 > 编程语言 >3、17算法学习(1)存在的问题(c中如何表示大、小顶堆)

3、17算法学习(1)存在的问题(c中如何表示大、小顶堆)

时间:2024-06-18 16:32:04浏览次数:12  
标签:归并 17 int res mid 算法 数组 小顶 序数

二路归并、逆序对 多路归并,堆栈
1、多路归并模板
先将数据读入堆栈,然后取栈顶的最大值或最小值,最后再根据公式进行递推求出需要添加的元素。
题目:

https://www.acwing.com/problem/content/description/1264/
https://www.acwing.com/problem/content/148/

模板:
int work(int ni,int dt){ priority_queue<PII>q; // 优先队列模拟堆 for (int i = 1; i <= ni; i ++ ){ q.push({a[i],i}); } int fish=0; while (q.size()&&dt>0) // 只要还有时间就可以钓 { auto t = q.top(); q.pop(); int id = t.y; fish+=t.x; dt--; t.x-=d[id]; // 更新下一分钟能钓的数量 if (t.x>0) q.push({t.x,id}); } res = max(res,fish); }

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
归并排序(基础)

逆序对:
逆序数的定义:如果 i < j 且A[i] > A[j].则A[i]和A[j]即为逆序数对.逆序数对的个数就叫逆序数.因此求逆序数可以通过管理两个指针,两次扫描数组,蛮力法求出,显然时间复杂度是Θ(n^2).那么有更快的办法吗?答案是肯定的,利用归并排序法,稍做改进即可.在Merge()中,合并两个已经有序的数组A,B.因为A.B有序,所以,A,B各自的逆序数是0,所以AB的逆序数等于A,B之间的逆序数.

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
归并排序:
归并排序是分治法(分而治之)的一种典型应用,应用递归的思想,自顶向下思考:先假定MergeSort()可以将一个乱序的数组排好序,因此就可以开始”分”(将一个数组平均分成两部分),再”治”(分别对前后部分调用MergeSort()使它们有序),最后再写一个合并子函数Merge(),它可以将两个有序的数组合并,Merge()实现起来比较容易.只需要管理两个指针,分别指向两个子数组的开头,开辟新内存保存中间结果,遍历完两个数组就可以完成,时间是Θ(n).
假定n个元素的数组调用MergeSort()需要时间T(n).因此,T(n)=2T(n/2)+Θ(n).由主定理可知:T(n)=Θ(nlogn).归并排序算法的时间复杂度是Θ(nlogn),空间复杂度是Θ(n).

题目:

https://www.acwing.com/activity/content/code/content/8005520/

模板:
ll merge_sort(int l,int r){ if(l>=r) return 0; int mid = (l+r)/2; ll res= merge_sort(l,mid)+merge_sort(mid+1,r); int k=0;int i=l;int j=mid+1; while(i<=mid&&j<=r){ if(a[j]>=a[i]) t[k++]=a[i++]; else{t[k++]=a[j++];res=res+mid - i + 1;} } while(i<=mid) t[k++]=a[i++]; while(j<=r) t[k++]=a[j++]; for(i=l,j=0;j <k;j++,i++){ a[i]=t[j]; } return res; }

标签:归并,17,int,res,mid,算法,数组,小顶,序数
From: https://www.cnblogs.com/yisone/p/18254643

相关文章

  • 算法课程笔记——普通莫队
    算法课程笔记——普通莫队......
  • 算法课程笔记——单调栈&单调队列
    算法课程笔记——单调栈&单调队列......
  • vm17Pro17.5.1安装操作系统
    vm17Pro17.5.1安装操作系统前言一、windows1.DVD安装1.1[操作系统下载]1.2操作系统版本1.3[windows虚拟机创建]1.4操作系统安装1.4.1虚拟机设置1.4.2客户机启动1.4.3安装设置1.4.4磁盘设置1.4.5区域设置1.4.6键盘布局1.4.7账户设置1.4.8历史及隐私设置1.4......
  • 小于n的最大数 - 贪心算法及证明 - 附python实现
    一、问题描述?    给定一个整数n,并从1~9中给定若干个可以使用的数字,根据上述两个条件,得到每一位都为给定可使用数字的、最大的小于整数n的数。    例如,给定可以使用的数字为{2,3,8}三个数:    给定n=3589,输出3388;给定n=8234,输出8233;…… 二、解......
  • 【前端面经】数组算法题解
    目录题目一:两数之和题目二:最长无重复字符子串题目三:合并两个有序数组题目四:寻找数组中的峰值题目一:两数之和描述:给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。......
  • 6月17内部类笔记
    一、内部类:什么是内部类:内部类就是:在一个类的里边包含一个类,被包含的类就叫做内部类(外边的类叫做外部类)为什么要用内部类:一个类只给另一个类调用,其他类不调用。 则可以将此类作为内部类写到调用它的类里边。其他:用内部类实现多继承(目前不用研究), 用内部类实现回......
  • 吴恩达机器学习 第二课 week3 学习算法(模型)进阶
    目录01学习目标02导入计算所需模块03多项式回归模型进阶3.1数据集划分3.2 寻找最优解3.3 正则优化3.4增大数据量04神经网络模型进阶4.1数据准备4.2模型复杂度4.3正则优化05总结01学习目标   (1)掌握多项式回归模型的求解和优化   (2)掌握神......
  • 6.17 ~ 6.23
    感觉还是把OI/whk什么的分开写好一点?6.17OI贺着题解把HowManyofThem贺过了,感觉现在的题能把题解看懂就不错了(然后发现题库上这道题的数据有一点点小问题;跟\(\text{晓飞谷}\)说了这事,然后:那你给大家造两组数据吧然后就花了我10min从Acwing上把测试点扒......
  • 【408考点之数据结构】算法和算法评价(时间空间复杂度)
    算法和算法评价算法的基本概念在计算机科学中,算法是解决特定问题的一系列步骤。一个好的算法应该具备以下五个基本特性:有穷性:算法必须在有限的步骤内终止。确定性:每一步骤都必须明确,没有歧义。可行性:算法的每个步骤都可以通过基本运算在有限时间内完成。输入:一个算法有零......
  • 常见的排序算法——快速排序(四)
    本文记述了J.Bently和D.Mcllroy的快速三向切分快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想对比快速排序、快速排序(二)和快速排序(三)可以发现,对于随机数据而言,E.W.Dijkstra的三向切分快速排序的性能要慢于标准快速排序以及改进......