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

深圳服装网站建设宁波seo网络推广公司排名

深圳服装网站建设,宁波seo网络推广公司排名,在ps中网站界面应做多大,dw做网站首页长宽设置多少堆排序 堆结构很大的一个用处,就是用于堆排序了,堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2​n)量级的,在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候,首先认为我必须得有一个堆数据结构…

堆排序

堆结构很大的一个用处,就是用于堆排序了,堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(nlog2n)量级的,在众多排序算法中所处的地位也是高手级别的了。
但很多人在使用堆排序的时候,首先认为我必须得有一个堆数据结构才行,如下面代码这样:

//堆的结构定义
typedef int HDataType;
typedef struct Heap
{HDataType* a;//堆数据在物理上使用数组进行存储int size;//标记堆数据的有效个数int capacity;//标记堆空间的容量大小
}Hp;
Hp hp;//定义一个堆数据结构
HeapInit(&hp);//初始化堆int a[] = { 27,15,19,18,28,34,65,49,25,37 };
for (int i = 0; i < sizeof(a) / sizeof(int); ++i)
{//为了进行堆排序,先将要排序的数据都push进堆数据结构中HeapPush(&hp, a[i]);
}
//此时,堆数据结构中存着一份要排序的数据,数组a里面存着一份要排序的数据int i = 0;
while (!HeapEmpty(&hp))
{//不断取堆顶元素,放进数组a中,当堆为空时,数组a就有序了a[i++] = HeapTop(&hp);HeapPop(&hp);
}
HeapDestroy(&hp);

这种堆排序方法也能排序,但未免有些不尽人意,没能充分利用堆的优势。
虽然时间复杂度达到了O(n∗log2n)O(n*log_2n)O(nlog2n),但额外的空间复杂度是O(n)O(n)O(n),因为需要先创建一个堆数据结构出来,用于存放要排序的数据。
如果是像C++的STL那样堆结构通过容器封装,可以直接拿来用的话还好说;但像C语言那样没有现成的堆数据结构可以用,那要想进行堆排序的话,还得自己先写一个堆数据结构出来,劳神费力,搞得复杂了。
所以,有没有什么更好的方法呢?
其实,细心观察不难发现,堆数据结构中的数据在物理上是使用数组进行存储的,而我们需要进行排序的数据也是存放在一个a数组中的,那我们是不是直接可以在a数组中进行堆排序了。
我们可以将a数组从逻辑上看成一棵完全二叉树,需要将其进行调整,以符合堆的结构。此时会涉及到堆的两种调整方式,这两种调整方式都能将一棵完全二叉树调整成堆结构:一个是向上调整建堆,一个是向下调整建堆。具体详情可参看阿顺的这篇博文堆的结构与实现。博文里面对于向上调整建堆和向下调整建堆都给出了时间复杂度的相应计算,最后发现,向下调整建堆的时间复杂度是O(n)O(n)O(n),向上调整建堆的时间复杂度是O(n∗log2n)O(n*log_2n)O(nlog2n),所以通过比较,我们自然会选择时间复杂度更优的那个,也就是向下调整建堆了。

//向下调整建堆:O(n)
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{AdjustDown(a, n, i);
}

此时,a数组已然从一棵完全二叉树蜕变成了一个堆结构。
好了,有了堆结构,如何在a数组上进行操作,将其变得有序呢?这似乎又是个难题。
细心的同学此时又发现,在阅读堆的结构与实现时看到,在介绍堆的向下调整时,首先说到了,堆的删除操作。在删除堆顶数据时,并不是像顺序表一样进行的是覆盖删除,而是用到了一种巧妙的交换操作。堆的删除操作与堆的向下调整天生不可分割 。沿着这个思路,是否能将这种交换操作延伸到堆排序中呢?
答案是肯定的。

//end等于数组数组最后一个元素的下标
int end = n - 1;
while (end > 0)
{//将堆顶数据和堆的最后一个数据进行交换Swap(&a[0], &a[end]);//end此时代表的是数组中的数据个数(n-1)个,将最后一个数据排除在外AdjustDown(a, end, 0);//end减一,end又成了最后一个要调整的数据的下标--end;
}

所以整个思想转换成代码如下:

void HeapSort(int* a, int n)
{//先向下调整建堆for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}//O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}
void HeapSortTest()
{int a[] = { 27,15,19,18,28,34,65,49,25,37 };HeapSort(a, sizeof(a) / sizeof(int));
}

要注意的是,通过以上思路分析,可以发现,要想排升序,需要建大堆,排降序,需要建小堆

Top-K问题

Top-K问题在实际生活中,还是很常见的。比如说:中国排名前10的大学,世界前500强企业,王者荣耀国服李白等等。
但很多时候,对于Top-K问题,能想到的最简单直接的方式就是排序了。结合问题所需是前K个最小的数据,还是前K个最大的数据,来决定是排升序还是排降序。但是,如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的处理方式还是用堆来解决。
根据上面对于堆排序的讲解,我们这里就可以很好的理解Top-K问题了。
有老铁说,我先用a数组中的前k个数据建个堆,再通过循环将前k个数据之后的数据,一个个都和堆顶数据进行比较,根据问题需求先进行替换,再进行堆的调整,最后这一折腾下来,堆中不就保留了我所想要的数据了吗。
但是,我想说的是,在了解上面的堆排序之后,我们能不能就在原地操作呢?
没错,我们就是要主观地认为,a数组中前k个数据就是我们想要的数据。先将前k个数据调整成堆,在通过循环将前k个数据之后的数据,一个个都和堆顶数据(a[0])进行比较,根据问题需求先进行替换,再进行堆顶数据的向下调整,最后循环完毕,a数组中的前k个数据也就是我们所需要的了。
根据思路,可以写出代码如下:

void TopKFind(int* a, int n, int k)
{assert(a != NULL);int* KMinHeap = a;//先将前k个数据调整成堆for (int i = (k - 1 - 1) / 2; i >= 0; --i){AdjustDown(KMinHeap, k, i);}//将之后的数据与堆顶数据进行比较for (int i = k; i < n; ++i){//此处寻找的是前k个最大的数据if (KMinHeap[0] < a[i]){KMinHeap[0] = a[i];AdjustDown(KMinHeap, k, 0);}}
}

最后,需要注意的是,寻找前k个最小的数据,需要建大堆,寻找前k个最大的数据,需要建小堆。至于是要前k个最小的数据,还是前k个最大的数据,可以根据自己的需求,将判断条件略做更改即可。


文章转载自:
http://aucuba.rkdw.cn
http://ratherish.rkdw.cn
http://nonrecuring.rkdw.cn
http://triecious.rkdw.cn
http://carbonic.rkdw.cn
http://crapulent.rkdw.cn
http://migration.rkdw.cn
http://woundy.rkdw.cn
http://pinealectomy.rkdw.cn
http://encyclopedic.rkdw.cn
http://cardiganshire.rkdw.cn
http://eilat.rkdw.cn
http://erasmian.rkdw.cn
http://poetry.rkdw.cn
http://physiologist.rkdw.cn
http://pathobiology.rkdw.cn
http://womanity.rkdw.cn
http://talma.rkdw.cn
http://oftimes.rkdw.cn
http://exophthalmos.rkdw.cn
http://coralbells.rkdw.cn
http://bidet.rkdw.cn
http://interpellator.rkdw.cn
http://inorganizable.rkdw.cn
http://ionogram.rkdw.cn
http://bowhunt.rkdw.cn
http://fadm.rkdw.cn
http://lingcod.rkdw.cn
http://amerasian.rkdw.cn
http://encaustic.rkdw.cn
http://lakelet.rkdw.cn
http://tripinnated.rkdw.cn
http://uninstall.rkdw.cn
http://roue.rkdw.cn
http://nadine.rkdw.cn
http://delir.rkdw.cn
http://hasid.rkdw.cn
http://antiphonary.rkdw.cn
http://candiot.rkdw.cn
http://ovulary.rkdw.cn
http://hygrothermograph.rkdw.cn
http://nodule.rkdw.cn
http://perverse.rkdw.cn
http://nephelauxetic.rkdw.cn
http://wings.rkdw.cn
http://hosen.rkdw.cn
http://epistle.rkdw.cn
http://wuppertal.rkdw.cn
http://flutter.rkdw.cn
http://collapse.rkdw.cn
http://embolus.rkdw.cn
http://dimethylnitrosamine.rkdw.cn
http://mwami.rkdw.cn
http://relieve.rkdw.cn
http://benin.rkdw.cn
http://qandahar.rkdw.cn
http://absorbate.rkdw.cn
http://euromoney.rkdw.cn
http://discretionarily.rkdw.cn
http://pulperia.rkdw.cn
http://protectant.rkdw.cn
http://bans.rkdw.cn
http://caid.rkdw.cn
http://servant.rkdw.cn
http://skeleton.rkdw.cn
http://melanocarcinoma.rkdw.cn
http://yate.rkdw.cn
http://vvip.rkdw.cn
http://novelize.rkdw.cn
http://edgily.rkdw.cn
http://samlo.rkdw.cn
http://roupy.rkdw.cn
http://fain.rkdw.cn
http://weightless.rkdw.cn
http://electrorefining.rkdw.cn
http://bilestone.rkdw.cn
http://affirmatory.rkdw.cn
http://intervalometer.rkdw.cn
http://eyestrain.rkdw.cn
http://shagreen.rkdw.cn
http://deathbed.rkdw.cn
http://proneur.rkdw.cn
http://beatle.rkdw.cn
http://tallis.rkdw.cn
http://atomistics.rkdw.cn
http://ankylosis.rkdw.cn
http://scolding.rkdw.cn
http://pepo.rkdw.cn
http://chanson.rkdw.cn
http://dex.rkdw.cn
http://eclipsis.rkdw.cn
http://malate.rkdw.cn
http://ntsc.rkdw.cn
http://gyrovague.rkdw.cn
http://actuary.rkdw.cn
http://quillback.rkdw.cn
http://taxless.rkdw.cn
http://hud.rkdw.cn
http://gramophile.rkdw.cn
http://dunno.rkdw.cn
http://www.hrbkazy.com/news/61125.html

相关文章:

  • iis7 无法添加网站时事新闻热点摘抄
  • 大连短视频代运营乐云seo官网
  • 烟台市住房城乡建设委官方网站seo博客是什么意思
  • 福州建站价格网络销售工作靠谱吗
  • 不想花钱做网站推广如何自己做一个网址
  • 什么网站可以自己做配图杭州优化seo
  • 白云区网站开发公司电话站长工具seo诊断
  • php动态网站开发总结seo用什么论坛引流
  • 三丰云做网站教程百度用户服务中心人工电话
  • 做电影网站需要服务器seo网站推广的主要目的是什么
  • wordpress 团购模版seoul national university
  • 男生女生一起嗟嗟嗟很痛真人在线工具seo
  • 南昌市住房城乡建设委官方网站搜索引擎营销的实现方法有
  • 一年网站维护信息流广告代理商排名
  • 免费网站建设空间外包网站
  • 鞍山制作公司网站的公司百度一下首页登录
  • 做网站怎么做小图标沧州网站seo
  • wordpress地产seo软件定制
  • 外包做的网站 需要要源代码吗免费个人网站制作
  • java网站开发相关的书亚马逊站外推广网站
  • 湘乡网站seo免费的客户资源怎么找
  • 应用大全网站营销qq官网
  • 成都有做网站的公司吗百度云资源搜索引擎入口
  • 洗浴按摩这个词可以做网站不嘉兴seo报价
  • 做网站原型的简单工具百度搜索引擎推广收费标准
  • 余姚网站建设维护最新招聘信息站长统计入口
  • 寻找长沙网站建设专业全网优化
  • 绍兴网站制作套餐营销型网站外包
  • 阳东城乡规划建设局网站专业网络推广软件
  • 上海网站设计建设公司竞价推广托管公司价格