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

宁波网站建设企业网站制作/教育培训机构网站

宁波网站建设企业网站制作,教育培训机构网站,产品开发项目管理,手机端企业网站怎么做目录 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.whsansanxincailiao.cn/news/31978956.html

相关文章:

  • 校园网站建设与管理问题分析/如何进行网站性能优化
  • 建设 展示型企业网站/互联网推广是干什么的
  • windous 系统 做网站/离我最近的电脑培训中心
  • 南京建网站/培训心得体会
  • 什么网站可以做简历/百度推广关键词怎么设置好
  • 网站中英文切换怎麼做/滕州百度推广
  • 三门峡网站制作/自己怎么做网站优化
  • 怎样用代码做网站/广告服务平台
  • 昆明网站建设首选才力/墨猴seo排名公司
  • 网站建设的宿主选择/品牌营销策划与管理
  • 做网站买什么服务器 便宜/seo快速优化软件
  • 南昌seo关键词/长沙seo优化哪家好
  • 东台做网站哪家便宜/线上宣传渠道有哪些
  • 论坛网站有哪些/长沙百度快照优化排名
  • 郑州优化疫情/广州谷歌seo公司
  • ecshop 文件大小超出网站限制/百度推广工作好干吗
  • 如何使用手机看建设网站/app推广在哪里可以接单
  • 百度推广网站吸引力/百度视频广告怎么投放
  • 免费门户网站模板/苏州网站制作
  • 上海企业都用什么网站/软件开发
  • 网站怎么做才不会被封/惠州seo排名
  • 商城网站建设制作设计/上海推广网络营销咨询热线
  • 网站模块插件是怎么做的/重庆森林经典台词梁朝伟
  • 做网站分为竞价和优化/张家界百度seo
  • 北京网站建设华大/seo黑帽技术工具
  • 做网站用哪几个端口 比较好/外贸网站建设平台
  • 麻章网站建设公司/百度seo手机
  • 网站数据分析课程/品牌推广方案案例
  • 做ui设计用什么网站/时事新闻最新消息
  • 北京网站建设 网站维护/网络推广员是什么工作