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

C++查缺补漏《4》_时间复杂度、空间配置器和内存池、排序总结、右值引用和移动语义、函数出参和入参、类中的deafult和delete

0、前言:

  • 1、这部分用add标识的是补充知识,用stl标识的是stl部分知识,用ds标识的是数据结构方面的知识;
  • 2、这篇笔记是对知识点的记录,部分知识点的记录可能不完整,后序根据学习情况,加以补充;
  • 3、有些知识可能会和前面重复,但是重复的总结,不就是为了深刻的记忆吗?

1、add_时间复杂度:

1.1、概述:给程序n个输入,分析最坏情况下,程序执行次数的量级;

  • 在 C++ 中,时间复杂度是 衡量算法执行效率的核心指标 ,它描述的是算法运行时间随输入规模增长的变化趋势,而非具体执行时间(具体时间受硬件、编译器等影响)。
  • 时间复杂度用大 O 符号(O) 表示,关注的是最坏情况下的增长趋势,忽略常数项和低阶项。

1.2、时间复杂度的类型:

  • O (1):常数时间:给n个输入,执行步骤固定。
int getFirstElement(vector<int>& arr) {return arr[0]; // 直接访问,1步完成
}
  • O (log n):对数时间:给n个输入,执行log n次后结束。
    特点:每轮操作后,问题规模缩小一半(如二分法)。
    案例:

    示例分析:二分查找
    1、初始范围:n个元素。
    2、每次迭代:范围减半,剩余 n/2,n/4,…,1。
    3、迭代次数:log 以2为底n的对数次后范围为 1。
    4、结论:时间复杂度为 O(logn)。

  • O (n):线性时间
    例如:遍历输入,输入n个,遍历完成需要执行n次;

  • O (n log n):线性对数时间
    例如:常见于高效排序算法当中
    特点:将问题分解为n个规模的logn的子问题

  • O (n²):平方时间
    特点:执行步骤与 n 的平方成正比;
    案例:常见于循环嵌套中;

  • 更高复杂度(O (n³)、O (2ⁿ) 等)
    O (n³):三层嵌套循环(如矩阵乘法)。
    O (2ⁿ):指数级,如未优化的斐波那契递归:

1.3、如何分析时间复杂度:

1、数循环次数:嵌套循环取乘积(如两层循环→O (n×m),若 n=m 则为 O (n²))。
2、忽略常数操作:如变量声明、单次判断等不随 n 增长的步骤。
3、关注最坏情况:例如线性查找,最好情况是 O (1)(第一个元素命中),但时间复杂度按最坏情况 O (n) 算。

1.4、空间复杂度

  • 理解了时间复杂度,空间复杂度就是顺带提一嘴的事
  • 概述:算法运行时需要额外占用多少存储空间。
  • 表示方式和时间复杂度一致。

2、STL_空间配置器和内存池:

2.1、空间配置器概述:空间配置器是STL六大组件中的最后一个,负责对容器需要的内存空间进行管理。

  • 每种容器都可以有一个空间配置器的参数,一般都是模板参数中的最后一个参数,它是可缺省的,所以通常不传,直接默认使用STL中提供的allocator 类作为空间配置器。

2.2、内存池概述:在 C++ STL 中,内存池(Memory Pool)是一种高效的内存管理技术

  • 内存池主要用于优化小型对象(如vector的元素、list的节点等)的频繁分配与释放。
  • STL中为什么设计内存池这种思想:在STL容器申请释放空间时存在一个问题——结点型数据结构会频繁申请/释放小块内存空间。而直接去内存中申请不但慢,而且会导致内存碎片,降低内存的使用效率,所以它会采用内存池对小块内存的申请/释放进行管理。方法是直接重载new 和delete 运算符。
  • 内存池管理办法:STL在管理内存池时,会用到一张哈希表。这张哈希表中存在以8为倍数的桶,每个桶都会存放对应桶大小的空间。例如,8桶中存放的就是8字节的内存空间,32桶中存放的就是32字节的内存空间等。以STL 为例,它会以128 字节为分界线,超过SGI128 字节的空间视为大块内存,直接去内存中申请,而小于等于128字节的空间视为小块内存,由内存池管理。管理时,会对内存池进行切分,例如某个结点需要空间,则直接从内存池中切分出若干结点大小的空间(这么做的目的是做了预判,即可能之后还需要更多的同类型空间),挂到对应桶中,以供结点使用,如果结点被释放,则释放的空间也会归还到对应桶中,以便重复利用。
  • STL中将直接从内存中申请/释放空间的空间配置器称为一级空间配置器,而将管理内存池的空间配置器称为二级空间配置器。

3、ds_排序总结:

  • ★★★所有排序无外乎先依据 排序原理 从简单的3到4个序列元素想明白,然后再总结一般规律,写出代码;

3.1、冒泡排序:

  • 排序原理:
    在这里插入图片描述

  • 代码:

void mao_pao(vector<int>& a)
{int n = a.size();int i, j, temp;for (i = 0; i < n; i++){for (j = 0; j < n - i - 1; j++){if (a[j] > a[j + 1]){temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}
}
  • 时间复杂度分析:O(n²)
    外层循环‌:执行n次(i=0到i=n-1)
    ‌内层循环‌:第i次时执行n-1-i次比较
    【(n-1) + (n-2) + … + 1 = n(n-1)/2 ≈ O(n²)】
  • 优缺点分析:
    • 优点:简单直观、在原空间排序;
    • 缺点:时间复杂度高;

3.2、选择排序:

  • 排序原理:
    在这里插入图片描述

  • 代码:

void xuan_ze(vector<int>& a)
{int i, j,mx=0;for (i = 0; i < a.size()-1; i++){mx = 0;for (j = 1; j < a.size()-i; j++){if (a[j] > a[mx]){mx = j;}}swap(a[mx], a[a.size() - i-1]);}
}
  • 时间复杂度分析:O(n²)
    外层循环执行n-1次(i=0到i=n-2)
    内层循环第i次执行n-1-i次比较
    【(n-1) + (n-2) + … + 1 = n(n-1)/2 ≈ O(n²) 】
  • 优缺点分析:
    • 优点:简单直观,不用额外空间;
    • 缺点:时间复杂度高

3.3、插入排序:

  • 排序原理:
    在这里插入图片描述

  • 代码:

void cha_ru(vector<int>& a)
{int p1 = 0;	// 有序序列结束值下标int p2 = 1; // 无序序列比较值的下标int i,j;for (i = p2; i < a.size(); i++){for (j=p1;j>=0;j--){if (a[j] > a[p2]){swap(a[p2], a[j]);p2 = j;}}++p1;p2 = i + 1;}
}
  • 时间复杂度分析: O(n²)
    最坏情况‌(逆序数组):
    每次插入都要比较所有已排序元素
    第k次插入需比较k次
    总比较次数 = 1+2+…+(n-1) = n(n-1)/2 → O(n²)
  • 优缺点分析:
    • 优点:简单直观,不用额外空间;
    • 缺点:时间复杂度高

3.4、堆排序:

  • 排序原理:
    在这里插入图片描述

  • 代码:

// 堆排序【以大顶堆为例】
// 堆化:只能保证所有根都大于左右子树,要让最大值到栈顶,还得从叶子结点开始
void do_heap(vector<int>& arr, int n)
{// 双根结点if (2 * n + 1 < arr.size() && 2 * n + 2 < arr.size()){
http://www.dtcms.com/a/431587.html

相关文章:

  • wordpress 仿百度谷歌排名优化
  • 跟我学C++中级篇—non-transient异常
  • NSIS下载安装使用教程(附安装包,非常详细)
  • 怎样下载网站模板济南seo优化外包服务公司
  • 申请手机网站网站怎么做图片动态图片不显示
  • 【导航】沁恒微 RISC-V 蓝牙 入门教程目录 【快速跳转】
  • DoFoto AI 1.270.80 | 支持AI抠图、AI消除、AI照片转漫画等功能,比美图秀秀更好用
  • dt9205a数字万用表使用说明
  • 信息系统项目的质量管理(AI地铁车辆管理)
  • 爱站seo查询做外贸网站需要什么卡
  • C语言-深度剖析数据在内存中的存储
  • AI时代,我们仍然需要真实的人吗?
  • jsp网站开发实例标题栏ck播放器整合WordPress
  • 网站设计色彩搭配做网站要求高吗
  • 一级造价工程师报考条件及科目四川seo策略
  • 网站主题类型百度统计平台
  • 青岛知名网站建设哪家好成都网站建设成都网络公司
  • wordpress生成网站模版百度app官方下载
  • 基于Napcat+Koshi的QQ群AI大模型机器人部署-幽络源
  • c2c电子商务网站的功能wordpress滑动注册
  • 网站建设意向表物联网平台软件
  • 科凡网站建设怎么样南昌网络营销公司
  • 南宁市住房和城乡建设局网站软件商城下载
  • 正能量网站入口免费安全小程序商店代码
  • 玉溪网站制作公司3g下订单的网站怎么做
  • 电子商务网站怎么做推广湘潭网站建设 磐石网络最好
  • 数据治理8-数据治理成熟度与管理
  • 14.模板进阶
  • python中and和or,和c语言中和||不一样,需注意。
  • FliFlik KlearMax支持图像变清晰、老照片修复、黑白照上色、漫画上色等功能