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;
}

测试结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

x-cmd pkg | g - 功能和交互更为丰富的 `ls` 替代方案

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 g 是一项用 Go 开发的、功能和交互更为丰富的 ls 替代方案。它拥有 100 多个功能选项&#xff0c;主要是通过各式图标、各种布局选项和 git status 集成来增强视觉效果&#xff0c;并且支持多种输出格式&#xff0c;如…

话题——计算机专业必看的几部电影

1. 计算机专业必看的几部电影 《黑客帝国》&#xff08;The Matrix&#xff09;&#xff1a;这部电影讲述了一个虚拟现实世界和现实世界之间的概念&#xff0c;对计算机编程和人工智能有着深刻的思考。它涉及在线/离线、递归、循环、矩阵等概念&#xff0c;挑战了观众对现实的…

TextCNN:文本分类卷积神经网络

模型原理 1、前言2、模型结构3、示例3.1、词向量层3.2、卷积层3.3、最大池化层3.4、Fully Connected层 4、总结 1、前言 TextCNN 来源于《Convolutional Neural Networks for Sentence Classification》发表于2014年&#xff0c;是一个经典的模型&#xff0c;Yoon Kim将卷积神…

功能测试用例,需要详细到什么程度?

这些天招了新人&#xff0c;新项目紧张的测试告一段落&#xff0c;我也开始为功能写用例。 一段时间不写了&#xff0c;写起来有点生疏&#xff0c;但是思路还很清楚。写到一半收到新人写完发过来的用例。 我一看就懵了&#xff0c;哥您这用例根本就是直接拷策划案啊&#xf…

如何交叉编译

1、需要安装对应交叉编译工具链用来在宿主机上编译能在arm开发板上运行的代码 树莓派交叉编译工具链下载地址&#xff1a; https://github.com/raspberrypi/tools下载好后用FileZilla将压缩包传到宿主机&#xff08;不会用自己百度&#xff09; 解压编译工具链 unzip tools-m…

Sovit3D数字孪生平台 助力智慧海上风电场项目加速

我们常说地球是蓝色星球&#xff0c;那是因为海洋约占地球面积的71%。如今&#xff0c;我国正在向“双碳”目标不断奋斗&#xff0c;海上风电也作为一种潜力清洁能源&#xff0c;迸发出前所未有的活力&#xff0c;海上吹来的风成为未来清洁能源新方向。 2024年海上风电项目加速…

市场复盘总结 20240226

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 昨日主题投资 连板进级率 二进三&#xff…

数据安全治理实践路线(中)

数据安全建设阶段主要对数据安全规划进行落地实施&#xff0c;建成与组织相适应的数据安全治理能力&#xff0c;包括组织架构的建设、制度体系的完善、技术工具的建立和人员能力的培养等。通过数据安全规划&#xff0c;组织对如何从零开始建设数据安全治理体系有了一定认知&…

Kuniverse 回归!重温阿圭罗的代表性瞬间,了解这一体验的创作过程!

Kuniverse 活动不仅仅是一次传统的聚会&#xff0c;它是为我们的用户提升 The Sandbox 体验而设计的一种方式&#xff0c;其中包括两个标志性体验&#xff1a;Kuniverse 和“世界冠军”。 Kuniverse 是一款单人游戏&#xff0c;包含与足球和阿圭罗相关的任务。“世界冠军”则更…

第十四章 Linux面试题

第十四章 Linux面试题 日志t.log(访问量)&#xff0c; 将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾 讯) http://192. 168200.10/index1.html http://192. 168.200. 10/index2.html http:/192. 168 200.20/index1 html http://192. 168 200.30/…

171基于matlab的随机共振微弱信号检测

基于matlab的随机共振微弱信号检测&#xff0c;随机共振描述了过阻尼布朗粒子受周期性信号和随机噪声的共同作用下,在非线性双稳态系统中所发生的跃迁现象. 随机共振可用于弱信号的检测。程序已调通&#xff0c;可直接运行。 171 微弱信号检测 随机共振 非线性系统 (xiaohongsh…

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

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

【深度学习笔记】深度学习训练技巧

深度学习训练技巧 1 优化器 随机梯度下降及动量 随机梯度下降算法对每批数据 ( X ( i ) , t ( i ) ) (X^{(i)},t^{(i)}) (X(i),t(i)) 进行优化 g ∇ θ J ( θ ; x ( i ) , t ( i ) ) θ θ − η g g\nabla_\theta J(\theta;x^{(i)},t^{(i)})\\ \theta \theta -\eta g g…

纯国产轻量化数字孪生:智慧城市、智慧工厂、智慧校园、智慧社区。。。

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础&#xff0c;以降本增效为目标&#xff0c;支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

【黑马程序员】STL之vector常用操作

文章目录 vectorvector 基本概念功能vector与普通数组区别vector动态扩展 在这里插入图片描述函数原型代码示例 vector容器的赋值操作函数原型代码示例 vector容量和大小函数原型代码示例 vector插入删除函数原型代码示例 vector容器数据存取函数原型代码示例 swap使用代码示例…

当面试问你接口测试时,不要再说不会了!

很多人会谈论接口测试。到底什么是接口测试&#xff1f;如何进行接口测试&#xff1f;这篇文章会帮到你。 01 前端和后端 在谈论接口测试之前&#xff0c;让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面&#xff0c;它由 HTML 和 CSS 编写…

【Golang数组】

数组 数组的引入内存分析数组遍历数组的初始化方式注意事项二维数组二维数组的遍历 数组的引入 【1】练习引入&#xff1a; package main import "fmt" func main(){//实现的功能&#xff1a;给出五个学生的成绩&#xff0c;求出成绩的总和&#xff0c;平均数&…

邮件系统国产化,U-Mail助推企业数字化建设

在当今数字化时代&#xff0c;企业管理和办公效率的提升已成为企业发展的关键。随着信息技术的迅速发展&#xff0c;邮件系统成为许多企业提高办公效率和管理水平的重要工具。然而&#xff0c;长期以来&#xff0c;国内企业在邮件系统方面主要依赖于国外产品&#xff0c;这不仅…

Another Redis Desktop Manager工具连接集群

背景&#xff1a;使用Another Redis Desktop Manager连接redsi集群 win10安装 使用 下载 某盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1dg9kPm9Av8-bbpDfDg9DsA 提取码&#xff1a;t1sm 使用