数据结构与算法学习(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;}elseCarryBit = 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();elsereturn 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.mzph.cn/web/39303.shtml

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

相关文章

云原生技术架构详解

云原生技术最全详解(图文全面总结) 容器技术 容器技术&#xff1a;是将应用程序、及其所有依赖项&#xff0c;打包到一个独立的、可移植的容器中。 如下图所示: 容器技术的实现&#xff0c;最典型的就是以Docker为代表的。 如下图所示&#xff1a; 主要解决&#xff1a; 1、…

AI常见名词盘点(持续更新)

目录 知识库 知识库的定义 知识库的分类 AI知识库的特点 小结 Embedding 向量化表示 维度降低 语义关系 小结 提示词工程&#xff08;Prompt Engineering&#xff09; 定义 目的与应用 关键性质 工程化思想 应用示例 小结 RAG 检索增强生成 定义与重要性 RA…

Ubuntu设置nacos开机以单机模式自启动

首先&#xff0c;需要安装jdk Ubuntu 安装JDK 创建Systemd服务单元文件 sudo vim /etc/systemd/system/nacos.service按i进入编辑模式&#xff0c;写入下面信息 [Unit] Descriptionnacos server Afternetwork.target[Service] Typeforking Environment"JAVA_HOME/opt/j…

Java8 - Optional 处理可能为空值的容器类

1. 创建一个 Optional 对象 Optional.of、Optional.ofNullable 、Optional.empty是Optional类的三个静态方法&#xff0c;用于创建Optional对象。 1. Optional.of 方法 Optional.of 方法用于创建一个包含非空值的Optional对象&#xff0c;如果传入的值为null&#xff0c;则会…

Kafka集群安装部署

简介 Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的吞吐能力…

用freertos后NVIC里系统时钟部分报错,如何解决?

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

百日筑基第十天-重温Spring

百日筑基第十天-重温Spring Spring AOP 也就是 Aspect-oriented Programming&#xff0c;译为面向切面编程&#xff0c;是计算机科学中的一个设计思想&#xff0c;旨在通过切面技术为业务主体增加额外的通知&#xff08;Advice&#xff09;&#xff0c;从而对声明为**“切点”…

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强&#xff08;Offline Augmentation&#xff09; 2.2.2 在线增强&#xff08;Online Augmentation&#xff09; 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…

Http 实现请求body体和响应body体的双向压缩方案

目录 一、前言 二、方案一(和http header不进行关联) 二、方案二(和http header进行关联) 三、 客户端支持Accept-Encoding压缩方式,服务器就一定会进行压缩吗? 四、参考 一、前言 有时请求和响应的body体比较大,需要进行压缩,以减少传输的带宽。 二、方案一(和…

《信息记录材料》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《信息记录材料》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《信息记录材料》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;全国磁性记录材料信息站 主办单位…

Oracle PL / SQL 函数

FUNCTION是返回值的PL / SQL块或方法&#xff0c;因此它可以在赋值的右侧使用。这里是一个例子&#xff1a; n_value : to_number(123.45); 由于FUNCTION返回一个值&#xff0c;因此也可以在SQL语句中使用它&#xff0c;如下例所示&#xff1a; select to_number(1) from dual;…

社区活动|FlowUs知识库的发展|先进技术的落地应用|下一代生产力工具你用了吗

在当今快速发展的数字化时代&#xff0c;技术的进步不断推动着工作方式和知识管理的革新。FlowUs&#xff0c;作为一款前沿的知识管理和协作平台&#xff0c;正站在这一变革的浪潮之巅&#xff0c;引领着智能工作的新潮流。 智能化的智能学习引导工具 FlowUs不仅仅是一个工具&…

Windows系统常用工具及命令和bat文件介绍

常用的windos工具 命令工具名称描述powershellwindows的shell工具eventvwr事件查看器可以查看系统日志taskmgr任务管理器查看已经运行的进程和性能、应用历史记录、开机启动等信息services.msc服务管理可以查看本地的服务regedt注册表编辑器mstsc远程桌面连接devmgmt.msc设备管…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码&#xff0c;构建数据集。 代码如下&#xff1a; #引入了必要的库和模块&#xff0c;像 mindspore 以及相关的数据处理模块等等。…

Vue2-Vue Router前端路由实现思路

1.路由是什么&#xff1f; Router路由器&#xff1a;数据包转发设备&#xff0c;路由器通过转发数据包&#xff08;数据分组&#xff09;来实现网络互连 Route路由&#xff1a;数据分组从源到目的地时&#xff0c;决定端到端路径的网络范围的进程 | - 网络层 Distribute分发…

无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆

在科技日新月异的今天&#xff0c;我们见证了无数通信技术的飞跃。从开始的电报、电话&#xff0c;到如今的4G、5G网络&#xff0c;再到WiFi的广泛应用&#xff0c;每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组&#xff0c;它以其独特的优势…

jQuery入门案例

以下是一些 jQuery 学习的案例&#xff0c;涵盖了基本的选择器、事件处理、动画效果、AJAX 请求以及插件使用。这些案例可以帮助你更好地理解和掌握 jQuery 的核心功能。 案例1&#xff1a;基本选择器和操作 在这个案例中&#xff0c;我们将使用 jQuery 选择器选择页面中的元…

2024上半年热门网络安全产品和工具TOP10

今年上半年&#xff0c;利用生成式人工智能&#xff08;GenAI&#xff09;的网络安全工具继续激增。许多供应商正在利用GenAI的功能来自动化安全运营中心&#xff08;SOC&#xff09;的工作&#xff0c;特别是在自动化日常活动方面&#xff0c;如收集威胁信息和自动创建查询。 …

爬虫-Python基础

一、Python环境的安装 1. 下载Python 访问Python官网: Welcome to Python.org点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python 2. 安装Python 双击下载好的Python安装包勾选左下角 Add Python 3.7 to PATH 选项&…

动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具

Avalonia是什么&#xff1f; Avalonia是一个跨平台的UI框架&#xff0c;专为.NET开发打造&#xff0c;提供灵活的样式系统&#xff0c;支持Windows、macOS、Linux、iOS、Android及WebAssembly等多种平台。它已成熟并适合生产环境&#xff0c;被Schneider Electric、Unity、Jet…