c++数据结构算法复习基础--1

一、大体复习内容

在这里插入图片描述
复习思路;
在这里插入图片描述

二、数据结构算法-常见复杂度汇总介绍-性能对比-图表展示

数据结构:

相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构散列结构树形结构图形结构等等。

数据结构说的是组织数据的一种方式,一种结构。

算法:

求解具体问题的步骤描述,代码上表现出来是解决特定问题的一组有限的指令序列。

它讲究的是有一输入,有一组有限的指令序列去做某一件事情,然后最后一个输出,数据结构是存储数据,组织数据的一种方式结构

算法复杂度:

时间和空间复杂度,衡量算法效率,算法在执行过程中,随着数据规模n的增长,算法执行所花费的时间和空间的增长速度。

复杂度分为两个,一个是时间复杂度,一个是空间复杂度,衡量算法效率的,算法在执行过程中,随着数据规模N的增长执行,算法执行所花费的时间和空间的增长速度,所以杂度并不是,准确的去计算我们这个算法所花费的时间和空间的,这个时间就是算法执行的时间空间就是算法执行过程中所需要占用的额外的内存控件,这里边儿控件指的是内存,也就是说复杂度,并不是准确的去计算这个算法执行过程中花费的时间有多长,所需占用的内存有多大。

常见的时间复杂度:

在这里插入图片描述

在这里插入图片描述

三、线性表-数组-常用操作接口-复杂度分析

在这里插入图片描述

1、数组特点:

内存是连续的

优点

下标访问(随机访问) 时间复杂度是O(1)。
末尾位置增加删除元素时间复杂度是O(1)。
访问元素前后相邻位置的元素非常方便

缺点

非末尾位置增加删除元素需要进行大量的数据移动。
搜索的时间复杂度无序数组-线性搜索O(n)·有序数组-二分搜索O(logn)。
数组扩容消耗比较大扩容

2、内存分布

对于我们C和C++的程序,程序运行以后叫做进程,进程在内存上的布局,它的内存可用内存主要分为三个部分:

数据段(.data   ----  存放全局变量,系统分配,系统释放,其生命周期是整个程序的生命周期
堆(heap   --- C语言里边通过malloc free ,c++边儿通过new跟delete来去自己去开辟,自己去释放的,
栈(stack  --- 随着函数进来分配内存,函数出一括号,内存释放

3、数组代码输出

相关接口:

class Array
{
public://构造Array(int size = 10); //析构~Array();public://末尾增加元素void push_back(int val);//末尾删除元素void pop_back();//按位置增加元素void insert(int pos,int val);//按元素值删除void erase(int val);//元素查询int find(int val);private:int * mpArr;  //指向可扩容的数组内存int mCap_;	  //数组的容量int mCur;	  //数组有效元素的个数
};

代码实现

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;//数组实现
class Array
{
public:Array(int size = 10):mCur(0),mCap(size){mpArr = new int[mCap]();}~Array(){if(mpArr != nullptr)//用处不大,不能保证指针不为空,指针指向的内存是否是有效内存,想要开发者来保证delete []mpArr;mpArr = nullptr;//防止野指针}public://末尾增加元素void push_back(int val){if(mCur == mCap)//数组满了,扩容 -- 在原有的基础上再定义新的内存,这个内存大小是原有内存的两倍,进行数据拷贝,释放原堆内存{expand(2 * mCap);}mpArr[mCur++] = val; }//末尾删除元素void pop_back(){if(mCur == 0){return;}mCur--;}//按位置增加元素void insert(int pos,int val){if(pos < 0 || pos > mCur){return;//throw "pos invalid!"}if(mCur == mCap){expand(2 * mCap);}//移动元素for (int i= mCur;i > pos; i--){mpArr[i] = mpArr[i-1];}mpArr[pos] = val;mCur++;}//按位置删除void erase(int pos){if(pos < 0 || pos > mCur){return;//throw "pos invalid!"}//移动元素for (int i= pos + 1;i < mCur; i++){mpArr[i-1] = mpArr[i];}mCur--;}//按照元素值查询,返回下标int find(int val){for(int i=0; i < mCur; i++){if(mpArr[i] == val){return i;}}return -1;}//打印数据void show()const{for(int i=0; i < mCur; i++){cout << mpArr[i] << " ";}cout << endl;}private://内部数组扩容接口void expand(int size){int* p = new int(size);memcpy(p,mpArr,sizeof(int) * mCap);delete[]mpArr;mpArr = p;mCap = size;}private:int *mpArr;  //指向可扩容的数组内存int mCap;	  //数组的容量int mCur;	  //数组有效元素的个数
};

测试

int main()
{Array arr;srand(time(0));//生成随机数for(int i = 0;i < 10;i++){arr.push_back(rand() % 100);}//测试arr.show();arr.pop_back();arr.show();arr.insert(0,100);arr.show();arr.insert(10,200);arr.show();int pos = arr.find(100);if(pos != -1){arr.erase(pos);arr.show;}
}

运行结果:

在这里插入图片描述
在这里插入图片描述

四、线性表-数组-笔试面试常见问题-基于数组的双指针思想

1、元素逆序问题

#include <iostream>
#include <string.h>
using namespace std;//逆序字符串
void Reverse(char arr[],int size)
{char* p = arr;char* q = arr + size - 1;while (p < q){char ch = *p;*p = *q;*q = ch;p++;q--;}
}int main()
{char arr[] = "kyrie_sakura";Reverse(arr,strlen(arr));cout << arr << endl;
}

运行结果:
在这里插入图片描述

2、奇偶数调整问题:整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string.h>
using namespace std;//奇偶数调整问题:整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边
void AdjustArray(int arr[],int size)
{int* p = arr;int* q = arr + size -1;while(p < q){//p->奇数while(p < q){if((*p & 0x1) == 0){break;}p++;}//q<-偶数while(p < q){if((*q & 0x1) == 1){break;}q--;}//p奇数,q偶数if(p < q){int tmp = *p;*p = *q;*q = tmp;p++;q--;}}
}

代码测试:

int main()
{int arr[10] = {0};srand(time(0));for(int i = 0; i < 10; i++){arr[i] = rand() % 100;}for(int v:arr){cout << v << " ";}cout << endl;AdjustArray(arr,10);for(int v:arr){cout << v << " ";}cout << endl;
}

测试结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

vue基础概念(1)

1. 前言 此项目基于vue2开发 1.1. vue组件 1.2. 文本插值表达式 用于返回data方法中的对象属性 也可以用于数据判断例如{{age >xx ? 老年 &#xff1a;青年}} 1.3. 属性绑定 v-bind :xxx 一般用于input输入框等 1.4. 事件绑定 v-on 1.5. 双向绑定 v-model 表单输入项…

UTONMOS元宇宙游戏发展趋势是什么?

UTONMOS元宇宙游戏的发展趋势包括以下几个方面&#xff1a; 更加真实的体验&#xff1a;随着技术的进步&#xff0c;UTONMOS元宇宙游戏将提供更加逼真的视觉、听觉和触觉体验&#xff0c;让玩家更加身临其境。 社交互动&#xff1a;UTONMOS元宇宙游戏将越来越注重社交互动&am…

记录一次主机不能登录的异常现象解决的问题

故障现象:客户5台云主机不能root登录,提示认证失败。 发现每次都会在/etc/host.deny 文件夹里面出现&#xff56;&#xff50;&#xff4e;的内网地址 经过仔细排查发现&#xff1a; 客户在进行等保整改的时候&#xff0c;修改了&#xff0f;&#xff45;&#xff54;&…

算法竞赛备赛之斜率优化的DP问题

目录 1.任务安排1 2.任务安排2 3.任务安排3 4.运输小猫 在处理下图的最小截距问题上面&#xff0c;我们该如何在维护的凸包中找到战距最小的点&#xff1f; 相当于在一个单调的队列中&#xff0c;找到第一个大于某一个数的点。 斜率单调递增&#xff0c;新加的点的横坐标也…

如何判断一个元素是否在可视区域中?

文章目录 一、用途二、实现方式offsetTop、scrollTopgetBoundingClientRectIntersection Observer创建观察者传入被观察者 三、案例分析参考文献 一、用途 可视区域即我们浏览网页的设备肉眼可见的区域&#xff0c;如下图 在日常开发中&#xff0c;我们经常需要判断目标元素是…

AcWing 860. 染色法判定二分图

本题链接 &#xff1a;活动 - AcWing 题目&#xff1a; 样例&#xff1a; 输入 4 4 1 3 1 4 2 3 2 4 输出 Yes 思路&#xff1a; 根据题目意思&#xff0c;我们明确一下二分图的含义。 二分图是图论中的一个重要概念。一个图被称为二分图&#xff0c;当且仅当能够将其所有顶…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月27日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月27日 星期二 农历正月十八 1、 应急管理部&#xff1a;彻查各类消防隐患&#xff0c;集中治理电动自行车进楼入户。 2、 电动车引发火灾事故频发&#xff0c;强制性国家标准即将出台。 3、 医保局&#xff1a;近年来纳…

vite+vue3图片引入方式不生效解决方案

vitevue3图片引入方式不生效解决方案 引入方式改成 const wordImgnew URL(/src/assets/MicsosoftWord.png,import.meta.url).href;原理

代码随想录Leetcode518. 零钱兑换 II

题目&#xff1a; 代码(首刷看解析&#xff09;&#xff1a; 这里的这个递推公式可以这么理解&#xff1a; 想象二维数组dp[ i ][ j ]其中i表示用前i种硬币&#xff0c;j表示价值总金额。dp[i][j]表示总方法数量。 那么dp[i][j]意义为&#xff1a; 用前i种硬币凑j的价值&…

Programming Abstractions in C阅读笔记:p303-p305

《Programming Abstractions in C》学习第74天&#xff0c;p303-p305总结&#xff0c;总计3页。 一、技术总结 1.时间复杂度分类(complexity classes) ClassNotationExampleconstantO(1)Returning the first element in an arraylogarithmicO(logN)Binary search in a sorte…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目&#xff0c;是基于Java开发的一种CI&#xff08;Continuous integration&#xff0c;持续集成&#xff09; &CD (Continuous Delivery&#xff0c;持续交付)工具&#xff0c;用于监控持续重复的工作&a…

简单聊聊现在的AI

简单聊聊现在的AI 前言主要的AI模型和形式LLM - Large Language Model&#xff08;大语言模型&#xff09;BOT&#xff08;机器人&#xff09;LAM - Large Action Models&#xff08;大行动模型&#xff09;Agent&#xff08;智能体&#xff09; 结尾 前言 好久没回来写博客&a…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 …

web安全学习笔记【17】——信息打点(7)

信息打点-APP资产&知识产权&应用监控&静态提取&动态抓包&动态调试 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

C# 通过共享内存调用C++ 算法

需求&#xff1a; C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到&#xff0c;将c算法封装为dll 插件&#xff0c;c加载后&#xff0c;暴露C风格接口&#xff0c;然后供C#调用。但是这样有几个问题&#xff1a; 1&#xff0c;一是…

【编程语言之·调试输出打印技巧】

系列文章目录 文章目录 前言一、调试打印输出开关1.1宏定义应用 二、打印错误的函数2.1 perror()2.2 strerror() 三、示例总结 前言 一、调试打印输出开关 1.1宏定义应用 示例1&#xff1a; #define DEBUG_ON 0 #if DEBUG_ON #define DEBUG(...) qDebug(__VA_ARGS__) #else …

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

RK3568平台开发系列讲解(Linux系统篇)SPI 客户端通信

🚀返回专栏总目录 文章目录 一、spi_transfer二、spi_message三、初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 SPI I/O模型由一组队列消息组成。我们提交一个或多个struct spi_message结构时,这些结构以同步或异步方式处理完成。单个消息由一个或多个struct sp…

Basisformer时间序列预测 锂电池SOC估计

Basisformer是一种基于Transformer架构的模型&#xff0c;用时间序列预测任务。 【Basisformer】时间序列预测 【锂电池SOC估计】 [1]采用自适应监督自监督对比学习方法学习时序特征 [2]通过双向交叉注意力机制计算历史序列和基准序列之间的相关系数 [3]最后通过相关系数…