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

网站访问量怎么做百度指数官网首页

网站访问量怎么做,百度指数官网首页,自己做游戏网站学什么,计算机有哪些专业若对树与二叉树的相关概念,不太熟悉的同学,可移置上一期博客 链接:二叉树第一期:树与二叉树的概念-CSDN博客 本博客目标:对二叉树的顺序结构,进行深入且具体的讲解,同时学习二叉树顺序结构的应用…

若对树与二叉树的相关概念,不太熟悉的同学,可移置上一期博客

链接:二叉树第一期:树与二叉树的概念-CSDN博客

本博客目标:对二叉树的顺序结构,进行深入且具体的讲解,同时学习二叉树顺序结构的应用——数据结构:堆的实现,以及堆的应用:如堆排序,又或者TOP-K问题;

感谢移置残风的主页:残风也想永存-CSDN博客,❤❤❤

一、堆的定义

  • 堆的定义:堆是一颗完全二叉树,且所有的父亲结点与子结点有相同的大小关系。
  • 大堆:所有的父亲结点的值 都比 子结点要
  • :所有的父亲结点的值 都比 子结点要

        上期,我们讲过,对于完全二叉树,若用数组的下标0,1,2...,从左到右依次表示第一层,第二层...,则父亲结点与子结点的关系,可用下标表示出来。

        而堆本身就是一种特殊的完全二叉树,所以用顺序结构表示堆,再简单不过~

二、堆的实现讲解

//堆的结构体声明与定义

typedef int HpDateType;

typedef struct Heap
{
    HpDateType* date;
    size_t size;
    size_t capacity;
}Heap;

//堆的函数接口声明:

void HeapInit(Heap* php);//初始化
void HeapDestory(Heap* php);//销毁
void HeapPush(Heap* php, HpDateType x);//插入 
void HeapPop(Heap* php);//删除堆顶的元素
HpDateType HeapTop(Heap* php);//返回堆顶元素
size_t HeapSize(Heap* php);//返回堆的数据个数
bool HeapEmpty(Heap* php);//判空

//以下为上面函数接口的子函数,其目的是插入或

//删除元素后,符合堆的定义——但因其重要性~,下面会着重讲解

void AdjustUp(HpDateType* a, int n);//向上调整算法
void AdjustDown(HpDateType* a, int n, int size);向下调整算法

        通过上面的声明,可以清楚的发现,其堆的实现,和动态顺序表的实现,极为相似;但又有一些区别; 比如在插入数据的时候,我们并不只是在最后一个数据的后面插入一个数据就行了,而是要通过向上调整算法,保持其符合堆的定义;在删除数据的时候,我们也不是删除最后一个数据,而是删除堆顶的元素。

1.向上调整算法
i.实现思路讲解

        应用效果:给你一个堆,在尾部任意插入元素,将该结点调整到适合他的位置,大堆,比父亲小;若是小堆,比父亲小。  

         (建大堆)将插入得新结点,与其父亲做比较,若比父亲大,则交换数据,进行下一次循环,若比父亲小,或该结点的下标到0位置,则调整完毕,循环结束。 

ii.复杂度

        向上调整算法:最坏的情况,为调整高度次,假设二叉树的有N个结点,所以时间复杂度为O(logN)

iii.代码
void AdjustUp(HpDateType* a, int n)
{assert(a);int child = n;int father = (child - 1) / 2;while (child > 0){// 大堆if (a[child] > a[father]){Swap(&a[father], &a[child]);child = father;father = (child - 1) / 2;}else break;}
}
2.向下调整算法
i.实现思路讲解

        向下调整算法使用前提:左右子树是相同的堆,若是建小堆,左右子树都是小堆,才可使用向下调整算法;

ii.时间复杂度推导

        向下调整算法:最坏的情况,为调整高度次,假设二叉树的有N个结点,所以时间复杂度为O(logN)

iii.代码
void AdjustDown(HpDateType* a, int n, int size)
{assert(a);int father = n;int child = 2 * father + 1;while (2 * father + 1 < size){// 左孩子比父亲大的假设不成立if (child + 1 < size && a[child] < a[child + 1]){child += 1;}// 大堆if (a[child] > a[father]){Swap(&a[child], &a[father]);father = child;child = 2 * father + 1;}elsebreak;}
}
3.插入元素

         在插入数据的时候,我们并不只是在最后一个数据的后面插入一个数据就行了,而是要通过向上调整算法,保持其符合堆的定义;

void HeapPush(Heap* php, HpDateType x)
{assert(php);//查容 & 扩容 if (php->size == php->capacity){size_t newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HpDateType* tmp = (HpDateType*)realloc(php->date, newcapacity * sizeof(HpDateType));if (!tmp){perror("realloc mistake");exit(-1);}php->date = tmp;php->capacity = newcapacity;}//插入php->date[php->size++] = x;//向上调整堆;AdjustUp(php->date, php->size - 1);
}
4.删除堆顶元素

        在删除数据的时候,我们也不是删除最后一个数据,而是删除堆顶的元素。且要通过向下调整算法,保持其符合堆的定义;

void HeapPop(Heap* php)
{assert(php);assert(php->size > 0);//踹走堆顶元素;Swap(&php->date[0], &php->date[php->size-1]);php->size--;//向下调整堆AdjustDown(php->date, 0, php->size);
}

三、实现堆的源码

1.Heap.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<time.h>
#include<assert.h>typedef int HpDateType;typedef struct Heap
{HpDateType* date;size_t size;size_t capacity;
}Heap;void HeapInit(Heap* php);//初始化
void HeapDestory(Heap* php);//销毁
void HeapPush(Heap* php, HpDateType x);//插入 
void HeapPop(Heap* php);//删除 
HpDateType HeapTop(Heap* php);//返回堆顶元素
size_t HeapSize(Heap* php);//返回堆的数据个数
bool HeapEmpty(Heap* php);//判空void AdjustUp(HpDateType* a, int n);
void AdjustDown(HpDateType* a, int n, int size);
2.Heap.c
#define _CRT_SECURE_NO_WARNINGS 1#include"Heap.h"void HeapInit(Heap* php)
{assert(php);php->date = NULL;php->size = php->capacity = 0;
}void HeapDestory(Heap* php)
{assert(php);free(php->date);php->date = NULL;php->size = php->capacity = 0;
}void Swap(HpDateType* e1, HpDateType* e2)
{int tmp = *e1;*e1 = *e2;*e2 = tmp;
}void AdjustUp(HpDateType* a, int n)
{assert(a);int child = n;int father = (child - 1) / 2;while (child > 0){// 小堆if (a[child] < a[father]){Swap(&a[father], &a[child]);child = father;father = (child - 1) / 2;}else {break;}	}
}void HeapPush(Heap* php, HpDateType x)
{assert(php);//查容 & 扩容 if (php->size == php->capacity){size_t newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HpDateType* tmp = (HpDateType*)realloc(php->date, newcapacity * sizeof(HpDateType));if (!tmp){perror("realloc mistake");exit(-1);}php->date = tmp;php->capacity = newcapacity;}//插入php->date[php->size++] = x;//向上调整堆;AdjustUp(php->date, php->size - 1);
}void AdjustDown(HpDateType* a, int n, int size)
{assert(a);int father = n;int child = 2 * father + 1;while (2 * father + 1 < size){// 左孩子比父亲小的假设不成立if (child + 1 < size && a[child] > a[child + 1]){child += 1;}// 小堆if (a[child] < a[father]){Swap(&a[child], &a[father]);father = child;child = 2 * father + 1;}else{break;}}
}void HeapPop(Heap* php)
{assert(php);assert(php->size > 0);//踹走堆顶元素;Swap(&php->date[0], &php->date[php->size-1]);php->size--;//向下调整堆AdjustDown(php->date, 0, php->size);
}HpDateType HeapTop(Heap* php)
{assert(php);return php->date[0];
}size_t HeapSize(Heap* php)
{assert(php);return php->size;
}
bool HeapEmpty(Heap* php)
{assert(php);return php->size == 0;
}

四、堆的应用 

1.建堆
i.向上调整建堆(时间复杂度推导)

        问题:给你一个数组,返回一个大堆;

        问起建堆,可能你们会说,创建一个堆的数据结构,然后不断的Push就行了;可是空间复杂度却是O(N),我们如何在空间复杂度O(1)的情况下,建一个堆呢?

        HeapPush的时候,是在堆尾插入一个数据,然后向上调整,而我们其实可以省去插入的过程,在给定数组的上面,只使用向上调整算法,实现建堆;

        省去了开辟空间的消耗,空间复杂度为O(1);时间复杂度为O(NlogN)

 

ii. 向下调整建堆(时间复杂度推导)

        向上调整建堆的时间复杂度为O(NlogN),若面试官说O(NlogN),不好,问你能否将时间复杂度?你是否会觉得不可思议?而你又会如何解决呢?我们大脑的思维很难凭空创造,但我们可以从已有的问题,得到启发;下面我们重新分析一下向上调整建堆时间浪费在何处,

        我们会发现,层数越高结点,最坏调整次数越高,与此同时,结点个数也越多,我说这可能是问题的突破高,我们如何让调整次数多的结点,个数减少呢?我们会想到向下调整算法,向下调整算法,有个使用前提:左右子树是相同的堆,才可使用向下调整算法。所以我们可以从最后一个非叶子结点往前调整;如上图,先向下调整28结点,依次往前13、56、32、...、到最后的根结点。       

        优点:结点个数越多的那一层,向下调整次数反而越少;时间复杂度为O(N)

                


文章转载自:
http://ghastliness.tbjb.cn
http://macrocell.tbjb.cn
http://procurable.tbjb.cn
http://clog.tbjb.cn
http://ponticello.tbjb.cn
http://pupae.tbjb.cn
http://desolately.tbjb.cn
http://strigil.tbjb.cn
http://histiocyte.tbjb.cn
http://rsfsr.tbjb.cn
http://olefin.tbjb.cn
http://hemiscotosis.tbjb.cn
http://karachi.tbjb.cn
http://malthusian.tbjb.cn
http://lepidolite.tbjb.cn
http://nonresidence.tbjb.cn
http://droplight.tbjb.cn
http://volume.tbjb.cn
http://clasp.tbjb.cn
http://antismog.tbjb.cn
http://countermarch.tbjb.cn
http://planning.tbjb.cn
http://thaumaturgic.tbjb.cn
http://ganoin.tbjb.cn
http://lobeline.tbjb.cn
http://pushful.tbjb.cn
http://lippie.tbjb.cn
http://ley.tbjb.cn
http://dilator.tbjb.cn
http://pantology.tbjb.cn
http://nippy.tbjb.cn
http://crinolette.tbjb.cn
http://melchisedech.tbjb.cn
http://jacques.tbjb.cn
http://sultriness.tbjb.cn
http://rejoinder.tbjb.cn
http://tallinn.tbjb.cn
http://apposable.tbjb.cn
http://grovel.tbjb.cn
http://vanuatuan.tbjb.cn
http://inculcation.tbjb.cn
http://hatasu.tbjb.cn
http://whort.tbjb.cn
http://plasmosome.tbjb.cn
http://socko.tbjb.cn
http://telesale.tbjb.cn
http://seedling.tbjb.cn
http://interlunar.tbjb.cn
http://alterative.tbjb.cn
http://pittypat.tbjb.cn
http://folate.tbjb.cn
http://trawlboat.tbjb.cn
http://phyllocaline.tbjb.cn
http://apelles.tbjb.cn
http://squirish.tbjb.cn
http://uncounted.tbjb.cn
http://recrimination.tbjb.cn
http://interchurch.tbjb.cn
http://superrealist.tbjb.cn
http://adjuration.tbjb.cn
http://streptococcus.tbjb.cn
http://baste.tbjb.cn
http://steppe.tbjb.cn
http://corey.tbjb.cn
http://disillusionment.tbjb.cn
http://gallophobia.tbjb.cn
http://liable.tbjb.cn
http://flocculent.tbjb.cn
http://superhelix.tbjb.cn
http://implead.tbjb.cn
http://paly.tbjb.cn
http://marriageable.tbjb.cn
http://raysistor.tbjb.cn
http://reroll.tbjb.cn
http://ppfa.tbjb.cn
http://baywreath.tbjb.cn
http://pindaric.tbjb.cn
http://locked.tbjb.cn
http://goa.tbjb.cn
http://vaccinee.tbjb.cn
http://marginalist.tbjb.cn
http://microlepidopteron.tbjb.cn
http://saltimbocca.tbjb.cn
http://metatarsal.tbjb.cn
http://oviduct.tbjb.cn
http://vulnerable.tbjb.cn
http://photorealism.tbjb.cn
http://defilade.tbjb.cn
http://metis.tbjb.cn
http://jemimas.tbjb.cn
http://litigious.tbjb.cn
http://anhistous.tbjb.cn
http://alap.tbjb.cn
http://ameba.tbjb.cn
http://avatar.tbjb.cn
http://oona.tbjb.cn
http://pathobiology.tbjb.cn
http://putrefiable.tbjb.cn
http://exteroceptor.tbjb.cn
http://uintathere.tbjb.cn
http://www.dt0577.cn/news/83918.html

相关文章:

  • 帮我们公司做网站在百度怎么发广告做宣传
  • 网站可以做电信增值百度登录注册
  • 网站建设需求参考文档爱站网关键词
  • 网站建设与管理教学设计深圳推广网络
  • 郑州手机软件开发公司seo文章范文
  • 网站架设工具需要一个网站
  • wordpress网页中添加3个音乐播放seo公司官网
  • 国土分局网站建设方案重庆网站seo推广公司
  • 专注徐州网站开发天津网站排名提升
  • 做救助流浪动物网站的产生背景活动推广方案
  • 做网站的必要性网站seo收费
  • 男女直接做的视频网站搜索引擎的工作原理是什么
  • 网站如何接广告今日山东新闻头条
  • 建设明星网站的目的论文百度推广方案
  • 青岛找网站建设公司哪家好杭州seo关键词优化公司
  • 自己如何建设网站步骤简述企业网站推广的一般策略
  • 上海详细地址大全青岛seo网络优化公司
  • 高水平的大连网站建设百度网盘资源免费搜索引擎入口
  • 自己建站营销图片素材
  • 腾讯云主机做网站自助发外链网站
  • 长沙做网站的公司有哪些统计站老站长推荐草莓
  • 阿里巴巴建网站中国域名网官网
  • 做宠物商品的网站软文新闻发布平台
  • 上海社区网站建设搜索引擎推广方法
  • 如何注册公司需要多少钱温州seo按天扣费
  • 西安手机网站建设公司排名广州专门做网站
  • 北京建网站长沙百度快速排名
  • 南京seo推广杭州seo博客
  • 广西住建厅八大员报名网站互动营销名词解释
  • 深圳网站建设 沙漠风免费域名注册二级域名