Rust 数据结构与算法:1算法分析之乱序字符串检查

news2024/11/26 14:30:07

Rust 数据结构与算法

一、算法分析

算法是通用的旨在解决某种问题的指令列表。

算法分析是基于算法使用的资源量来进行比较的。之所以说一个算法比另一个算法好,原因就在于前者在使用资源方面更有效率,或者说前者使用了更少的资源。

●算法使用的空间指的是内存消耗。算法所需的内存通常由问题本身的规模和性质决定,但有时部分算法会有一些特殊的空间需求。

●算法使用的时间指的是算法执行所有步骤经过的时间,这种评价方式被称为算法执行时间。

1、大 O 分析法

在时间方面,我们使用函数T表示总的执行次数,T(n) = 1 + n,参数n通常被称为问题的规模,T(n)则是解决规模为n的问题所要花费的时间。

在空间方面,我们使用函数S表示总的内存消耗,S(n) = 2,参数n仍然表示问题的规模,但S(n)已经和n无关了。

但大多数时候,我们主要分析时间复杂度,因为空间往往不好优化。

另外,随着摩尔定律的发展,存储越来越便宜,空间越来越大,这时候时间才是最重要的,因为时间无价。

在这里插入图片描述

一些常见的数量级函数

在这里插入图片描述

复杂度曲线

当n很小时,函数彼此间并不能很好地区分,很难判断哪个是主导函数。但随着n变大,关系就比较明确了,一般情况下(n > 10),O(2n) > O(n3) > O(n2) > O(n log n) > O(n) >O(log n) > O(1)。这对于我们设计算法很有帮助,因为对于每个算法,我们都能计算其复杂度。

假设有这样一个算法,已确定操作步骤的数量是T(n) = 6n2 +37n+996。当n很小时,例如1或2,常数996似乎是函数的主要部分。然而,随着n变大,n2这一项变得越来越重要。事实上,当n很大时,其他两项在最终结果中所起的作用已变得不重要。当n变大时,为了近似T(n),我们可以忽略其他项,只关注6n2。系数6也变得不重要。此时,我们说T(n)具有的复杂度数量级为n2或O(n2)。

T(n) = n + 1。当n变大时,常数1对于最终结果将变得越来越不重要。如果我们要找的是T(n)的近似值,则可以删除1,此时运行时间为O(T(n)) = O(n + 1) = O(n)。注意,1对于T(n)肯定是重要的,但是当n变大时,不管有没有n,O(n)都是准确的。比如,对于T(n) = n3 + 1,当n为1时,T(n) = 2,此时舍掉1就不合理,因为这样相当于丢掉一半的运行时间。但是当n等于10时,T(n) = 1001,此时1已经不重要,即便舍掉,T(n)= 1000也仍然是一个很准确的指标。对于S(n)来说,因为其本身就是常数,所以O(S(n)) = O(2) =O(1)。大O分析法只表示数量级,因此虽然实际上是O(2),但其数量级是常量,可用O(1)代替。

2、乱序字符串检查

一个展示不同数量级复杂度的例子是乱序字符串检查。乱序字符串是指一个字符串s1只是另一个字符串s2的重新排列。例如,“heart”和“earth”是乱序字符串,“rust”和“trus”也是乱序字符串。

为简单起见,假设要讨论的两个字符串具有相同的长度,并且只由26个小写字母组成。我们的目标是写一个函数,它接收两个字符串作为参数并返回它们是不是乱序字符串的判断结果。

1、穷举法

解决乱序字符串问题的最笨方法是穷举法,也就是把每种情况都列举出来。当为字符串s1生成所有可能的乱序字符串时,第1个位置有n种可能,第2个位置有n-1种可能,第3个位置有n-3种可能,以此类推,总共有n×(n−1)×(n−2)×…×3×2×1种可能,即n!

2、检查法

乱序字符串问题的第二种解决方案是检测第一个字符串中的字符是否出现在第二个字符串中。如果检测到每个字符都存在,那么这两个字符串一定是乱序的。

代码:

/*
 * @Description:
 * @Author: tianyw
 * @Date: 2024-02-15 10:22:41
 * @LastEditTime: 2024-02-15 10:35:46
 * @LastEditors: tianyw
 */
// 时间复杂度为 O(n²)
fn anagram_solution2(s1: &str, s2: &str) -> bool {
   
    if s1.len() != s2.len() {
   
        return false;
    };
    // 将 s1 和 s2 的字符分别添加到 vec_a 和 vec_b 中
    let mut vec_a = Vec::new();
    let mut vec_b = Vec::new();
    for c in s1.chars() {
   
        vec_a.push(c)
    }
    for c in s2.chars() {
   
    

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

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

相关文章

浅谈业务场景中缓存的使用

业务场景中缓存的使用 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据…

初始JAVA

目录 一、输出HelloWorld 1.1开发步骤 1.2 编写 1.3 编译 1.4 运行 二、 HelloWorld小结 2.1 Java程序的结构与格式 2.2 Java程序的入口 2.3 两种常见的输出语句 2.4 源文件名与类名 三、 注释(comment) 四、 Java API文档 五、 Java核心机制:JVM 5.1…

OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区

🦉 AI新闻 🚀 OpenAI宣布ChatGPT新增记忆功能,可以自由控制内存,提供个性化聊天和长期追踪服务 摘要:ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容,并且可以自由控制其内存。这意味着用户不必…

第三百二十二回

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

随机过程及应用学习笔记(三)几种重要的随机过程

介绍独立过程和独立增量过程。重点介绍两种独立增量过程-—维纳过程和泊松过程。 目录 前言 一、独立过程和独立增量过程 1、独立过程(Independent Process) 2、独立增量过程(Independent Increment Process) 二、正态过程&am…

202324读书笔记|《谢谢你一直陪着我》——谈一场健康的恋爱,玩玩闹闹,一起到老

202324读书笔记|《谢谢你一直陪着我》——谈一场健康的恋爱,玩玩闹闹,一起到老 《谢谢你一直陪着我》作者肥肥鲨,这是一本恋爱小绘本,肥肥鲨和粉粉鲨的相处小片段,轻松读物值得一读。 情人节夜晚熬夜看完的小漫画&am…

边缘计算第二版施巍松——第8章边缘计算系统实例

8.1边缘计算系统概述 1.Cloudlet 架构:移动设备-Cloudlet-云 cloudlet也可以像云一样为用户提供服务,Cloudlet离移动设备只有一跳的距离,具有物理距离的临近性,可以保证实时反馈时延低,又可以利用局域网的高带宽优势&…

《Java 简易速速上手小册》第6章:Java 并发编程(2024 最新版)

文章目录 6.1 线程的创建和管理 - 召唤你的士兵6.1.1 基础知识6.1.2 重点案例:实现一个简单的计数器6.1.3 拓展案例 1:定时器线程6.1.4 拓展案例 2:使用 Executor 框架管理线程 6.2 同步机制 - 维持军队的秩序6.2.1 基础知识6.2.2 重点案例&a…

如何合理规划 PostgreSQL 的数据库用户

PostgreSQL 作为世界上最领先的开源数据库,有一套强大的用户角色权限系统,和 MySQL 做一个对比: 但硬币的另一面则是对于简单场景来说增加了复杂度。在许多单应用场景,其实也不需要额外的 schema 层,也不需要额外的 ow…

MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花,相册,爱心啥的都快画够了,今年画个花瓣韦恩图? 花瓣上的数字是仅属于该类的样本数,而中心的数字是属于每一类的样本数 教程部分 0 数据准备 % 给组起名t1 t2 t3...t15 setName compose(t%d,…

(五)【Jmeter】使用代理录制HTTP脚本操作步骤及注意事项

前置信息 软件版本Jmeter5.6.3 服务网址备注drupalhttp://192.168.88.88:18080/(二)【Jmeter】专栏实战项目靶场drupal部署 用户名密码test1test1test2test2 实操记录 1、启动jmeter,操作顺序见下图 2、在视图面板添加如下信息&#x…

【复现】某某ERP 信息泄露漏洞_49

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 该ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存财务生产功能。…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

优思学院|工业4.0:世界上首个工业机器人诞生于50年前

五十年前,德国机床制造商库卡(KUKA)推出了FAMULUS工业机器人,这不仅是现代工业机器人发展史上的一个重要里程碑,也为后来的技术革新铺平了道路。1973年,世界见证了一种拥有六轴的多关节臂动力学设计的机器人…

『运维备忘录』之 Lsof 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

【王道数据结构】【chapter5树与二叉树】【P158t11】

在二叉树中查找值为x的结点&#xff0c;试编写算法&#xff08;用c语言&#xff09;打印值为x的节点的所有祖先&#xff0c;假设值为x的结点不多于1个 #include <iostream> #include <stack> #include<queue> typedef struct treenode{char data;struct tree…

arkTS开发鸿蒙OS个人商城案例【2024最新 新年限定开发案例QAQ】

龙年前述 源码获取>文章下方二维码&#xff0c;回复关键字“鸿蒙OS商场源码” 前言 arkTS是华为自己研发的一套前端语言&#xff0c;是在js和ts技术的基础上又进行了升级而成&#xff01; 本篇文章会带领大家通过arkTSnode.jsmongoDB来完成一个鸿蒙OS版本的商城案例&…

bpmn-js 事件总线处理

bpmn-js中使用EventBus作为事件的处理句柄&#xff0c;EventBus的使用和我们常规使用的事件总线没啥大的区别&#xff0c;其源码位于&#xff1a;/diagram-js/lib/core/EventBus.js &#xff08;bpmn-js使用diagram-js实现流程图的web端绘制呈现工具&#xff09;。 EventBus使用…

ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

ubuntu22.04laptop OpenCV Get Started: 008_image_filtering_using_convolution 1. 源由2. convolution应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 identity矩阵3.2 all ones 5x5矩阵3.3 blur 5x5矩阵3.4 GaussianBlur 5x5矩阵3.5 medianBlur 5x5矩阵3.6 Sharpe…

「数据结构」MapSet

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; Map&Set &#x1f349;概念&#x1f349;模型&#x1f349;Map&#x1f34c;TreeMap和HashMap的区别&#x1f34c;Map常用方…