103.【C语言】数据结构之建堆的时间复杂度分析

1.向下调整的时间复杂度

推导

设树高为h

39e01bdbb5cc491caf615aa7cf366d3d.png

发现如下规律

按最坏的情况考虑(即调整次数最多)

第1层,有eq?2%5E0个节点,最多向上调整h-1次

第2层,有eq?2%5E1个节点,最多向上调整h-2次

第3层,有eq?2%5E2个节点,最多向上调整h-3次

第4层,有eq?2%5E3个节点,最多向上调整h-4次

...

第h-1层,有eq?2%5E%7Bh-2%7D个节点,最多向上调整1次

第h层,有eq?2%5E%7Bh-1%7D个节点,最多向上调整0次

设T(N)为向下调整的总次数(每层节点数*这一层最坏向下调整多少次)

则有eq?T%28N%29%3D2%5E0*%28h-1%29+2%5E1*%28h-2%29+2%5E2*%28h-3%29+...+2%5E%7Bh-2%7D*1

对于T(N)的求和显然为等差*等比数列的求和,有两种做法:

等差*等比数列的求和

1.错位相减

eq?T%28N%29%3D2%5E0*%28h-1%29+2%5E1*%28h-2%29+2%5E2*%28h-3%29+...+2%5E%7Bh-2%7D*1

eq?2*T%28N%29%3D0+2%5E1*%28h-1%29+2%5E2*%28h-2%29+2%5E3*%28h-3%29+...+2%5E%7Bh-1%7D*1+0

所以eq?T%28N%29%3D2%5Eh-h-1

2.公式法

等差*等比数列的求和公式eq?S_n%3D%28An+B%29*q%5En-B,计算eq?S_1eq?S_2的值后再代入eq?S_n中即可求出eq?Aeq?B

eq?S_1%3D2%5E0*%28h-1%29,eq?S_2%3D2%5E0%28h-1%29+2%5E1*%28h-2%29

因此有

eq?%28A*1+B%29*2%5E1-B%3D2%5E0*%28h-1%29

eq?%28A*2+B%29*2%5E2-B%3D2%5E0*%28h-1%29+2%5E1*%28h-2%29

两式子联立可得eq?A%3D-2%5E%7Bh-1%7D%2CB%3D-2%5Eh,eq?S_n的n为h-1

所以eq?T%28N%29%3D2%5Eh-h-1

又因为eq?N%3D2%5Eh-1,因此eq?h%5Capprox%20%5Clog_2%20%28N+1%29

最终结果

所以eq?T%28N%29%3DN-%5Clog_2%20%28N+1%29%20%5Capprox%20N

2.向上调整的时间复杂度

推导

设树高为h

39e01bdbb5cc491caf615aa7cf366d3d.png

发现如下规律

按最坏的情况考虑(即调整次数最多)

第1层,有eq?2%5E0个节点,最多向上调整1次

第2层,有eq?2%5E1个节点,最多向上调整2次

第3层,有eq?2%5E2个节点,最多向上调整3次

第4层,有eq?2%5E3个节点,最多向上调整4次

...

第h-1层,有eq?2%5E%7Bh-2%7D个节点,最多向上调整h-1次

第h层,有eq?2%5E%7Bh-1%7D个节点,最多向上调整h次

设T(N)为向上调整的总次数(每层节点数*这一层最坏向上调整多少次)

则有eq?T%28N%29%3D2%5E0*1+2%5E1*2+2%5E2*3+...+2%5E%7Bh-1%7D*%28h-1%29+2%5Eh*h

计算后有eq?T%28N%29%3D%28h-1%29*2%5E%7Bh+1%7D+2

又因为eq?N%3D2%5Eh-1,因此eq?h%5Capprox%20%5Clog_2%20%28N+1%29%5Capprox%20%5Clog_2%20N

最终结果

所以eq?T%28N%29%3D%28%5Clog_2%20%28N+1%29-1%29%28N+1%29*2+2%20%5Capprox%20N*%5Clog_2%20N

3.对比

时间复杂度对比

结论:向上调整的时间复杂度为eq?O%28N*%5Clog%20_2%20N%29,向下调整的时间复杂度为eq?O%28N%29

对比:向上调整:节点个数多,调整次数多;向上调整:节点个数少,调整次数多;

图像对比

cdb28fa4184447e0bb10c63d666b09b9.png

3cd032ce190a4322a838cf9de8b9c172.png 

显然随着x越来越大,eq?xeq?x*%5Clog_2%20x的差距会越来越大

4.练习题

题目

求102.【C语言】数据结构之用堆对数组排序文章的HeapSort函数的while循环部分的时间复杂度

7cf7de489f934b16a3598f174753ea9f.png

 

分析

错误思路:因为while循环中有AdjustDown,所以为向下调整,时间复杂度为eq?O%28N%29

没有分析代码的执行过程导致出错

看二叉树的最后一层:有eq?2%5E%7Bh-1%7D个节点,每一个节点调整最多h次,因此属于eq?2%5E%7Bh-1%7D*h的求和计算,所以时间复杂度为eq?O%28N*%5Clog%20_2%20N%29

5.总结

用堆对数组进行排序,排升序建大堆的时间复杂度总为eq?O%28N*%5Clog%20_2%20N%29

对比

void HeapSort(int* arr, int n)
{//向上调整建堆时间复杂度为O(N*logN)for (int i = 1; i < n; i++){AdjustUp(arr, i);}//排序的时间复杂度为O(N*logN)int end = n - 1;while (end > 0){Swap(&arr[end], &arr[0]);AdjustDown(arr, end, 0);end--;}
}

void HeapSort(int* arr, int n)
{//向下调整建堆时间复杂度为O(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(&arr[end], &arr[0]);AdjustDown(arr, end, 0);end--;}
}

 注意(n-1-1)/2这里把(n-1)视作整体

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数&#xff1a; lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数&#xff1a; lambda 1&#xff09;语法&#xff1a; lambda arg1, arg2, …, argN : expression using arg 2&#xff09; lambda是一个表达式&#xff0c;而不是一个语…

【JavaEE初阶 — 网络编程】TCP流套接字编程

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

idea新建springboot web项目

idea新建springboot web项目 写在前面开始项目结构定义依赖初始化创建完成修复配置文件内容乱码修改配置文件名称更新配置文件内容为yml格式 配置项目启动项启动项目 写在前面 以下操作以IntelliJ IDEA 2022.3.3版本为例&#xff0c;其他版本应该大体相似。 开始 项目结构定义…

Docker 容器网络创建网桥链接

一、网络:默认情况下,所有的容器都以bridge方式链接到docker的一个虚拟网桥上; 注意:“172.17.0.0/16”中的“/16”表示子网掩码的长度为16位,它表示子网掩码中有16个连续的1,后面跟着16个连续的0。用于区分IP地址中的网络部分和主机部分; 二、为何自定义网络? 加入自…

智能产品综合开发 - 温湿度检测

1 实训选题目的 本次实训选择的题目是“温湿度检测系统”&#xff0c;旨在提升我们对日常生活中实际应用场景的观察力、问题描述能力、分析力和产品设计能力。通过本项目&#xff0c;我们将能够将所学的人工智能专业知识进行综合应用&#xff0c;包括但不限于Linux操作系统、Py…

人工智能如何改变你的生活?

在我们所处的这个快节奏的世界里&#xff0c;科技融入日常生活已然成为司空见惯的事&#xff0c;并且切实成为了我们生活的一部分。在这场科技变革中&#xff0c;最具变革性的角色之一便是人工智能&#xff08;AI&#xff09;。从我们清晨醒来直至夜晚入睡&#xff0c;人工智能…

vue3 ajax获取json数组排序举例

使用axios获取接口数据 可以在代码中安装axios包&#xff0c;并写入到package.json文件&#xff1a; npm install axios -S接口调用代码举例如下&#xff1a; const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…

Vue前端开发-动态插槽

不仅父组件可以通过插槽方式访问并控制子组件传入的数据&#xff0c;而且可以控制传入父组件时插槽的名称&#xff0c;从而使不同的插槽根据名称的不同&#xff0c;使用场景也不同&#xff0c;例如在一个小区详细页中&#xff0c;可以根据小区类型&#xff0c;调用不同名称的详…

SqlServer强制转换函数TRY_CONVERT和TRY_CAST

SqlServer强制转换函数TRY_CONVERT和TRY_CAST的介绍和案例分享 1、本节内容 CAST 和 CONVERT TRY_CAST TRY_CONVERT 适用于&#xff1a; SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Micro…

PaddleOCR:一款高性能的OCR工具介绍

一、引言 随着人工智能技术的不断发展&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在各行各业得到了广泛应用。OCR技术能够将图片、扫描件等非结构化数据中的文字信息提取出来&#xff0c;转换为可编辑的文本格式。在我国&#xff0c;百度开源了一款优秀的OCR工具…

如果在docker 容器中安装ros遇到的问题

1.在容器内部无法修改时间&#xff0c;需要在宿主机外边修改时钟。修改时钟&#xff1a; hwclock --systohc或者执行 date -s "2024-11-24 19:25:10"2.容器内部内置有opencv4.5版本&#xff0c;需要卸载&#xff0c;重新安装4.2.0版本。记录折腾好久的卸载过程。 …

LLM*:路径规划的大型语言模型增强增量启发式搜索

路径规划是机器人技术和自主导航中的一个基本科学问题&#xff0c;需要从起点到目的地推导出有效的路线&#xff0c;同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性&#xff0c;但随着状态空间的增长&#xff0c;计算和内存效率会严重降低。相反&#xff0c;大型语言…

ACL的原理与配置

ACL技术概述 ACL&#xff1b;访问控制列表 技术背景&#xff1a; 园区重要服务器资源被随意访问&#xff0c;容易泄露机密&#xff0c;造成安全隐患 病毒侵入内网&#xff0c;安全性降低 网络宽带被各类业务随意挤占&#xff0c;服务质量要求高的宽带得不到保障&#xff0…

【配置】pycharm运行的项目如何修改名称(项目名称、模块名称)

当我们需要修改项目名称、模块名称的时候&#xff0c;能够在网上找一些修改的方法&#xff0c;但是有没有很保守但很使用的方法可以解决这个问题呢&#xff1f; 创建项目 通过pycharm创建一个django的项目 创建之后的项目目录&#xff1a; 更改项目名称&#xff1a; 往往以…

【新人系列】Python 入门(十四):文件操作

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`

目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…

IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“

参考文章&#xff1a;https://blog.csdn.net/yueeryuanyi/article/details/14211090 问题&#xff1a;IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“编译都没问题 解决思路 – >【清除缓存】 1. 强制刷新Maven缓存 选择 Maven 标签&#xff0c;Exe…

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…

分布式搜索引擎之elasticsearch单机部署与测试

分布式搜索引擎之elasticsearch单机部署与测试 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的…