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.rhkb.cn/news/264386.html

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

相关文章

SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍 Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口&#xff0c;然后在上面添加注解。不需要拼接URL、参数等操作。项目主页&#xff1a;GitHub - OpenFeign/feign: Feign makes w…

【竹篮打水】OpenCV4.x 中新增并行代码执行演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV支持的并行框架 OpenCV从4.5版本开始&#xff0c;新增了并行代码执行支持&#xff0c;以常见的图像像素遍历卷积计算为…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

hash,以及数据结构——map容器

1.hash是什么&#xff1f; 定义&#xff1a;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入&#xff08;又叫做预映射pre-image&#xff09;通过散列算法变换成固定长度的输出&#xff0c; 该输出就是散列值。这种转换是一种压缩映射&…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

JVM面试

什么是JVM 1.JVM是java虚拟机&#xff0c;是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件 2.为了支持java中的一次编译到处运行的跨平台特性&#xff0c;jvm可以在不同的系统上运行 3.jvm能自动为对象&#xff0c;方法等分配内存&#xff0c;以及自动的…

Day01:Web应用架构搭建站库分离路由访问配置受限DNS解析

目录 常规的Web应用搭建 三种常规网站搭建模式 程序源码 中间件配置 数据库类型 文件访问路径 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件…

如何在Win系统搭建Oracle数据库并实现远程访问【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

nginx高级配置详解

目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…

2024-2-22 作业

作业要求&#xff1a; 复习前面知识点(指针、结构体、函数)整理思维导图顺序表(按位置插入、按位置删除和去重、重新写)理解链表的代码&#xff0c;尝试写一下链表的尾插和输出 1.复习前面知识点(指针、结构体、函数) 2.整理思维导图 3.顺序表(按位置插入、按位置删除和去重、…

供应链大数据:穿越经济迷雾的指南针

随着经济形势的变幻莫测&#xff0c;企业运营面临着前所未有的挑战。在这个充满不确定性的时代&#xff0c;供应链大数据如同一盏明亮的指南针&#xff0c;为企业提供精准的方向指引。下面&#xff0c;我们将深入探讨供应链大数据如何帮助企业洞察市场趋势、优化库存管理、降低…

RabbitMQ开启MQTT协议支持

1&#xff09;RabbitMQ启用MQTT插件 rootmq:/# rabbitmq-plugins enable rabbitmq_mqtt Enabling plugins on node rabbitmq: rabbitmq_mqtt The following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_mqttrabbitmq_web_dispatch Ap…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像&#xff0c;这种情况下编写dockerfile文件不可避免&#xff0c;本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令&#xff1a; env指令用于设置shell的环境变量&am…

WPF真入门教程29--MVVM常用框架之MvvmLight

1、MVVM模式回顾 关于mvvm模式的基础知识&#xff0c;请看这2个文章&#xff1a; WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴&#xff0c;就知道MVVM模式&#xff0c;核心就是数据驱动控件&#xff0c;全栈开…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图&#xff1a; 区别&#xff1a; 1&#xff1a;包目录不同&#xff1a; spring-beans.jar 中 org.springframework.beans.factory.BeanFactory spring-context.jar 中 org.springframework.context.ApplicationContext 2&#xff1a;国际化&#xff1a; BeanFacto…

vue2和vue3对比(语法层面)

阅读文章你将收获&#xff1a; 1 了解不使用组件化工具时&#xff0c;vue在html是如何使用的 2 知道vue2的生命周期函数有哪些 3 知道如何在组件化开发中使用vue 4 大致了解了vue2和vue3在使用上什么不同 最后&#xff1a;vue2和vue3除了下面我列出的有差异化的地方&…

【python】学习笔记03-循环语句

3.1 whlie循环的基础语法 - while循环的语法格式 - while循环的注意事项 条件需提供布尔类型结果&#xff0c;True继续&#xff0c;False停止 空格缩进不能忘 请规划好循环终止条件&#xff0c;否则将无限循环 """ 演示while循环基础练习题&#xff1a;求1-10…

蜂邮EDM-新手教程-新手也能使用

一、登录注册账号&#xff0c;注册登录地址&#xff1a;fengemail.com 二、配置邮箱 选择“账号设置”——“邮箱设置”进行发信邮箱配置。每个账号将默认存在一个“系统默认接口”&#xff0c;点击右侧的编辑按钮即可对该配置进行修改。 注&#xff1a;发信邮箱暂不支持个人…