重学数据结构与算法

news2024/11/13 14:57:06

学习数据结构与算法的目的:
优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度
教程总纲: 暴力解法(模拟)算法优化(递归/二分/排序/DP)时刻转换(数据结构)
在这里插入图片描述

    • 1.时间复杂度的核心方法论
    • 2.增删查——选取数据结构的基本方法
    • 3.线性表——如何完成基本增删查

1.时间复杂度的核心方法论

空间是廉价的,时间是昂贵的

相较于空间复杂度(投入金钱 增加算力),时间复杂度(消耗时间)更为重要!

在这里插入图片描述

降低时间与空间复杂度的方法:

在这里插入图片描述
时刻转换:选用合适的数据结构,进一步降低时间复杂度

例.输入数组 a = [1,2,3,4,5,5,6] 中查找出现次数最多的数值。

暴力解法是:两层for遍历,维护一个最大次数time_max,对每个元素计算出现次数time_tmp,与time_max进行对比,时间复杂度是 0 ( n 2 ) 0(n^2) 0(n2)

int main(){
	vector<int> a={1,2,3,4,5,5,6};
	int val_max=-1,time_max=0,time_tmp=0;
	for(int i=0;i<a.size();i++){
		time_tmp=0;
		for(int j=0;j<a.size();j++)
			if(a[i]==a[j]) time_tmp++;
		if(time_tmp>time_max){
			time_max=time_tmp;
			val_max=a[i];
		}
	}
	cout<<val_max<<" "<<time_max<<endl;
	return 0;
}

在这里插入图片描述

优化思想:如何仅用单层for循环完成,用hash思想,引入k-v字典数据结构map,一次for保存每个元素出现的次数,再求每个元素次数的最大值,时间复杂度是 0 ( 2 n ) 0(2n) 0(2n)

int main(){
	vector<int> a={1,2,3,4,5,5,6};
    map<int ,int> num_cnt;
    int val_max,time_max=0;
	for(int i=0;i<a.size();i++){
		num_cnt[a[i]]++; //counting the number of times a[i occurs in the vector a.
	}
    for(auto it:num_cnt){ //iterating over the map and printing the max time a[i] occurs for each element.  
        if(time_max < it.second){
            val_max=it.first; //assigning the maximum value from the map to val_max.
            time_max=it.second; //assigning the maximum count from the map to time_max.
        }
    }
	cout<<val_max<<" "<<time_max<<endl;
	return 0;
}

2.增删查——选取数据结构的基本方法

当你不知道用什么数据结构的时候:
分析需要对数据进行了哪些操作,根据数据操作,选取合适的数据结构 分析需要对数据进行了哪些操作,根据数据操作,选取合适的数据结构 分析需要对数据进行了哪些操作,根据数据操作,选取合适的数据结构
在这里插入图片描述

还用上面的例子介绍:

对于统计次数最多的元素,我们需要对数据结构进行以下操作:
在这里插入图片描述
具体的:
在这里插入图片描述
所以
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.线性表——如何完成基本增删查

实际上,有线性存储(数组)和链式存储(链表)两种结构,这里仅介绍链式存储。

在这里插入图片描述
单向链表:
在这里插入图片描述
循环链表:
在这里插入图片描述
双向链表:
在这里插入图片描述
双向循环链表:
在这里插入图片描述

线性表增删查:其他链表的操作与单向链表雷同,仅介绍单向链表

增加操作在这里插入图片描述
删除操作
在这里插入图片描述
查找操作:
在这里插入图片描述
在这里插入图片描述
总结:
链表的查找速度慢 ( 无法用 i n d e x ) O ( n ) ,但插入和删除 ( 改变指针 ) 方便 O ( 1 ) 链表的查找速度慢(无法用index)O(n),但插入和删除(改变指针)方便O(1) 链表的查找速度慢(无法用index)O(n),但插入和删除(改变指针)方便O(1)

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

链表的问题常常围绕数据顺序的处理链表反转快慢指针

在这里插入图片描述
为此,我们使用3个指针prev、curr、next,分别指向 新链表头节点、旧链表转换节点、旧链表转换节点的下一个,完成旧链表向链表逐个节点的转换。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,e) for(int i=s;i<e;i++)
#define per(i,s,e) for(int i=s;i>e;i--)

struct node{
    int data=0;
    node* next;
};

int main(){
    node*head=new node,*n1=new node,*n2=new node,*n3=new node;
    head->data=0;
    head->next=n1; n1->data=1; n1->next=n2; n2->data=2; n2->next=n3; n3->data=3;n3->next=NULL;
    node*tmp=head;
    //输出原链表
    while(tmp!=NULL){
        cout<<tmp->data<<" ";
        tmp=tmp->next;
    }cout<<endl;

    node* curr=head,*prev=head,*next=head->next;
    head->next=NULL;
    while(next!=NULL){
        curr=next; next=next->next;
        curr->next=prev; prev=curr;
    }
    //输出逆序链表
    while(curr!=NULL){
        cout<<curr->data<<" ";
        curr=curr->next;
    }
	return 0;
}

/*
0 1 2 3 
3 2 1 0
*/

在这里插入图片描述
在这里插入图片描述
slow走1步,fast走两步。
fast到达终点时,slow到达中点。

在这里插入图片描述
如果有环,2个指针一定会在环内相遇,fast=slow。

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

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

相关文章

MySQL_9 事务机制与隔离机制

目录 一、事务概述 1.定义 : 2.事务和锁 : 二、事务操作 1.MySQL控制台事务的基本操作 : 2.代码演示 : 3.注意事项 : 三、事务的“ACID”特性 : 四、隔离机制 1.介绍 : 2.分类 : 3.常用指令 : 一、事务概述 1.定义 : 事务用于保证数据的一致性&#xff0c;它由一…

python批量实现pdf转换为图片|实现pdf转为jpg/png|实现word批量转pdf|python批量实现word转换为图片

本文介绍了一种使用 Python 脚本来完成这项工作的方法&#xff0c;该脚本基于 PyMuPDF、pdf2image 和 win32com 库实现&#xff0c;可以帮助您快速地将 Word 文档转换为 PDF 文件&#xff0c;并将 PDF 文件转换为 PNG 图片。 一、安装所需的库和软件 在开始使用该脚本之前&am…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(一):概述

AWTK=Toolkit AnyWhere,一款国产免费开源工具,ZLG开发的开源GUI引擎,为嵌入式等系统提供图形界面开发IDE。 随着汽车技术的发展,汽车仪表盘也在快速发展,从最初的机械式到电气式,再到数字化。这次电动化、智能化又一次让汽车仪表出现了飞跃式的发展,再未来,仪表板上可…

04SpringCloud 消息中间件

为什么要使用消息中间件 同步通信&#xff1a;耗时长&#xff0c;受网络波动影响&#xff0c;不能保证高成功率&#xff0c;耦合性高。 同步&#xff0c;异步 并发&#xff1a;一段时间&#xff08;1S&#xff09;多个请求数 并行&#xff1a;时间节点&#xff0c;多个指令…

干接点与湿接点

&#xff08;1&#xff09;干接点的定义 无源开关&#xff1b;具有闭合和断开的2种状态&#xff1b;2个接点之间没有极性&#xff0c;可以互换。 常见的干接点信号有&#xff1a; 1&#xff09;各种开关如&#xff1a;限位开关、行程开关、脚踏开关、旋转开关、温度开关、液…

超越象限:解密 α 碎片的归属问题

文章目录 参考环境α 碎片的归属问题问题概述终边相同角圆心角终边相同角 象限角 描述象限角第一象限角任意象限角 特殊方案问解 叠加坐标系上部下部叠加坐标系 一般方案问解任意角 α分析绘图要领叠加坐标系N-N 参考 项目描述搜索引擎Google 、Bing百度百科首页佟大大还是ETT…

苹果iPhone14如何批量删除联系人?iPhone 14批量删除联系人方法

苹果iPhone 14如何批量删除联系人&#xff1f;手动一个个删实在太麻烦了&#xff01; 苹果iPhone 14手机的通讯录本身不支持批量删除联系人&#xff0c;但是如果通讯录在iCloud中开启过备份&#xff0c;就可以对联系人进行批量操作。 需要注意的是&#xff0c;iPhone 14手机端…

聊聊开源的类ChatGPT工作——ChatGLM

这是”聊聊开源的类ChatGPT工作“的第二篇&#xff0c;写第一篇[7]的时候&#xff0c;当时恰巧MOSS开源&#xff0c;就顺手写了MOSS。但要问目前中文领域的“开源”的语言模型谁更强&#xff0c;公认的还是ChatGLM-6B&#xff08;以下简称ChatGLM&#xff09;。 下面是官方对C…

【20230531】Git命令和Github相关使用

1 在Git中缓存GitHub凭据 根据系统下载对应的GitHub CLI 2.25.1 2. github主页&#xff0c;点击用户头像选择settings->Developer Settings->Personal access tokens申请密钥&#xff08;主要分为Fine-grained tokens和Tokens classic&#xff09;gh需要使用的是Tokens …

Spring Boot如何实现接口文档自动生成

Spring Boot如何实现接口文档自动生成 在开发Web应用程序时&#xff0c;接口文档是非常重要的一环&#xff0c;它可以帮助我们快速了解API的功能和使用方法&#xff0c;同时也是与其他开发人员和团队协作的重要工具。然而&#xff0c;手动编写和维护接口文档是一项繁琐的工作&…

商品上架业务

一.商品上架操作 将检索数据存入es&#xff0c;更改商品上架状态为已上架 二.业务设计 &#xff08;1&#xff09;设计检索数据 分析&#xff1a;商品上架在 es 中是存 sku 还是 spu&#xff1f; 1&#xff09;、检索的时候输入名字&#xff0c;是需要按照 sku 的 title 进行…

给大龄准备转行网络工程师的朋友一些建议

我一直认为&#xff0c;网络工程师是一个看能力而不是看年龄的工作。 大龄转行网络工程师到底有没有机会&#xff1f;很多三十多岁的朋友对于跨行业完全心里没底&#xff0c;冒然转行学习网工又不知道从何学起。今天就给大家整理几个在学习网络工程师的时候需要注意的地方&…

Linux系统下imx6ull QT编程—— C++数据封装与数据抽象(八)

Linux QT编程 文章目录 Linux QT编程前言一、数据封装二、数据抽象 前言 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念&#xff0c;这样能避免受到外界的干扰和误用&#xff0c;从而确保了安全。数据封装引申出了另一个重要的 OOP 概念&#xff0c;即数…

用JavaScript做一个拼图游戏

喜欢的可以复制下面完整代码查看效果在自己本地查看效果 实现难度&#xff1a;不算大&#xff0c;毕竟是小游戏 开发工具&#xff1a;html&#xff0c;css&#xff0c;js&#xff0c;jquery 效果截图 完整代码 <!DOCTYPE html> <html lang"en"> <he…

24届秋招专场·双指针巧解链表套路题

你好&#xff0c;我是安然无虞。 文章目录 合并两个有序链表分隔链表合并K个有序链表链表中倒数最后K个节点变形题: 删除链表的倒数第N个节点链表的中点判断链表是否有环环形链表II相交链表 大家好, 好久不见了, 从今天开始, 后面会经常更新笔试面试真题, 准备今年24届秋招的小…

Centos7安装Kubernetes 1.27.2

目录 一、准备工作 二、容器运行时 三、安装kubelet 、kubeadm、 kubectl 四、配置CNI 五、安装nginx 一、准备工作 1、更新yum源安装 vim、net-tools等工具&#xff08;每个节点都执行&#xff09; yum update -yyum install vim -yyum install net-tools -y 2、配置每…

简单移位器结构介绍

移位器 一位可控移位器 其实是一个复杂的多路开关电路&#xff0c;根据不同控制信号&#xff0c;将输入左移或右移或不变。多位的移位可以简单串联这样的单元实现&#xff0c;但移位位数多时&#xff0c;该方法过于复杂&#xff0c;不实用并且速度很慢。 桶形移位器 由晶体管…

C.12 军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏、可视化高亮展示等,助力工业应用场景快速落地

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

Linux内核漏洞提权

目录 Linux提权辅助工具 内核漏洞本地用户提权 - linux-exploit-suggester测试 内核漏洞Web用户提权 - 利用脏牛dcow 内核漏洞本地用户提权 - 利用DirtyPipe&#xff08;脏管&#xff09; 配置安全SUID提权 Linux提权辅助工具 这些工具都是C\C编写的&#xff0c;需要在目…

vmware虚拟机设置双网卡

文章目录 1. 配置虚拟机NAT模式2. 配置虚拟机桥接网络2.1 通过USB网卡2.1.1 配置虚拟机桥接网卡ip:2.1.2 配置windows主机桥接网卡ip:2.1.3 配置板子ip: 2.2 通过路由器2.2.1 配置板子ip: NAT 网卡&#xff1a;Ubuntu 通过它上网&#xff0c;只要 Windows 能上网&#xff0c;Ub…