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

福州网站制作工具汕头网站建设系统

福州网站制作工具,汕头网站建设系统,山东网站方案,口碑营销属于什么营销文章目录 堆的概念堆的实现HeapPushHeapPop HeapTop HeapSize HeapEmpty堆的应用 堆的概念 堆是一颗完全二叉树每个结点的值都小于子结点的值,这颗二叉树为小根堆每个结点的值都大于子结点的值,这颗二叉树为大根堆堆的定义如下:n个元素的序列…

文章目录

  • 堆的概念
  • 堆的实现
    • HeapPush
    • HeapPop
  • HeapTop HeapSize HeapEmpty
  • 堆的应用

堆的概念

  • 堆是一颗完全二叉树
  • 每个结点的值都小于子结点的值,这颗二叉树为小根堆
  • 每个结点的值都大于子结点的值,这颗二叉树为大根堆
  • 堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
    在这里插入图片描述
    堆的性质
  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。

堆的实现

在讲堆的实现前,我们首先要知道堆需要实现的功能。

  • HeapPush
  • HeapPop(删除根结点)
  • HeapTop
  • HeapSize
  • HeapEmpty
    接下来我们要先创建和销毁一个堆。
typedef int HeapType;
typedef struct Heap
{HeapType* arr;int size;int capacity;
}Hp;
void HeapInit(Hp* php)
{assert(php);php->arr = NULL;php->capacity = php->size = 0;
}
void HeapDestroy(Hp* php)
{assert(php);free(php->arr);php->arr = NULL;php->capacity = php->size = 0;
}

HeapPush

实现HeapPush时难点在于如何保持整体是一个堆。
即在一个堆的后面插入一个值,那么这棵完全二叉树大概率不会是堆,那么我们需要将这个值和其父结点比较,再根据需要交换值,也就是AdjustUp。
那么接下来以小根堆为例,实现HeapPush。

void Swap(HeapType* a, HeapType* b)
{HeapType tmp = *a;*a = *b;*b = tmp;
}
void AdjustUp(HeapType* arr, int child)
{int parent = (child - 1) / 2;while (child>0){if (arr[child] < arr[parent]){Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void HeapPush(Hp* php, HeapType x)
{assert(php);if (php->size == php->capacity){int newcapacity = (php->capacity == 0 ? 4 : 2 * php->capacity);HeapType * tmp = (HeapType*)realloc(php->arr,newcapacity * sizeof(HeapType));if (!tmp){perror("realloc fail!");exit(-1);}php->arr = tmp;php->capacity = newcapacity;}php->arr[php->size] = x;php->size++;AdjustUp(php->arr, php->size - 1);
}

HeapPop

实现HeapPop也是和HeapPush一样,需要考虑的是如何维持整体完全二叉树是一个堆,由于我们删除的是根结点,如果将根结点的子结点向上调整,那么整体二叉树就会空出一个位置,导致变成非完全二叉树。
这里的解决办法是将根结点和最后一个结点交换,删除最后一个结点,然后再对根结点进行向下调整。

void AdjustDown(HeapType* a, int n, int parent)
{int child = 2 * parent + 1;while (child<n){if (child + 1 < n && a[child] > a[child + 1]){child++;}if (a[parent] > a[child]){Swap(&a[child], &a[parent]);parent = child;child = 2 * parent - 1;}else{break;}}
}
void HeapPop(Hp* php)
{assert(php);assert(php->size);Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;AdjustDown(php->arr, php->size, 0);
}

HeapTop HeapSize HeapEmpty

实现了Heap的Push和Pop后,那么取根结点的值和判空、判满也是手到擒来的。

HeapType HeapTop(Hp* php)
{assert(php);assert(php->size);return php->arr[0];
}
size_t HeapSize(Hp* php)
{assert(php);return php->size;
}
bool HeapEmpty(Hp* php)
{assert(php);return php->size == 0;
}

堆的应用

实现了堆那么我们肯定要知道能用在什么地方才行,实际上堆的应用也是非常广泛的:

  1. 实现堆排序
  2. 求Top K值问题
  3. 求中位数、百分位数

等等。
堆的应用还有很多,这里就不一一赘述了。

http://www.yayakq.cn/news/909290/

相关文章:

  • 深圳平湖网站建设百度seo公司哪家好一点
  • php建站系统源码建e网室内设计网的简介
  • 广州微信网站设计网站登录模版 下载
  • 沈阳网站制作公司百度网站建设策划书范文
  • 大良品牌网站建设南京网站优化平台
  • 做网站申请完域名后做什么服装网站建设案例分析
  • 万江网站建设付费恶意点击软件
  • 企业营销网站建设费用预算福州做网站的公
  • 有多少网站建设外包山东省建设资格注册中心网站
  • 吉木萨尔县建设局网站刚做的网站怎么才能搜索到
  • 网站开发工具蜡笔小新擦边球网站怎么建设
  • 电商网站的建设背景图片网站建设外包公司容易被客户投诉吗
  • 北京营销型网站建设费用两个网站链接如何做
  • 网站服务器租用和自己搭建的区别卡二卡三卡四精品
  • 郑州做网站公司汉狮国际实时新闻最新消息
  • jquery 个人网站镇江丹阳怎么样
  • 培训网站设计如何推广自己网站的关键词
  • 软件开发软件开发网站lamp网站开发经验
  • 余姚住房和建设局网站个人网站费用
  • 北京公司注册核名网站网站开发 界面
  • 网站怎么响应式布局html网站开发软件
  • 做影视网站违法一键生成app的软件
  • 南海网站建设哪家好九江网站建设求职简历
  • 贵阳做网站好的公司新媒体营销策略分析
  • 素材网站源码域名怎么拿来做网站
  • 歌曲网站源码深圳网站订制开发
  • 企业网站建设算什么费用wordpress dopt函数
  • 网站搭建联系方式爱站网关键词长尾挖掘工具
  • 网站建设泉州效率网络网页游戏网址有哪些
  • 怀化建设局网站域名注册了怎么才能用