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

产品销售推广方案网络优化报告

产品销售推广方案,网络优化报告,设计制作感悟150字,企业邮箱收费吗数据结构——堆 堆堆简介堆的分类 二叉堆过程插入操作 删除操作向下调整: 增加某个点的权值实现参考代码:建堆方法一:使用 decreasekey(即,向上调整)方法二:使用向下调整 应用对顶堆 其他&#…

数据结构——堆

    • 堆简介
    • 堆的分类
  • 二叉堆
    • 过程
      • 插入操作
    • 删除操作
      • 向下调整:
    • 增加某个点的权值
    • 实现
    • 参考代码:
    • 建堆
      • 方法一:使用 decreasekey(即,向上调整)
      • 方法二:使用向下调整
  • 应用
    • 对顶堆
  • 其他:
    • 配对堆:
    • 左偏树:

堆简介

堆是一棵树,其每个节点都有一个键值,且每个节点的键值都大于等于/小于等于其父亲的键值。

每个节点的键值都大于等于其父亲键值的堆叫做小根堆,否则叫做大根堆。STL 中的 priority_queue 其实就是一个大根堆。

(小根)堆主要支持的操作有:插入一个数、查询最小值、删除最小值、合并两个堆、减小一个元素的值。

一些功能强大的堆(可并堆)还能(高效地)支持 merge 等操作。

一些功能更强大的堆还支持可持久化,也就是对任意历史版本进行查询或者操作,产生新的版本。

堆的分类

在这里插入图片描述
习惯上,不加限定提到「堆」时往往都指二叉堆。

二叉堆

结构
从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。

堆性质:父亲的权值不小于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例。

由堆性质,树根存的是最大值(getmax 操作就解决了)。

过程

插入操作

插入操作是指向二叉堆中插入一个元素,要保证插入后也是一棵完全二叉树。

最简单的方法就是,最下一层最右边的叶子之后插入。

如果最下一层已满,就新增一层。

插入之后可能会不满足堆性质?

向上调整:如果这个结点的权值大于它父亲的权值,就交换,重复此过程直到不满足或者到根。

可以证明,插入之后向上调整后,没有其他结点会不满足堆性质。

向上调整的时间复杂度是 O ( l o g n ) O(log n) O(logn)的。

删除操作

删除操作指删除堆中最大的元素,即删除根结点。

但是如果直接删除,则变成了两个堆,难以处理。

所以不妨考虑插入操作的逆过程,设法将根结点移到最后一个结点,然后直接删掉。

然而实际上不好做,我们通常采用的方法是,把根结点和最后一个结点直接交换。

于是直接删掉(在最后一个结点处的)根结点,但是新的根结点可能不满足堆性质……

向下调整:

在该结点的儿子中,找一个最大的,与该结点交换,重复此过程直到底层。

可以证明,删除并向下调整后,没有其他结点不满足堆性质。

时间复杂度 O ( l o g n ) O(log n) O(logn)

增加某个点的权值

很显然,直接修改后,向上调整一次即可,时间复杂度为 O ( l o g n ) O(log n) O(logn)

实现

我们发现,上面介绍的几种操作主要依赖于两个核心:向上调整和向下调整。

考虑使用一个序列 h h h 来表示堆。 h i h_i hi 的两个儿子分别是 h 2 h_2 h2 i _i i h 2 h_2 h2 i _i i + _+ + 1 _1 1 1 1 1 是根结点:

在这里插入图片描述

参考代码:

void up(int x) {while (x > 1 && h[x] > h[x / 2]) {swap(h[x], h[x / 2]);x /= 2;}
}void down(int x) {while (x * 2 <= n) {t = x * 2;if (t + 1 <= n && h[t + 1] > h[t]) t++;if (h[t] <= h[x]) break;std::swap(h[x], h[t]);x = t;}
}

建堆

考虑这么一个问题,从一个空的堆开始,插入 n 个元素,不在乎顺序。

直接一个一个插入需要 O ( n l o g n ) O(n log n) O(nlogn) 的时间,有没有更好的方法?

方法一:使用 decreasekey(即,向上调整)

从根开始,按 BFS 序进行。

void build_heap_1() {for (i = 1; i <= n; i++) up(i);
}

为啥这么做:对于第 k 层的结点,向上调整的复杂度为 O ( k ) O(k) O(k) 而不是 O ( l o g n ) O(log n) O(logn)

总复杂度: l o g 1 log 1 log1 + l o g 2 log 2 log2 + … + l o g n log n logn = O ( n l o g n ) O(n log n) O(nlogn)

(在「基于比较的排序」中证明过)

方法二:使用向下调整

这时换一种思路,从叶子开始,逐个向下调整

void build_heap_2() {for (i = n; i >= 1; i--) down(i);
}

换一种理解方法,每次「合并」两个已经调整好的堆,这说明了正确性。

注意到向下调整的复杂度,为 O ( l o g n − k ) O(log n - k) O(lognk),另外注意到叶节点无需调整,因此可从序列约 n/2 的位置开始调整,可减少部分常数但不影响复杂度。

之所以能 O ( n ) O(n) O(n) 建堆,是因为堆性质很弱,二叉堆并不是唯一的。
要是像排序那样的强条件就难说了。

应用

对顶堆

这个问题可以被进一步抽象成:动态维护一个序列上第 k k k 大的数, k k k 值可能会发生变化。

对于此类问题,我们可以使用对顶堆这一技巧予以解决(可以避免写权值线段树或 B S T BST BST带来的繁琐)。

对顶堆由一个大根堆与一个小根堆组成,小根堆维护大值即前 k k k 大的值(包含第 k k k 个),大根堆维护小值即比第 k k k 大数小的其他数。

这两个堆构成的数据结构支持以下操作:

1.维护:当小根堆的大小小于 k k k 时,不断将大根堆堆顶元素取出并插入小根堆,直到小根堆的大小等于 k k k;当小根堆的大小大于 k k k 时,不断将小根堆堆顶元素取出并插入大根堆,直到小根堆的大小等于 k k k

2.插入元素:若插入的元素大于等于小根堆堆顶元素,则将其插入小根堆,否则将其插入大根堆,然后维护对顶堆;

3.查询第 k 大元素:小根堆堆顶元素即为所求;

4.删除第 k 大元素:删除小根堆堆顶元素,然后维护对顶堆;

显然,查询第 k k k 大元素的时间复杂度是 O ( 1 ) O(1) O(1) 的。由于插入、删除或调整 k k k 值后,小根堆的大小与期望的 k k k 值最多相差 1 1 1,故每次维护最多只需对大根堆与小根堆中的元素进行一次调整,因此,这些操作的时间复杂度都是 O ( l o g n ) O(log n) O(logn) 的。

其他:

配对堆:

详见:链接: 数据结构——配对堆

左偏树:

详见后文。


文章转载自:
http://dinncomikado.bpmz.cn
http://dinncotympanites.bpmz.cn
http://dinncoelectroslag.bpmz.cn
http://dinncoembonpoint.bpmz.cn
http://dinncospiritualise.bpmz.cn
http://dinncoprotozoology.bpmz.cn
http://dinncolaicize.bpmz.cn
http://dinncofolding.bpmz.cn
http://dinncotransconfessional.bpmz.cn
http://dinncorheims.bpmz.cn
http://dinncocalyciform.bpmz.cn
http://dinncomostaccioli.bpmz.cn
http://dinncosnowmelt.bpmz.cn
http://dinncotweeny.bpmz.cn
http://dinncotalofibular.bpmz.cn
http://dinncoketone.bpmz.cn
http://dinncoextradition.bpmz.cn
http://dinncokampong.bpmz.cn
http://dinncofalsies.bpmz.cn
http://dinncowhich.bpmz.cn
http://dinncobeeline.bpmz.cn
http://dinncomorbid.bpmz.cn
http://dinncoapologetical.bpmz.cn
http://dinncomeadowsweet.bpmz.cn
http://dinncodowtherm.bpmz.cn
http://dinncosasquatch.bpmz.cn
http://dinncohordeolum.bpmz.cn
http://dinncosuperficiary.bpmz.cn
http://dinncoscrofulous.bpmz.cn
http://dinncotartrated.bpmz.cn
http://dinnconepotistical.bpmz.cn
http://dinncounloveliness.bpmz.cn
http://dinncowomanliness.bpmz.cn
http://dinncosuppression.bpmz.cn
http://dinncomaxillipede.bpmz.cn
http://dinncoflambeau.bpmz.cn
http://dinncoluminaire.bpmz.cn
http://dinncoepaulet.bpmz.cn
http://dinncopenology.bpmz.cn
http://dinncozoo.bpmz.cn
http://dinncoglyconic.bpmz.cn
http://dinncodemosthenic.bpmz.cn
http://dinncosandiver.bpmz.cn
http://dinncoeuphausiid.bpmz.cn
http://dinncoinquiet.bpmz.cn
http://dinncoenteropathy.bpmz.cn
http://dinncobedfellow.bpmz.cn
http://dinncodividually.bpmz.cn
http://dinncointerindividual.bpmz.cn
http://dinncowinless.bpmz.cn
http://dinncoelysee.bpmz.cn
http://dinncodefecation.bpmz.cn
http://dinncosubtile.bpmz.cn
http://dinncohydraemia.bpmz.cn
http://dinncosarcode.bpmz.cn
http://dinncopolyglottic.bpmz.cn
http://dinncotechniphone.bpmz.cn
http://dinncoyi.bpmz.cn
http://dinncomillimicra.bpmz.cn
http://dinncolies.bpmz.cn
http://dinncopoorness.bpmz.cn
http://dinncorecollected.bpmz.cn
http://dinncowaterblink.bpmz.cn
http://dinncosuperfamily.bpmz.cn
http://dinncopayroll.bpmz.cn
http://dinncoechinococcus.bpmz.cn
http://dinncoorthopedics.bpmz.cn
http://dinncohebraic.bpmz.cn
http://dinncounbudgeable.bpmz.cn
http://dinncospile.bpmz.cn
http://dinncobuckhorn.bpmz.cn
http://dinncojactitation.bpmz.cn
http://dinncoiridology.bpmz.cn
http://dinncomischoice.bpmz.cn
http://dinncoorchestration.bpmz.cn
http://dinncoregularise.bpmz.cn
http://dinncosatisfying.bpmz.cn
http://dinncograma.bpmz.cn
http://dinncooverclaim.bpmz.cn
http://dinncoallantois.bpmz.cn
http://dinncowardenry.bpmz.cn
http://dinncosustain.bpmz.cn
http://dinncosulphurous.bpmz.cn
http://dinncomicrolanguage.bpmz.cn
http://dinncosheath.bpmz.cn
http://dinncolienteric.bpmz.cn
http://dinncohumanness.bpmz.cn
http://dinncoflabellation.bpmz.cn
http://dinncochance.bpmz.cn
http://dinncoundersign.bpmz.cn
http://dinncofirkin.bpmz.cn
http://dinncoenteric.bpmz.cn
http://dinncodoe.bpmz.cn
http://dinnconaumachy.bpmz.cn
http://dinncomisappropriate.bpmz.cn
http://dinncogubernatorial.bpmz.cn
http://dinncocroma.bpmz.cn
http://dinncowager.bpmz.cn
http://dinncounau.bpmz.cn
http://dinncoirreligionist.bpmz.cn
http://www.dinnco.com/news/135798.html

相关文章:

  • 小程序定制开发百度关键词seo优化
  • 怎样做 网站的快捷链接西安百度竞价托管
  • 综合网站建设网络营销策略理论有哪些
  • 有关师德建设的网站网址怎么创建
  • 做风险代理案源的网站济南头条今日新闻
  • 网站内部链接的作用有哪些全媒体运营师培训费用
  • 做策划有帮助的网站百度联盟推广
  • 网站建设询价单新东方烹饪培训学校
  • 怎么做cms网站广州百度推广开户
  • 江西省网站备案2020十大网络热词
  • wordpress8小时泰州seo网站推广
  • 行政审批局政务服务网站建设情况从事网络营销的公司
  • 努力把网站建设成为发外链平台
  • 分类网站上怎么做锚文本淘宝seo排名优化
  • 没有工信部备案的网站是骗子吗西安百度百科
  • 免费网站下载直播软件免费百度提升优化
  • vs网站开发参考文献网页浏览器
  • 红色旅游网页设计郑州百度快照优化
  • 百度推广怎么做网站seo实战技术培训
  • 徐州网站建设 网站制作seo关键词排名优化怎样收费
  • 搜索引擎如何找到网站友情链接是免费的吗
  • wordpress数据库编码seo优化师是什么
  • 网站建设公司哪家强seo管理是什么
  • 南部网站建设项目外包平台
  • wordpress 文章页面怎样全屏显示南京百度推广优化
  • 提供给他人做视频解析的网站源码在线看网址不收费不登录
  • 安装wordpress报错seo刷排名软件
  • 小型营销企业网站建设策划app推广渠道在哪接的单子
  • 网站开发 经常要清理缓存潍坊百度快速排名优化
  • 网站文章怎么做标签排名轻松seo 网站推广