复杂度和顺序表(双指针方法)

目录

目录

目录

前言:

一、时间复杂度和空间复杂度

1.1概念

1.2规则

二、顺序表

2.1静态顺序表

2.2动态顺序表

三、双指针法

四、总结


前言:

        时间复杂度和空间复杂度是用于判断算法好坏的指标,程序性能的核心指标。时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。

一、时间复杂度和空间复杂度

1.1概念

        时间复杂度:算法的时间复杂度是⼀个函数式T(N)。T(N)=执行次数,而时间复杂度就是表示执行次数的增长量。而我们复杂度的表⽰通常使⽤⼤O的渐进表⽰法。递归算法时间度=单次递归的时间复杂度*递归次数(这里递归过程中函数创建是没有执行次数的,只有计算过程才会执行,我们算的就是计算次数也就是执行次数。而我们可以用递归次数来等效替换执行次数,因为递归了多少次,那就要算多少次)

        空间复杂度:空间复杂度指的是该算法所需要开辟的空间(这里开辟的空间指的是需要的算法开辟空间,而外部函数不算里面)。

以上是复杂度函数图。 \log _{2}^{}\textrm{n}或者其他在复杂度图中都是以logn或者lg表示。

1.2规则

        1.在T(N)表示式中,T(N)=N^{2}+N+1,时间复杂度只会取最具有影响的参数,这里保留最高阶项,在这里最高是N^{2},所以复杂度为O(N^{2})。

        2.如果最高阶项数不是1,以1来算,因为到后面最高阶项数对最高阶项影响越来越小了。如T(N)=\frac{1}{2}N^{2}+N+1,最终时间复杂度为O(N^{2})。

        3.如果在T(N)表示式中只有常数,T(N)=1000,那么统一时间复杂度为O(1)。注意:这里无论是多少万甚至多少亿,统一时间复杂度都为O(1),这里时间复杂度就是表示增长量,而不是数量多少。

        4.对于不确定的因素统一以最高来算,这里不确定因素主要是不确定T(N)表达式的确定值,可能受到外界变量影响(受元素大小影响,如排序这些),可能T(N)=\frac{1}{2}N^{2}也可能为\frac{_{1}}{4}N^{2},也可能为N^{2},还有可能为N,那就以最高来算也就是时间复杂度为O(N^{2})。

空间复杂度和时间复杂度规则一模一样,因为都是根据一个函数来计算的,函数数据是一样的。

void unc(int n)
{int cnt = 1;while (cnt < n){cnt *= 2;}
}

 这里根据规律得:O(N)=\log _{2}^{}\textrm{n}

二、顺序表

2.1静态顺序表

        顺序表底层原理就是数组,因此物理结构上和逻辑结构上都是线性的。,静态数组是有确定的空间,不能改变空间。

2.2动态顺序表

        而动态顺序表,可以扩容空间,可以根据需求,扩容空间以达到想要的效果。

接下来可以根据我们对于动态顺序表进行初始化:

//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

扩容:

//扩容空间
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size)//扩容条件{int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//防止空间为0,用三目操作符来扩容加判断SLDateType* tmp = realloc(ps->arr, newcapacity * sizeof(SLDateType));//扩容if (tmp == NULL){perror("realloc");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}

尾插:

//尾插
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);//防空//空间不够SLCheckCapacity(ps);//空间够ps->arr[ps->size++] = x;
}

头插:

//头插
void SLPushFront(SL* ps, SLDateType x)
{assert(ps);//空间不够SLCheckCapacity(ps);//空间够for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}

 任意插:

//任意插
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//空间不够SLCheckCapacity(ps);//空间够for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

尾删:

//尾删
void SLPopBack(SL* ps)
{assert(ps);ps->size--;
}

 头删:

//头删
void SLPopFront(SL* ps)
{assert(ps&& ps->size != 0);for (int i = 0; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

任意删:

//任意删
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

三、双指针法

        一般遇到算法题,我们会选择暴力解题,这是最简单的方法,而对于有时间复杂度要求的题目我们也可以使用用空间换时间(创建新数组来换),而有一种方法是既可以将时间复杂度降下来,也不用使用空间换时间。这种方法就是双指针法

用一道题来举例:26. 删除有序数组中的重复项 - 力扣(LeetCode)

int removeDuplicates(int* nums, int numsSize) {int dest = 0; int src = dest + 1;while (src != numsSize){if(nums[dest]!=nums[src]&&++dest != src)//既能++,也能避免重复交换根据&&短路{nums[dest] = nums[src];}src++;}return dest+1;
}

 这个双指针,可以用于需要对比,并且还需要筛选不同的数据。该方法能够用2个变量来降低复杂度。

四、总结

顺序表在这样的结构中,可以便捷地在数组上执行数据的增加、删除、查找以及修改等操作。通过这种连续存储的特性,顺序表能够高效地访问元素,尤其是在已知索引的情况下,可以迅速获取对应位置的数据。

 复杂度是评判算法好坏的指标

双指针法、空间换时间和暴力,双指针的好处,用于数据对比加数据保留,一般用于数组内对比并删除数据常见。

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

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

相关文章

flutter 专题 六十四 在原生项目中集成Flutter

概述 使用Flutter从零开始开发App是一件轻松惬意的事情&#xff0c;但对于一些成熟的产品来说&#xff0c;完全摒弃原有App的历史沉淀&#xff0c;全面转向Flutter是不现实的。因此使用Flutter去统一Android、iOS技术栈&#xff0c;把它作为已有原生App的扩展能力&#xff0c;…

Java高阶程序员学习计划(详细到天,需有一定Java基础)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 Java高阶程序员学习计划(详细到天,需有一定Java基础)第一阶段(30天)Java基础:Java生态工具链:设计模式与编码规范:第二阶段(15天…

JS自动化获取网站信息开发说明

一、自动获取信息的必要性 1. 提高效率与节省时间 批量处理&#xff1a;自动化可以快速抓取大量数据&#xff0c;比人工手动操作快得多。 24/7 运行&#xff1a;自动化工具可以全天候工作&#xff0c;不受时间限制。 减少重复劳动&#xff1a;避免人工反复执行相同的任务&am…

Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南

一、基础配置与概念 1. 什么是 appModule appModule 是 Koin 依赖注入框架中的核心配置模块&#xff0c;用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块&#xff08;org.koin.core.module.Module&#xff09;&#xff0c;通过 DSL 方式声明各种组件的创建方式和依…

学习记录:DAY21

我的开发日志&#xff1a;类路径扫描、DI 容器与动态代理 前言 我失忆了&#xff0c;完全不记得自己早上干了什么。 日程 早上 10 点左右开始&#xff0c;学了一早上&#xff0c;主要是类路径扫描相关的调试。 晚上 8 点了&#xff0c;真不能再摸&#x1f41f;了。 学习记录 计…

【Agent】MCP协议 | 用高德MCP Server制作旅游攻略

note MCP (Model Context Protocol) 代表了 AI 与外部工具和数据交互的标准建立。MCP 的本质&#xff1a;它是一个统一的协议标准&#xff0c;使 AI 模型能够以一致的方式连接各种数据源和工具&#xff0c;类似于 AI 世界的"USB-C"接口。 它能够在 LLM/AI Agent 与外…

使用 Spring Data Redis 实现 Redis 数据存储详解

使用 Spring Data Redis 实现 Redis 数据存储详解 Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块&#xff0c;它封装了 Redis 客户端的底层细节&#xff08;如 Jedis 或 Lettuce&#xff09;&#xff0c;提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现…

Qt5与现代OpenGL学习(四)X轴方向旋转60度

把上面两张图像放到D盘1文件夹内&#xff1a; shader.h #ifndef SHADER_H #define SHADER_H#include <QDebug> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QString>class Shader { public:Shader(const QString& verte…

【Machine Learning Q and AI 读书笔记】- 02 自监督学习

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第2篇&#xff0c;对应原…

using var connection = connectionFactory.CreateConnection(); using var 是什么意思

在 .NET 中&#xff0c;​​垃圾回收&#xff08;Garbage Collection, GC&#xff09;​​ 确实是自动管理内存的机制&#xff0c;但它 ​​仅适用于托管资源&#xff08;Managed Resources&#xff09;​​&#xff08;如类实例、数组等&#xff09;。然而&#xff0c;对于 ​…

Multicore-TSNE

文章目录 TSNE使用scikit-learn库使用Multicore-TSNE库安装方法基本使用方法采用不同的距离度量 其他资料 TSNE t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一种高维数据的降维方法&#xff0c;由Laurens van der Maaten和Geoffrey Hinton于2008年提出&#xff0…

SI5338-EVB Usage Guide(LVPECL、LVDS、HCSL、CMOS、SSTL、HSTL)

目录 1. 简介 1.1 EVB 介绍 1.2 Si5338 Block Diagram 2. EVB 详解 2.1 实物图 2.2 基本配置 2.2.1 Universal Pin 2.2.2 IIC I/F 2.2.3 Input Clocks 2.2.4 Output Frequencies 2.2.5 Output Driver 2.2.6 Freq and Phase Offset 2.2.7 Spread Spectrum 2.2.8 快…

Spring AI应用系列——基于OpenTelemetry实现大模型调用的可观测性实践

一、项目背景与目标 在AI应用日益复杂的今天&#xff0c;大模型服务&#xff08;如语言理解和生成&#xff09;的性能监控和问题排查变得尤为关键。为了实现对大模型调用链路的可观测性&#xff08;Observability&#xff09;管理&#xff0c;我们基于 Spring Boot Spring AI…

Spyglass:官方Hands-on Training(一)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译&#xff08;有删改&#xff09;&#xff0c;Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…

PCB设计工艺规范(三)走线要求

走线要求 1.走线要求2.固定孔、安装孔、过孔要求3.基准点要求4.丝印要求 1.走线要求 印制板距板边距离:V-CUT 边大于 0.75mm&#xff0c;铣槽边大于0.3mm。为了保证 PCB 加工时不出现露铜的缺陷&#xff0c;要求所有的走线及铜箔距离板边:V-CUT边大于 0.75mm&#xff0c;铣槽边…

抓取工具Charles配置教程(mac电脑+ios手机)

mac电脑上的配置 1. 下载最新版本的Charles 2. 按照以下截图进行配置 2.1 端口号配置&#xff1a; 2.2 https配置 3. mac端证书配置 4. IOS手机端网络配置 4.1 先查看电脑上的配置 4.2 配置手机网络 连接和电脑同一个wifi&#xff0c;然后按照以下截图进行配置 5. 手机端证书…

【CSS】精通Flex布局(全)

目录 1. flex布局体验 1.1 传统布局 与 flex布局 1.2 初体验 2. flex布局原理 2.1 布局原理 3. flex布局父项常见属性 3.1 常见父项属性 3.2 属性值 3.3 justify-content 设置主轴上的子元素排列方式 3.4 flex-wrap设置子元素是否换行 3.5 align-items 设置侧轴上的…

力扣第447场周赛

这次终于赶上力扣的周赛了, 赛时成绩如下(依旧还是三题 )&#xff1a; 1. 统计被覆盖的建筑 给你一个正整数 n&#xff0c;表示一个 n x n 的城市&#xff0c;同时给定一个二维数组 buildings&#xff0c;其中 buildings[i] [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。 如…

AI中常用概念的理解

1. RAG&#xff08;检索增强生成&#xff09; 通俗理解&#xff1a;就像你写作业时&#xff0c;先查课本 / 百度找资料&#xff0c;再根据资料写答案&#xff0c;而不是纯靠记忆瞎编。 AI 模型&#xff08;比如 ChatGPT&#xff09;回答问题时&#xff0c;先去 “数据库 / 互联…

SQLServer多版本兼容Java方案和数据采集

Maven引入 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><dependency><groupId>net.sourceforge.jtds</groupId><ar…