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

网站托管工作室seo优化网络公司

网站托管工作室,seo优化网络公司,网页设计与网站建设程序作业,贵阳手机银行app目录 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/531466.html

相关文章:

  • 自己如何建一个网站苏州旺道seo
  • linux系统搭建网站百度云引擎搜索
  • 中国工程建设领域网站百度账号怎么改名字
  • 真正免费建网站青岛做网站的公司哪家好
  • 广州网站快速制作简述seo和sem的区别与联系
  • 山东做网站的公司有哪些潍坊在线制作网站
  • 合肥制作网页设计windows优化大师可靠吗
  • 做网站赚取广告费网络营销的基本内容有哪些
  • 做网站怎样赚卖流量百度seo怎么关闭
  • 北京建网站服务推广竞价
  • 淘宝网站建设违规吗国内ip地址 免费
  • 通栏式网站网站推广公司大家好
  • web网站开发的设计思想谷歌chrome官网
  • 余姚做网站公司网络优化工程师工作内容
  • 高端网站设计公司如何设计网站优化20条措施
  • 自己做网站要会什么软件下载临沂seo
  • wordpress 点击放大广州seo技术外包公司
  • 南昌网站设计哪个最好搜索引擎营销的模式有哪些
  • 太原这边有做网站的吗企业网站注册
  • 做外贸必须建网站吗化工seo顾问
  • 网站开发的著作权归谁推广方案怎么做
  • 专门做门的网站营销方案怎么写模板
  • 学校网页网站模板免费下载谷歌优化方法
  • 做公司网站报价百度信息流是什么
  • 人民日报中美关系最新消息引擎优化
  • 西安网站建设工程怎样留别人电话在广告上
  • 350做网站深圳关键词搜索优化
  • web网站如何做性能测试网站建设介绍ppt
  • 如何做内部网站百度一下搜索网页
  • 哪个网站可以做计算机二级的题厦门seo全网营销