数据结构与算法学习(1)

#学习自用#

算法性能分析

时间复杂度O()

时间复杂度就是算法计算的次数。

for(int i=0;i<=n;i++)
{
    ans++;
}
ans++;

这串代码时间复杂度为O(n),实际时间复杂度为O(n+1)。如果把i++改为i+=2,时间复杂度仍然为为O(n),实际时间复杂度变为O(n/2 +1)。时间复杂度比较像极限里面的抓大头,实际时间复杂度就是字面意思很好理解。

常见的时间复杂度:如果是有限次数的都是O(1)、O(log n)、O(n*log n)、O(n)、O(n^2)、O(n^2)。

空间复杂度

处理算法时,额外产生的空间。

cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int j=n-1;j>0;j--){
    for(int i=0;i<n-1;i++){
        if(a[i]>a[i+1]){
            swap(a[i],a[i+1]);
}
}
}

在这个冒泡排序算法中,a[i] 是储存原始数据所需要的数组所以不算在额外空间中,而算法的部分看似没有额外的变量,实际上是需要一个临时变量来存储数据以实现交换的,只需要有限的额外空间,空间复杂度为O(1)。

常见的空间复杂度:O(1)、O(log n)、O(n*log n)

稳定性

通常指的是排序算法的一种特性。在排序算法中,如果两个相等的元素在排序前后的相对位置保持不变,那么这个算法就是稳定的。

高精度计算

用于处理可能会越界的大数。

高精度加法

这里我们需要用到string和整型数组的特性,string作为字符串变量不管怎么输入都不会越界,而整型数组可以用每个元素储存一个数字。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{
	for (int i = 0; i < s.size(); i++)
	{
		a[s.size() - 1 - i] = s[i] - '0';//将数字反转存入数组,目的是将个位对齐。
	}
}
int main()
{
	string s1, s2;
	int a[100] = {}, b[100] = {}, c[100] = {};
	cin >> s1 >> s2;

	StrtoInt(s1, a);
	StrtoInt(s2, b);
	int la = s1.size(), lb = s2.size();
	int lc = max(la, lb) + 1;//计算结果可能的最大位数
	int CarryBit = 0;//设置进位
	for (int i = 0; i < lc; i++)
	{
		c[i] = a[i] + b[i]+CarryBit;
		if (c[i] >= 10)
		{
			c[i] -= 10;
			CarryBit = 1;
		}
		else
			CarryBit = 0;
	}
	while (c[lc - 1] == 0 && lc > 1)
		lc--;
	for (int i = 0; i < lc; i++)
	{
		cout << c[lc - 1 - i];
	}
	cin.get();
}

将字符1赋值给int类型,本质上是把字符1的ASC码值赋值给变量,得到整型的数字就需要把数字字符与字符0相减。将数字反转存放是为了使各个数位上的数字对齐,如果不反转,需要想办法在数位更低的数组,在其数字最高位前面补零,相当麻烦 。while (c[lc - 1] == 0 && lc > 1)是为了去除前置零,即最高位为0时,将输出位数减少。

高精度减法

这里依旧使用string与数组的特性。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{
	for (int i = 0; i < s.size(); i++)
	{
		a[s.size() - 1 - i] = s[i] - '0';//将数字反转存入数组,目的是将个位对齐。
	}
}
bool MyStrcmp(const string& str1,const string& str2)
{
	if (str1.size() != str2.size())//位数不同
		return str1.size() > str2.size();
	else
		return str1 > str2;//位数相同
}
int main()
{
	string A, B;
	int a[100] = {}, b[100] = {}, c[100] = {};
	cin >> A >> B;
	if (MyStrcmp(A, B))
	{
		StrtoInt(A, a);
		StrtoInt(B, b);
	}
	else
	{
		StrtoInt(B, a);
		StrtoInt(A, b);
		cout << '-';
	}//保证更大的数字赋值给数组a
	
	//执行减法
	int lc = max(A.size(), B.size());
	for (int i = 0; i < lc; i++)
	{
		if (a[i] - b[i] >= 0)
			c[i] = a[i] - b[i];
		else
		{
			a[i + 1] -= 1;
			c[i] = 10 + a[i] - b[i];
		}
	}
	//反转输出,去前置零
	while (c[lc - 1] == 0 && lc > 1)
		lc--;
	for (int i = 0; i < lc; i++)
		cout << c[lc - 1 - i];
	cin.get();
}

与加法不同,减法需要考虑从高位退位,以及相减为负数的情况。相减为负数时,负数的值依旧是大数减去小数,而符号我们可以提前输出,如果不这样处理,输出的高位以及输出中间都可能出现负数。

不管是加法还是减法都记得把在数组定义时初始化,否则数组中全是一些随机数,如果被减数与减数位数不同,不将数组初始化,c[i]=a[i]-b[i]运行到随机数出现的地方出错。

高精度乘法

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{
	for (int i = 0; i < s.size(); i++)
	{
		a[s.size() - 1 - i] = s[i] - '0';//将数字反转存入数组,目的是将个位对齐。
	}
}
int main()
{
	string A, B;
	int a[100] = {}, b[100] = {}, c[100] = {};
	cin >> A >> B;
	StrtoInt(A, a);
	StrtoInt(B, b);
	int la = A.size(), lb = B.size(),lc=la+lb;
	for(int j=0;j<lb;j++)
		for (int i = 0; i < la; i++)
		{
			c[i + j] += a[i] * b[j];
		}
	for (int i = 0; i < lc - 1; i++)
	{
		c[i + 1] += (c[i] / 10);
		c[i] %= 10;
	}
	while (c[lc - 1] == 0 && lc > 1)
		lc--;
	for (int i = 0; i < lc; i++)
		cout << c[lc - 1 - i];
	cin.get();
}

高精度乘法的关键是确定相乘后最多有几位,这里通过一个例子来理解,结果位数越多代表结果越大,而要得到最大的乘积,两个乘数也必须是最大的,例如9x9=81,这里乘积的位数是两个乘数位数之和,通过数学归纳法我们可以知道,乘积的位数最多是两个乘数位数之和。

高精度除法

准确来说是高精度除以低精度。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt2(const string& s, int* a)
{
	for (int i = 0; i < s.size(); i++)
	{
		a[i] = s[i] - '0';
	}
}
int main()
{
	string A;
	int B;
	int a[100] = {}, c[100] = {};
	cin >> A;
	cin >> B;
	StrtoInt2(A, a);
	int lc=0;
	int la = A.size();
	int temp = 0;//记录余数
	for (int i = 0; i < la; i++)
	{
		c[i]=a[i] / B;
		temp=(a[i] % B);
		a[i + 1] += temp * 10;
	}
	while (c[lc] == 0 && lc < la)lc++;
	for (int i = lc; i < la; i++)
		cout << c[i];
	cout <<endl<< temp;
}

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

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

相关文章

旅游管理系统16021

摘 要 本文旨在设计和实现一个基于Spring Boot框架的旅游管理系统。该系统通过利用Spring Boot的快速开发特性和丰富的生态系统&#xff0c;提供了一个高效、可靠和灵活的解决方案。系统将实现旅游景点信息的管理、线路规划、跟团游玩、旅游攻略、酒店信息管理、订单管理和用户…

【C语言】inline 关键字

在C语言中&#xff0c;inline关键字用于建议编译器对函数进行内联展开&#xff0c;而不是像普通函数一样调用。内联函数的目的是减少函数调用的开销&#xff0c;特别是对于简单的、频繁调用的函数。 内联函数的定义和使用 定义内联函数 要定义一个内联函数&#xff0c;需要在…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

应用密码学—(扩展)欧几里得、DES、RSA、SHA-1算法

1. 欧几里得算法 1.1 分析算法的实现原理 欧几里德&#xff08;Euclid&#xff09;算法&#xff0c;也既常说的“辗转相除法”&#xff0c;公式为gcd(m, n) { return gcd(n, m%n); }&#xff0c;对于任意两个正整数m、n&#xff0c;每次求的一个数字r m % n&#xff0c;然后把…

sideloadly 苹果自签和sidestore手机续签ipa记录

sideloadly 地址&#xff1a;https://sideloadly.io/#download 直接安装对应系统软件&#xff0c;然后吧ipa 拖到里面续签&#xff0c;缺点每7天需要电脑续签 如果续签保留数据需要对应的位置开启 enable file sharing 勾选 和 bundle id 修改 注意的地方需要电脑和手机appi…

无人机热成像分析图谱原理

一、热成像原理 热成像&#xff0c;也称为红外热成像或红外成像&#xff0c;是一种利用红外辐射&#xff08;通常指的是热辐射&#xff09;来获取物体表面温度分布信息的成像技术。在无人机上集成热成像传感器&#xff0c;可以远程捕获并分析目标物体的热特征&#xff0c;不受…

卸载node,下载nvm,下载node过程步骤及错误记录

网上有很多步骤&#xff0c;先跟着网上的步骤来&#xff1a; 卸载node和下载nvm步骤&#xff1a; window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09;-CSDN博客 使用NVM下载和安装NodeJS教程-CSDN博客 出现的问题&#xff1a; 1.nvm配置sett…

ENVI5.6使用笔记

目录 1. ENVI安装扩展2. ENVI绘制高光谱3D数据立体图3. 对本次工作存档&#xff0c;下次打开软件可直接续档 1. ENVI安装扩展 从ENVI App Store下载商店envi_app_store.zip&#xff0c;解压得到ENVI_App_Store.sav&#xff0c;将其复制到ENVI的扩展文件夹下&#xff08;例如E:…

中国桥梁空间分布数据

2020年中国桥梁空间分布数据&#xff0c;共包含102000余条数据。 数据属性表包括&#xff1a;地级市名、区县名、桥梁名称和经纬度。有shp和EXCEl两种格式数据。目前暂没有广西、广东和台湾三个省份数据。

【js】数组元素拼接、数组元素类型转换

一、数组元素拼接 二、数组元素类型转换 1、字符串数组 转换成 数字型数组 [1, 2, 3].map(Number) // [1,2,3] 2、数字型数组 转换成 字符串数组 [1, 2, 3].map(String) // [1, 2, 3]

干货:js解析url参数的作用、场景、方法和安全策略。

涉及到Web3D开发&#xff0c;Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎&#xff0c;用于创建交互式的3D图形应用程序&#xff0c;但要细论起来&#xff0c;three.js普及度远超Babylon .js. 一、二者的介绍 Three.js&#xff1a; Three.js 是…

GitCode见证:华为云DevUI如何定义下一代前端开发

在当今快速发展的数字时代&#xff0c;前端开发已成为企业数字化转型的关键一环。随着用户对交互体验的期待不断增长&#xff0c;拥有一个强大、灵活且易于使用的前端解决方案变得至关重要。 DevUI的诞生&#xff0c;源于华为对研发工具的深入理解和长期积累&#xff0c;作为一…

【C++】开源:量化金融计算库QuantLib配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

linux模拟aix盘19c单机asm安装补丁

linux模拟盘aix盘vi /etc/rc.d/rc.local/bin/ln /dev/sda /dev/rhdisk2/bin/ln /dev/sdb /dev/rhdisk3 /bin/chown grid:oinstall /dev/rhdisk*chmod 660 /dev/rhdisk* 一、19c安装GI&#xff08;Standalone Oracle Restart&#xff09; su - grid配置环境变量vi .profileex…

红酒与摄影:捕捉酒香与光影的交融

在摄影的世界里&#xff0c;每一个画面都是一段故事&#xff0c;每一束光线都是情感的载体。当红酒遇上摄影&#xff0c;两者之间的交融&#xff0c;仿佛开启了一场关于色彩、光影与情感的视觉盛宴。今天&#xff0c;就让我们一起探索红酒与摄影的奇妙结合&#xff0c;感受雷盛…

为什么我感觉 C 语言在 Linux 下执行效率比 Windows 快得多?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;Windows的终端或者叫控制台…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类&#xff0c;并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言&#xff0c;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他…

聊聊Redis持久化策略RDB

写在文章开头 为避免服务器宕机着情况导致redis内存数据库数据丢失&#xff0c;redis默认出通过rdb保证可靠性&#xff0c;本文将从源码的角度带读者了解rdb读写时机和写入流程。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角&#xff0c;看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

c++边界处理机制

1.vector std::vector&#xff1a;std::vector 是动态数组&#xff0c;它会在运行时动态地调整存储空间大小&#xff0c;因此当访问超出边界时&#xff0c;会触发运行时异常 std::out_of_range。可以通过try-catch块来捕获这种异常来处理越界访问。 #include <iostream>…