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.hqwc.cn/news/492962.html

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

相关文章

Linux编程 1.3 系统文件IO- 内核表示

文件IO内核表示 1、内核中的三种数据结构 1.1文件描述符表 文件描述符标志 文件表项指针1.2 文件表项 文件状态标志 读、写、追加、同步和非阻塞等状态标志 当前文件偏移量 i节点表项指针 引用计数器1.3 节点 文件类型和对该文件的操作函数指针 当前文件长度 文件所有者 文…

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

猫头虎分享已解决Bug || 未找到资源:NotFoundError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

qt debug和release运行都没问题打包之后运行不了

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 问题 qt debug和release运行都没问题打包之后运行不了 原因 环…

编码器转动圈数和单圈脉冲数计算FB(博途SCL代码)

编码器测量相关内容&#xff0c;可以查看专栏相关文章。 1、Smart PLC多圈和单圈脉冲数计算 https://rxxw-control.blog.csdn.net/article/details/131777270https://rxxw-control.blog.csdn.net/article/details/131777270 1、博途PLC 计算FB 待续....

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(九)NodeJS入门——http模块

060_http模块_网页URL之绝对路径 hello&#xff0c;大家好&#xff0c;这一个小题的话我们来补充一个之前学习过的内容&#xff0c;就是网页当中的URL&#xff0c;咱们这个小题的话主要是来说一下绝对路径&#xff0c;有同学可能会说&#xff0c;这这这&#xff0c;不对劲&…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

进程间通信:共享内存与信号灯集(2024/2/26)

作业1&#xff1a;共享内存 shmsnd.c: #include <myhead.h> #define PAGE_SIZE 4096int main(int argc, const char *argv[]) {//一、创建key值key_t key-1;if((keyftok("/",k))-1){perror("ftok error");return -1;}//二、根据key值创建共享内存i…

开源软件的影响力:推动软件行业繁荣与技术创新

开源软件的影响力&#xff1a;推动软件行业繁荣与技术创新 随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&…