数据结构与算法笔记:线性建堆

  ACM大牛带你玩转算法与数据结构-课程资料

 本笔记属于船说系列课程之一,课程链接:

哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/cheese/play/ep66799?csource=private_space_class_null&spm_id_from=333.999.0.0

你也可以选择购买『船说系列课程-年度会员』产品『船票』,畅享一年内无限制学习已上线的所有船说系列课程:船票购买入口icon-default.png?t=N7T8https://www.bilibili.com/cheese/pages/packageCourseDetail?productId=598

做题网站OJ:HZOJ - Online Judge

Leetcode :力扣 (LeetCode) 全球极客挚爱的技术成长平台

前置普通建堆:数据结构——堆

线性建堆法

        普通建堆法的时间复杂度度是O(nlogn),而线性键堆法的时间复杂度是O(n)的。

        普通建堆法是通过向上调整的,应为每次它添加一个元素都是添加在堆的末尾,然后通过一步一步的向上调整,而这个过程的时间复杂度就是n(logn)为什么是log(n),二叉树的高度约等于log(n),那么它每次调整都是向上层调整一次,所以就需要调整约logn次,那么需要添加n个元素,那么它的时间复杂度就为n * logn。

        而线性建堆法是通过向下调整的

        比如:

        现在有一个数组

        将它模拟成二叉树的模样:

        

        现在需要一个大顶堆,让后采用线性建堆法,也就是向下调整,从最下面有子节点的节点开始调整:

        现在就是从倒数第二层开始调整:

        然后再在向上一层就是根节点的位置:

        

        整个过程只用了4次调整,而普通键堆方法需要用7次,就用这个数组可以去自己去试一下。

线性键堆法的时间复杂度:

        现在假如有一颗完全二叉树,他的高度有k。

        这样可以推算出线性建堆法的时间复杂度为O(n)为常量级别的。

下面是线性键堆法的代码演示:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define swap(a, b) {\
    __typeof(a) __a = (a);\
    (a) = (b);\
    (b) = __a;\
}

int *getNewData(int n) {
    int *arr = (int *)malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) arr[i] = rand() % 1000;
    return arr;
}

void down_updata(int *, int, int);

//堆排序
void heap_sort(int *data, int n) {
    for (int i = n; i >= 1; i--) {
        swap(data[1], data[i]);
        down_updata(data, 1, i - 1);
    }
    return ;
}

void down_updata(int *data, int i, int n) {
    while ((i << 1) <= n) {
        int ind = i, l = i << 1, r = (i << 1) + 1;
        if (data[l] > data[ind]) ind = l;
        if (r <= n && data[r] > data[ind]) ind = r;
        if (i == ind) break;
        swap(data[i], data[ind]);
        i = ind;
    }
    return ;
}

void line_bulid_pq(int *data, int n) {
    for (int i = n / 2; i >= 1; i--) {
        down_updata(data, i, n);
    }
}
//线性键堆法
void line_pq(int *arr, int n) {
    int *data = arr - 1;
    line_bulid_pq(data, n);
    heap_sort(data, n);
}

int check(int *arr, int n) {
    for (int i = 1; i < n; i++) {
        if (arr[i] < arr[i - 1]) return 0;
    }
    return 1;
}

void output(int *arr, int n) {
    if (!check(arr, n)) {
        printf("is fail\n");
        return ;
    }
    for (int i = 0; i < n; i++) {
        i && printf(" ");
        printf("%d", arr[i]);
    }
    putchar(10);
    return ;
}

int main() {
    srand(time(0));
    #define MAX_N 100
    int *arr = getNewData(MAX_N);
    line_pq(arr, MAX_N);
    output(arr, MAX_N);
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

110. turtle库创建画笔对象

110. turtle库创建画笔对象 【目录】 文章目录 110. turtle库创建画笔对象1. 知识回顾-类与对象1.1 类1.2 对象 2. 创建画笔对象2.1 方法12.1 方法2 3. 绘制一个正方形4. 总结 【正文】 1. 知识回顾-类与对象 类是创建对象的蓝图。 对象是类的实例。 1.1 类 类&#xff08;…

001-谷粒商城-微服务剖析

1、架构图 还是很强的&#xff0c;该有的都有 2、微服务模块 SpringCloudAlibaba组件包括 SentinelNacosRocketMQSeata 搭配SpringCloudAlibaba组件 OpenFeignGateWayRibbn gateway使用了SpringWebFlux&#xff0c;前几天研究到&#xff0c;为什么springboot不直接使用Spri…

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码&#xff1a;实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…

Android Graphics 显示系统 - 解读Source Crop和Display Frame(三二)

“ 假设你手里有一张足够大的白纸&#xff0c;请你把它对折51次。想象一下&#xff0c;它会有多高&#xff1f;1米&#xff1f;2米&#xff1f;其实&#xff0c;这个厚度超过了地球和太阳之间的距离&#xff01;人生亦如此&#xff0c;不用心去投资&#xff0c;它不过是51张白纸…

事务并发控制之说透mvcc

前言 不知道有没有人有过这样的想法&#x1f4a1;&#xff0c;为什么在MySQL中已经有了各种各样的锁了&#xff0c;还需要mvcc呢&#xff1f;如果你没有想过这个问题&#xff0c;那只能证明你真的没有想过。 但是我的建议是可以去想一下&#xff0c;如果你从来没有想过这个问…

虚拟机扩容方法

概述 我的虚拟机开始的内存是40G,接下来要扩成60GB 扩容步骤 步骤1 步骤2 步骤3 修改扩容后的磁盘大小&#xff0c;修改后的值只可以比原来的大&#xff0c;修改完成后点击扩展&#xff0c;等待扩展完成 步骤4 虽然外面扩展成功&#xff0c;但是新增的磁盘空间虚拟机内部还…

自动化测试的7个步骤

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

阿里巴巴Java开发规范——编程规约(3)

# 阿里巴巴Java开发规范——编程规约&#xff08;3&#xff09; 编程规约 &#xff08;四&#xff09; OOP规约 1.【强制】构造方法里面禁止加入任何业务逻辑&#xff0c;如果有初始化逻辑&#xff0c;请放在 init 方法中 这条编程规范的目的是为了保持代码的清晰性、可读性…

怎么理解算力?1000P算力是什么概念?

算力&#xff0c;指计算机系统在单位时间内能够完成的计算任务量&#xff0c;它涵盖了CPU、GPU、TPU等硬件&#xff0c;每秒能处理的数据量&#xff0c;通常以“P”&#xff08;PetaFLOPS&#xff0c;即千万亿次浮点运算每秒&#xff09;为单位来衡量&#xff0c;是评估计算机性…

【笔试强训】day8

没啥好说&#xff0c;都是一遍过 1.求最小公倍数 思路&#xff1a; 求lcm。其实就是两数之乘积除以两个数的gcd。gcd就是是求两个数的最大公约数。 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;int gcd(int a, int …

虚拟线程的定义及使用

0.前言 长期以来&#xff0c;虚拟线程是 Java 中最重要的创新之一。 它们是在 Project Loom 中开发的&#xff0c;自 Java 19 作为预览功能以来一直包含在 JDK 中&#xff0c;自 Java 21 作为最终版本 (JEP 444) 以来&#xff0c;它们已包含在 JDK 中。 1.虚拟线程的作用 任…

【C++】双指针算法:复写零

1.题目 别看这是一道简单题&#xff0c;它的通过率低于一些中等甚至困难的题目&#xff01; 大大增加这道题目难度的是最后一句话&#xff1a;1.不可越界写入。2.就地修改。 如果可以再创建一个数组的话&#xff0c;那么这道题目就会非常简单&#xff0c;但这道题目必须要求在…

网络工程师---第十天

ARP表&#xff1a; 提起ARP表必然先想起ARP&#xff08;address resolution protocol&#xff09;协议&#xff0c;地址解析协议。 在实际应用中&#xff0c;我们经常遇到这样的问题&#xff1a;已知一个机器的IP地址&#xff0c;但在实际网络的链路上传送数据帧时&#xff0c;…

Redis安装部署教程

文章目录 Redis安装部署 Redis安装部署 &#xff08;1&#xff09; 下载xx.msi安装包&#xff0c;可以通过该下载地址进行下载。 &#xff08;2&#xff09; 双击下载的安装包进行安装。 &#xff08;3&#xff09; 选择安装目录&#xff08;默认C盘&#xff09;&#xff…

Kali Linux扩容(使用图形化界面)

因为今天在拉取vulhub中的镜像的时候报错空间不够&#xff0c;因为最开始只给了20GB的空间&#xff0c;所以现在需要扩容了&#xff0c;结合了一下网上的找到了简便的解决方法 1.首先虚拟机设置->磁盘->扩展 小插曲&#xff1a;在对虚拟机磁盘进行扩容以后&#xff0c;…

Flask-SQLAlchemy 中使用显式主主数据库设置

1、问题背景 在一个 Flask-SQLAlchemy 项目中&#xff0c;用户想要使用显式主主数据库设置。具体而言&#xff0c;他想要能够从默认数据库中读取数据&#xff0c;并将数据持久化到两个主数据库中。他希望知道是否可以使用 Flask-SQLAlchemy 和 binds 来实现这一目标。 2、解决…

解决宝塔面板无法访问(无法访问或拒绝链接)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;Linux ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题如下&#xff1a; 本人设置了授权IP&#xff0c;但是有些问题&#xff0c;所以是打算取消授权IP 重…

使用QQ邮箱进行登录验证

使用场景不多说&#xff0c;接下来直接看实现~ 登录到QQ邮箱&#xff0c;进入设置 打开IMAP/SMTP服务&#xff0c;记得把授权码记录下来&#xff0c;后面配置文件中需要用到 新建application的配置文件 spring:mail:# 指定邮件服务器地址host: smtp.qq.comusername: 你自己的q…

分布式与一致性协议之拜占庭将军问题(一)

拜占庭将军问题 概述 拜占庭将军问题其实是借拜占庭将军故事展现了分布式共识问题&#xff0c;探讨和论证了解决的办法。实际上&#xff0c;拜占庭将军问题是分布式领域最复杂的一个容错模型&#xff0c;一旦搞懂了它&#xff0c;久能掌握分布式共识问题的解决思路&#xff0…