当前位置: 首页 > wzjs >正文

网站托管工作室日照网络推广公司

网站托管工作室,日照网络推广公司,沈阳网站搜索排名,网站建设操作目录 1.为什么使用双堆法 2.双堆法的思路 插入过程: 调整过程: 3.代码实现 1.为什么使用双堆法 对于一个无序区间的中位数查找,我们最先想到的应该是排序算法,快速排序,归并排序等都是很好的方式,时…

目录

1.为什么使用双堆法 

2.双堆法的思路

插入过程:

调整过程:

3.代码实现


1.为什么使用双堆法 

      对于一个无序区间的中位数查找,我们最先想到的应该是排序算法,快速排序,归并排序等都是很好的方式,时间复杂度都是nlogn。而双堆法呢,每次插入一个元素,进行堆的顺序调整的时间复杂度为logn,那么插入n个元素时间复杂度也就一样时nlogn了,而且还需要额外的n的空间复杂度,为什么还要用双堆法呢?

        对于一个数据量不变的区间排序,用sort是很好的,但是呢,如果数据量变化呢?每增加一个元素都需要重新调用一个快速排序,那么插入n个元素的话,就是n * nlogn的时间复杂度了,这样就非常慢了,但是使用双堆法的话,只需要对新的元素放入对应的堆空间,进行一次logn的位置改变即可。所以说对于一段数据量变化的空间,还想要一直找到区间的中位数的话,使用双堆法是个不错的选择。

2.双堆法的思路

        顾名思义是采用两个堆,一个是大堆,一个是小堆,同时维护这两个堆的数据个数,小堆的数据个数最多可以比大堆的数据个数多一个,那么的话,如果是奇数个数的区间的话,那么中间值就放在了小堆的堆顶,如果是偶数个数的区间的话,那么就是根据要求了,选左边作为中间值的话,就是大堆的堆顶,如果是右区间作为中间值的话,就是小堆的堆顶了。

插入过程:

        对于堆的top函数调用,如果堆为空的话,调用该函数会报错的,所以刚开始插入的时候,让其自动先放到小堆中,之后再插入的时候,就可以判断是否比小堆大了,大的话放到小堆里面,否则放到大堆里面。

// 如果大堆为空的话,先插入小堆 or 该元素比小堆的堆顶大
if (minHeap.empty() || item > minHeap.top())minHeap.push(item);
// 该元素比小堆的堆顶还小
elsemaxHeap.push(item);

        当然也可以先放到大堆里面,然后判断元素的值是否是小于大堆的堆顶,如果是的话放到小堆,如果不是的话放到小堆中。 

调整过程:

        如果奇数个数的区间的时候,想让中间值放到小堆的堆顶的话,就规定小堆的元素个数最多可以比大堆多一个,而且大堆的个数不能多于小堆即可。如下图代码所示。

// 如果说小堆的数据比大堆+1还多
if (maxHeap.size() + 1 < minHeap.size())
{maxHeap.push(minHeap.top());minHeap.pop();
}
// 如果大堆的元素比小堆多
else if (maxHeap.size() > minHeap.size())
{minHeap.push(maxHeap.top());maxHeap.pop();
}

        如果奇数个数的区间的中间值想要放到大堆的堆顶的时候,就可以规定大堆的元素个数最多比小堆多一个,小堆的元素个数不能多于大堆即可。

3.代码实现

#include <iostream>
#include <queue>
#include <vector>int FindMiddenNumber(const std::vector<int>& num)
{std::priority_queue<int> maxHeap;										// 大堆std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;	// 小堆// 将数据插入for (auto item : num) {// 如果大堆为空的话,先插入小堆 or 该元素比小堆的堆顶大if (minHeap.empty() || item > minHeap.top())minHeap.push(item);// 该元素比小堆的堆顶还小elsemaxHeap.push(item);// 如果说小堆的数据比大堆+1还多if (maxHeap.size() + 1 < minHeap.size()){maxHeap.push(minHeap.top());minHeap.pop();}// 如果大堆的元素比小堆多else if (maxHeap.size() > minHeap.size()){minHeap.push(maxHeap.top());maxHeap.pop();}}if (maxHeap.size() == minHeap.size())return maxHeap.top();elsereturn minHeap.top();
}int main()
{// 测试用例 1: 奇数个元素std::vector<int> test1 = { 1, 2, 3, 4, 5 };std::cout << "Test 1: " << FindMiddenNumber(test1) << std::endl;// 测试用例 2: 偶数个元素std::vector<int> test2 = { 1, 2, 3, 4 };std::cout << "Test 2: " << FindMiddenNumber(test2) << std::endl;// 测试用例 3: 包含负数std::vector<int> test3 = { -1, -2, -3, -4, -5 };std::cout << "Test 3: " << FindMiddenNumber(test3) << std::endl;// 测试用例 4: 包含零std::vector<int> test4 = { 0, 1, 2, 3, 4 };std::cout << "Test 4: " << FindMiddenNumber(test4) << std::endl;// 测试用例 5: 所有元素相同std::vector<int> test5 = { 5, 5, 5, 5, 5 };std::cout << "Test 5: " << FindMiddenNumber(test5) << std::endl;return 0;
}

http://www.dtcms.com/wzjs/430962.html

相关文章:

  • 网站外链哪里做seo广告优化
  • 做移动网站优化快有没有专门做营销的公司
  • 跨境电商热销产品排行济南seo外包服务
  • 云梦网络 网站模板网页制作的基本步骤
  • 温州建站费用广州新塘网站seo优化
  • 修改wordpress默认的登陆地址关键词优化排名费用
  • 东莞网站建设服务商网络推广教程
  • win2012 iis配置网站百度搜索app
  • wordpress邀请码插件什么叫做seo
  • 上海公安门户网站网址安徽网站关键字优化
  • 龙岗 网站建设深圳信科搜索引擎seo关键词优化方法
  • 域名注册好了怎么做网站网址注册查询
  • 微小店网站建设多少钱seo怎么优化步骤
  • 软件开发专业就业前景如何seo自学网app
  • 一级做爰片软件网站微商软文范例大全100
  • wordpress变成中文上海单个关键词优化
  • 什么网站做美食最好最专业广东广州重大新闻
  • 科技网页模板seo培训资料
  • 网站建设分金手指专业十六河南品牌网站建设
  • 网站建设研究背景百度关键词查询排名
  • 党风廉政建设 杂志网站搜索引擎的营销方法有哪些
  • wordpress做的视听网站河南做网站的
  • 哈尔滨模板网站建设新站如何快速收录
  • 天津网站建设基本流程图2023第二波疫情已经到来了吗
  • 做招聘求职网站最近中国新闻热点大事件
  • 微软做网站软件日照网络推广公司
  • 物流专线做网站百度推广的方式有哪些
  • 企业网站建设解决方案报告论文免费自学电商教程
  • 微信公众平台内做网站手游推广平台有哪些
  • 推广型网站如何建站百度上如何发广告