当前位置: 首页 > news >正文

STL之算法概览

目录

算法概览

算法分析与复杂度标识O()

STL算法总览

质变算法mutating algorithms----会改变操作对象之值

非质变算法nonmutating algorithms----不改变操作对象之值

STL算法的一般形式

算法的泛化过程


算法概览

        算法,问题之解法也。

        以有限的步骤,解决逻辑或数学上的问题,这一专门科目我们称为算法(Algorithms)。大学信息相关教育里面,与编程最有关直接关系的科目,首推算法与数据结构(Data Structures,亦即STL中的容器)。STL算法即是将最被运用的算法规范出来,其涵盖区间有可能在每五年一次的c++标准委员会中不断增订。

        广义而言,我们所写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都用来解决或大或小的逻辑问题或数学问题。唯有用来解决特定问题(例如排序,查找,最短路径,三点共线。。。),并且获得数学上的效能分析与证明,这样的算法才具有可复用性。本章讨论的便是被收录于STL之中,极具复用价值的70余个STL算法,包括赫赫有名的排序(sorting),查找(searching),排列组合(permutation)算法,以及用于数据移动,复制,删除,比较,组合,运算等算法。

        特定的算法往往搭配特定的数据结构。例如binary search tree(二叉查找树)和RB-tree(红黑树)便是为了解决查找问题而发展出来的特殊数据结构,hashtable拥有快速查找的能力。又例如max-heap(或min-heap)可以协助完成所谓的heap sort(堆排序)。几乎可以说,特定的数据结构是为了实现某种特定的算法。这一类"与特定数据结构相关"的算法,被本书(及STL)归类为“关联式容器”(associated containers)之列。本章所讨论的,是可施行于“无太多特殊条件限制”之空间中的某一段元素区间的算法。

算法分析与复杂度标识O()

        当我们发现(发明)一个可以解决问题的算法时,下一个重要步骤就是决定该算法所耗用的资源,包括空间和时间。这个操作称为算法分析(algorithm analysis)。可以这么说,如果一个算法得耗用数GB的内存空间才能获得令人满意的效率,这种算法没有用--至少在目前的计算机架构下没有使用价值。

        一般而言,算法的执行时间和其所要处理的数据量有关,两者之间存在某种函数关系,可能是一次(线性linear),二次(quadratic),三次(cubic)或对数(logarithm)关系。当数据量小时,多项式函数中的每一项都可能对结果带来相当程度的影响,但是当数据量够大(这是我们应该关注的情况)时,只有最高次方的项目才具主导地位。

        下面是三个复杂度各异的问题

  • 1.最小元素问题:求取array中的最小元素
  • 2.最短距离问题:求取X-Y平面上N个点中,距离最近的两个点
  • 3.三点共线问题:决定X-Y平面上的N个点,是否有任何三点共线。

        最小元素问题的解法一定必须两两元素比对,逐一进行。N个元素需要N次比对,所以数据量和执行时间呈线性关系。“最短距离”问题所需计算的元素对(pairs)共有N(N-1)/2!,所以大数量和执行时间呈二次关系。“三点共线”问题要计算的元素对共有N(N-1)(N-2)/3!,所以大数据量和执行时间呈三次关系。

        上述三种复杂度,以所谓BIG-Oh标记法表示为O(N),O(N^2),O(N^3).这种标记法的定义如下:

        如果有任何正值常数c和N_0,使得N\geq N_0时,T(N)\leq cF(N),那么我们便可将T(N)的复杂度标识为O(F(N))

        以下三个问题出现一种新的复杂度形式:

  • 4.需要多少bits才能表现出N个连续整数?
  • 5.从X=1开始,每次将X扩充两倍,需要多少次扩充才能使X\geq N?
  • 6.从X=N开始,每次将X缩减一半,需要多少次缩减才能使X\leq 1?

        就问题4而言,B个bits可表现出2^B个不同的整数,因此欲表现N个连续整数,需满足方程式2^B\geq N,亦即B\geq logN

        问题5称为"持续加倍问题",必须满足方程式2^K\geq N,此式同问题4,因此解答相同。问题6称为“程序减半问题”,与问题5意义相同,只不过方向相反,因此解答相同。

        如果有一个算法,花费固定时间(常数时间,O(1))将问题的规模降低某个固定比例(通常是1/2),基于上述问题6的解答,我们便说此算法的复杂度是O(logN)。注意问题规模的降低比例如何,并不会带来影响,因此它会反应在对数的底上,而底对于Big-Oh标记法是没有影响。

        算法复杂度,可以作为我们衡量算法效率的标准。

STL算法总览

        STL算法,主要包括查找,填充,排序,排序判断;算法名称包括accumulate,binary_search, fill,find_if,max, min, sort, remove,reverse, rotate等算法。

质变算法mutating algorithms----会改变操作对象之值

        所有的STL算法都作用在有迭代器[first, last)所标示出来的区间上,所谓"质变算法",是指运算过程中会更改区间内(迭代器所指)的元素内容。诸如拷贝(copy),互换(swap),替换(replace),填写(fill), 删除(remove),排列组合(permutation),分割(partition),随机重排(random shuffling)、排序(sort)等算法,都属此类。如果将此类算法运用于常数区间上,例如:

int ia[] = {22, 30, 30, 17, 33, 40, 17, 23, 22, 12, 20};
vector<int> iv(ia, ia + sizeof(ia) / sizeof(int));vector<int>::const_iterator cite1 = iv.begin();
vector<int>::const_iterator cite2 = iv.end();sort(cit1, cit2);

非质变算法nonmutating algorithms----不改变操作对象之值

        所有的STL算法都作用在由迭代器[first, last)所标示出来的区间上。所以非质变算法,是指运算过程中不会更改区间内(迭代器所指)的元素内容。诸如查找(find),匹配(search),计数(count),巡访(for_each),比较(match,mismatch),寻找极值(max,min)等算法,都属此类。但是如果你在for_each(巡访每个元素)算法上应用了一个会改变元素的仿函数(functor),例如

template<class T>
struct plus2 {void operator()(T&x) const {x += 2;}
};int ia[] = {22, 30, 30, 17, 33, 40, 17, 23, 22, 12, 20};
vector<int> iv(ia, ia + sizeof(ia) / sizeof(int));for_each(iv.begin(), iv.end(), plus2<int>());

那么当然元素会被改变。

STL算法的一般形式

        所有泛型算法的前两个参数都是一对迭代器(iterators),通常称为first和last,用以标示算法的操作区间。STL习惯采用前闭后开标识法,写成[first,last),表示区间涵盖first至last(不含last)之间的所有元素。当first==last时,上述所表现的便是一个空区间。

        这个[first, last)区间的必要条件是,必须能够经由increment(累加)操作符的反复运用,从first到last。编译器本身无法强求这一点。如果这个条件不成立,会导致未可预期的结果。

        根据行进特性,迭代器可分为5类。每个STL算法的声明,都表现出它所需要的最低程度的迭代器类型。例如find()需要一个InputIterator,这是它的最低要求,但它也可以接受更高类型的迭代器,如ForwardIterator,BidirectionalIterator或RandomAccessIterator,因为无论是ForwardIterator,BidirectionalIterator或RandomAccessIterator也都是一种InputIterator。但如果你交给find()一个OutputIterator,会导致错误。

        将无效的迭代器传给某个算法,虽然是一个错误,却不保证能够在编译器就被捕捉出来,因为所谓迭代器类型并不是真实的型别,它们只是function template的一种型别参数。

        许多STL算法不知支持一个版本。这一类算法的某个版本采用缺省运算行为,另一个版本提供额外参数,接受外界传入一个仿函数(functor),以便采用其他策略。例如unique()缺省情况下使用equality操作符来比较两个相邻元素,但如果这些元素的型别并未供应equality操作符,或用户希望定义自己的equality操作符,便可以传一个仿函数给另一个版本的unique()。有些算法干脆将两个版本命名为两个不同名称的实体,附从的那个总是以_if作为尾词,例如find_if(),另一个例子是replace(),使用内建的equality操作符进行比对操作,replace_if则以接收到的仿函数进行比对行为。

        质变算法通常提供两个版本:一个是in-place(就地进行)版本,就地改变其操作对象;另一个是copy(另地进行)版,将操作对象的内容复制一份副本,然后再副本上进行修改并返回该副本。copy版本总是以_copy作为函数名称尾词,例如replace和replace_copy()。并不是所有的质变算法都有copy版,例如sort()就没有。如果我们希望以这类"无copy版本"之质变算法施行于某段区间的元素的副本上,我们必须自行制作并传递那一份副本。

        所有的数值算法,包括adjacent_difference(), accumulate(), inner_product, partial_sum等等,都实现与SGI<stl_numeric.h>之中,这是个内部文件,STL规定用户必须包含的是上层的<numeric>.其中STL算法都实现于SGI的<stl_algo.h>和<stl_algobase.h>文件中,夜都市内部文件,欲使用这些算法,必须包含上层相关头文件<algorithm>

算法的泛化过程

         将一个叙述完整的算法转化为程序代码,是任何训练有素的程序员胜任愉快的工作。这些工作由的极其简单(例如循序查找),有的稍微复杂(例如快速排序法),有的十分繁复 (例如红黑树之建立与元素存取),但基本上都不应该形成任何难以跨越的障碍。

         然而,如何将算法独立于其所处理的数据结构之外,不受数据结构的羁绊,思想层面就不是那么简答了。如何设计一个算法,是他适用于任何(或大多数)数据结构呢?换个说法,我们如何在即将处理的未知的数据结构(也许是array, 也许是vector,也许是list,也是是deque...)上,正确实现所有操作呢?

        关键在于,只要把操作对象的型别加以抽象化,把操作对象的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了。整个过程称为算法的泛型化(generalized),简称泛化。

        让我们看看算法泛化的一个实例。以简单的循序查找为例,假设我们要写一个find函数,在array中寻找特定值。面对整数array,我们的直觉反应是:

int* find(int *arrayHead, int arraySize, int value) {int I = 0;for (I =0; I<arraySize; ++I) {if (arrayHead[I] == value) break;}return &(arrayHead[I])
}

        该函数在某个区间内查找value。返回一个指针,指向它所找到的第一个符合条件的元素;如果没有找到,就返回最后一个元素的下一个位置(地址)。

        “最后元素的下一个未知”成为end.返回end以表示"查找无结果"似乎是个可笑的做法,为什么不返回null?因为,一如稍后即将看到的,end指针可以对其他种类的容器带来泛型效果,这是null所无法达到的。是的,从小我们被教导,使用array时千万不要超越其区间,但事实上一个指向array元素的指针,不但可以合法指向array内的任何未知,也可以指向array尾端以外的任何位置。只不过当指针指向array尾端以外的位置时,它只能用来与其他array指针相比较,不能提领(dereference)其值。现在,我们可以这样使用find函数。

const int arraySize = 7;
int ia[arraySize] = {0, 1, 2, 3, 4, 5, 6};
int *end = ia + arraySize;int *ip = find(ia, arraySize, 4);
if (ip == end) {cout << "4 not found" << endl;
} else {cout << "4 found. " << *ip << endl;
}

   上述find的做法暴露了容器太多的细节(例如arraySize),也因此太过依附特定容器。为了让find适用于所有类型的容器,其操作应该更抽象化些。让find接受连个指针作为参数,标识出一个操作区间,就是很好的做法:

int* find(int* begin, int* end, int value) {while(begin != end && *begin != value) {++begin;}return begin;
}

        这个函数在"前闭后开"区间[begin, end)内查找value,并返回一个指针,指向它所找到的第一个符合条件的元素;如果没找到就返回end。现在,你可以这样使用find函数:

const int arraySize = 7;
int ia[arraySize] = {0, 1, 2, 3, 4, 5, 6};
int *end = ia + arraySize;int *ip = find(ia, end, 4);
if (ip == end) {cout << "4 not found" << endl;
} else {cout << "4 found. " << *ip << endl;
}

find函数也可以很方便地用来查找array的子区间

int*p = find(ia +2, ia+5, 3);
if (ip == end)cout << "3 not found" << endl;
else cout << "3 found " << *p << endl;

       由于find()函数之内并无任何操作是针对特定的整数array而发的,所以我们可以将它改为template

template <class T>
T* find(T* begin, T* end, const T& value) {while(begin != end && *begin != value) {++begin;}return begin;
}

请注意数值的传递由pass-by-value改为了pass-by-reference-const,因为如今所传递的value,其型别可为任意;于是对象一大,传递成本便会提升,这是我们不愿见到的。pass-by-reference可完全避免这些成本。

        这样find很好,几乎使用与任何容器---只要该容器允许指针指入,而指针们又都支持一下四种find()函数中出现的操作行为:

  • inequality 判断不相等操作符
  • dereferencelm 提领、取值操作符
  • prefix increment 前置式递增操作符
  • copy 复制行为

        C++有一个极大的优点便是,几乎所有东西都可以改写为程序员自定义的形式或行为。是的,上述这些操作符或操作行为都可以被重载(overloaded),既事如此,何必将find限制为只能使用指针呢?何不让支持以上四种行为的、行为很像指针的某种对象都可以被find()使用呢?如此一来,find()函数便可以从原生(native)指针的思想框框中跳脱出来。如果我们以一个原生指针指向某个list,则该指针进行"++"操作并不能使指针指向下一个串行节点。但如果我们设计一个class,拥有原生指针,并使其"++"操作指向list的下一个节点,那么find就可以施行于list容器身上了。

        这便是迭代器(iterator)的观念。迭代器是一种行为类似指针的对象,换句话说,是一种smart pointers.现在我们将find()函数内的指针以迭代器取代,重新写过

template <class Iterator, class T>
Iterator find(Iterator begin, Iterator end, const T& value) {while(begin != end && *begin != value) {++begin;}return begin;
}

        这便是一个完全泛化话的find()函数。我们可以再任何c++标准库的头文件里看到它,长相几乎一模一样。SGISTL把它放在<stl_algo.h>之中。

        有了这样的观念准备,后续看到的STL的各种泛型算法,将随处可见迭代器及数据作为泛型参数作为算法的输入参数。

参考文档《STL源码剖析》--侯捷

相关文章:

STL之算法概览

目录 算法概览 算法分析与复杂度标识O() STL算法总览 质变算法mutating algorithms----会改变操作对象之值 非质变算法nonmutating algorithms----不改变操作对象之值 STL算法的一般形式 算法的泛化过程 算法概览 算法&#xff0c;问题之解法也。 以有限的步骤&#xff0…...

数据库中的视图

数据库中的视图 什么是视图创建视图使⽤视图修改数据注意事项 删除视图视图的优点 什么是视图 视图是⼀个虚拟的表&#xff0c;它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据&#xff0c;⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使…...

【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)

1. 设计模式原理说明 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许你将请求沿着处理者链进行发送。每个处理者都可以处理请求&#xff0c;或者将其传递给链上的下一个处理者。这种模式使得多个对象都有机会处理请…...

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…...

【面试分享】主流编程语言的内存回收机制及其优缺点

以下是几种主流编程语言的内存回收机制及其优缺点&#xff1a; 一、Java 内存回收机制&#xff1a; Java 使用自动内存管理&#xff0c;主要通过垃圾回收器&#xff08;Garbage Collector&#xff0c;GC&#xff09;来回收不再被使用的对象所占用的内存。Java 的垃圾回收器会定…...

Java中的多线程

文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中&#xff0c;多线程编程是…...

TypeError: issubclass() arg 1 must be a class

TypeError: issubclass() arg 1 must be a class 报错代码&#xff1a; import spacy 原因&#xff1a; 库版本错误&#xff0c; 解决方法&#xff1a; pip install typing-inspect0.8.0 typing_extensions4.5.0 感谢作者&#xff1a; langchain TypeError: issubclass() …...

C语言实例之9斐波那契数列实现

1. 斐波那契数列简介 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多・斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为 “兔子数列”。 它的特点是从第三…...

Flink 常用问题及常用配置(有用)

一、Flink 常用问题及常用配置 参数 示例 说明 execution.checkpointing.interval 3min Checkpoint 触发间隔 state.backend rocksdb / filesystem 用于设置statebackend类型, 默认会以内存为statebackend(无法支持大状态) taskmanager.memory.jvm-overhead.max 204…...

什么是内网穿透开发

文章目录 前言实现内网穿透的常见技术方法1. 反向代理与端口映射2. 第三方内网穿透服务3. 自建穿透服务4. VPN&#xff08;虚拟专用网络&#xff09; 内网穿透开发的关键点1. 安全性2. 性能3. 合法性和合规性 适用场景 前言 内网穿透开发是指将位于内网或防火墙后的应用服务&a…...

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…...

创建HTTPS网站

每天&#xff0c;我们都会听到网络上发生身份盗窃和数据侵权的案例&#xff0c;这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词&#xff1a;HTTP与HT…...

【DL笔记】神经网络轻量化(CV方向)的一些论文记录

现在大模型爆火&#xff0c;但俺这种组里只有10系显卡的下水道科研老鼠也要混毕业的&#xff0c;于是选择做小模型&#xff08;x&#xff09;。本人纯科研飞舞一个&#xff0c;刚入学有段时间爱看论文&#xff0c;今天有空把那会看到论文总结下。 轻量化&#xff0c;相关文章的…...

计算(a+b)/c的值

计算&#xff08;ab&#xff09;/c的值 C语言代码C语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定3个整数a、b、c&#xff0c;计算表达式(ab)/c的值&#xff0c;/是整除运算。 输入 输入仅一行&…...

11.26作业

#include "test.h" #include <myhead.h>int main(int argc, const char *argv[]) {Student students[100]; // 假设最多有100个学生int select 0;int n 0; // 学生数量menu();while (1) {printf("请输入你想要的功能&#xff1a;");scanf("%…...

AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题

目录 AdaPipe:动态规划解决显存和GPU在LLM计算中出现气泡问题 0-5表示不同数据 大的方块表示:管道,便于理解了想成GPU 黄色方块表示显存 Stage表示Attention和FFN layer(Projection和MLP) 重计算和分区策略:细化了Attention和FFN layer Transformer中的管道 AdaPi…...

C++设计模式之组合模式中如何实现同一层部件的有序性

在组合模式中&#xff0c;为了实现同一层上部件的有序性&#xff0c;可以采取以下几种设计方法&#xff1a; 1. 使用有序集合 使用有序集合&#xff08;如 std::list、std::vector 或其他有序容器&#xff09;来存储和管理子部件。这种方法可以确保子部件按照特定顺序排列&am…...

QT QRadioButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024,12月27-29日)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 重要信息 会议官网&#xff1a;www.icairc.net 三轮截稿时间&#xff1a;2024年11月30日23:59 录…...

Dubbo的RPC泛化调用

目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口&#xff1f; Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下&#xff0c;对服务方…...

Java面试题、八股文学习之JVM篇

1.对象一定分配在堆中吗&#xff1f;有没有了解逃逸分析技术&#xff1f; 对象不一定总是分配在堆中。在Java等一些高级编程语言中&#xff0c;对象的分配位置可以通过编译器或运行时系统的优化来决定。其中&#xff0c;逃逸分析&#xff08;Escape Analysis&#xff09;是用于…...

Apache Maven Assembly 插件简介

Apache Maven Assembly 插件是一个强大的工具&#xff0c;允许您以多种格式&#xff08;如 ZIP、TAR 和 JAR&#xff09;创建项目的分发包。 该插件特别适用于将项目与其依赖项、配置文件和其他必要资源一起打包。 通过使用 Maven Assembly 插件&#xff0c;您可以将项目作为…...

3174、清除数字

3174、[简单] 清除数字 1、题目描述 给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符&#xff1a; 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。 请你返回删除所有数字字符以后剩下的字符串。 2、解题思路 遍历字符串&#xff1a; 我们需要逐个遍…...

【C#】C# resx方式实现多语言切换(静态切换)

1. 效果 中文界面 英文界面 2. 步骤 1. 添加resx文件 2. Form1.en-GB.resx内容 3. Form1.zh-CN.resx内容 4. Form1.cs修改&#xff08;重点&#xff09; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syste…...

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…...

TCP/IP协议攻击与防范

一、TCP/IP协议攻击介绍 1.1 Internet的结构​ LAN&#xff1a;局域网 WAN&#xff1a;广域网 WLAN&#xff1a;无线局域网 私有IP地址与公有IP地址&#xff1f; 私有地址&#xff1a;A类&#xff1a;10.0.0.0~10.255.255.255 B类&#xff1a;172.16.0.0~172.31.255.255…...

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器&#xff0c;也就是Flash启动10系统存储器系统存储器启动&#xff0c;串口下载11SRAM启动SRAM启动&#xff0c;用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时&#xff0c;就是下载…...

vue的理解

什么是vue vue是一套用于构建用户界面的渐进式框架&#xff0c;与其他框架不同的是&#xff0c;vue被设计为可以自底向上逐层应用&#xff0c;它也是创建单页面应用的web应用框架。vue的核心库只关注视图层&#xff0c;不仅易上手&#xff0c;还便于与第三方库或既有项目整合。…...

【Leetcode】3206.交替组1

题目描述&#xff1a; https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例&#xff1a; 解题思路 思路一&#xff1a; 1.如果color.size()小于等于2&#xff0c;则构不成环&#xff0c;直接返回结果…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…...

tomcat 文件上传 (CVE-2017-12615)

目录 1、漏洞描述 2、访问ip&#xff1a;port 3、漏洞利用 4、Exploit 5、修复建议 1、漏洞描述 Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 攻击者将有可能可通过…...

每天五分钟深度学习框架pytorch:卷积神经网络的搭建

本文重点 从本文开始我们将开启卷积神经网络的搭建了,卷积神经网络网络是深度学习中基础的算法模型之一,但是这里我们从实战为主,我们并不会对卷积神经网络详细的介绍,如果不懂得可以看我得《每天五分钟计算机视觉》专栏。 卷积神经网络 卷积神经网络可以认为是多个卷积…...

Opencv+ROS实现颜色识别应用

目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像&#xff1a;RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09; HSV图像&#xff1a;H&#xff0…...

JVM详解:垃圾回收机制

java作为大型服务开发的主流语言&#xff0c;其运行会占用大量的内存空间&#xff0c;那么合理的使用有限的服务器资源至关重要。和大多数翻译性语言一样&#xff0c;java的运行环境jvm也内置垃圾回收机制&#xff0c;其通过一些合理的算法组合&#xff0c;定时来对堆中保存的不…...

【单片机的结构和组成】

目录 1、中央处理单元&#xff08;CPU&#xff09;&#xff1a;2、存储器&#xff1a;3、输入/输出&#xff08;I/O&#xff09;接口&#xff1a;4、定时器/计数器&#xff1a;5、模拟-数字转换器&#xff08;ADC&#xff09;&#xff1a;6、数字-模拟转换器&#xff08;DAC&am…...

上下文信息、全局信息、局部信息

摘要 在计算机视觉中&#xff0c;上下文信息&#xff08;contextual information&#xff09;是一个核心概念&#xff0c;它指的是一个像素或一个小区域周围的环境或背景信息。这种信息对于模型理解图像中对象的相对位置、大小、形状&#xff0c;以及与其他对象的关系至关重要…...

Ansible--自动化运维工具

Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。…...

【每日一题】142.环形链表II

最近有点懈怠了&#xff0c;因为连续出差&#xff0c;身心俱疲&#xff0c;实在是没有空做题。 这道题的思路是快慢指针&#xff0c;需要对环形的链表进行数学公式的计算。 根据这个公式可以推断出一个数学结论&#xff0c;当快慢指针相遇的时候&#xff0c;快指针从起点再出发…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】

目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化&#xff0c;重新看了一些新的论文&#xff0c;发现了几篇写得比较好的YOLO系列论文综述&#xff0…...

TailwindCss 总结

目录 一、简介 二、盒子模型相关 三、将样式类写到一个类里面apply 四、一款TailWind CSS的UI库 一、简介 官方文档&#xff1a;Width - TailwindCSS中文文档 | TailwindCSS中文网 Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类…...

【开源项目】2024最新PHP在线客服系统源码/带预知消息/带搭建教程

简介 随着人工智能技术的飞速发展&#xff0c;AI驱动的在线客服系统已经成为企业提升客户服务质量和效率的重要工具。本文将探讨AI在线客服系统的理论基础&#xff0c;并展示如何使用PHP语言实现一个简单的AI客服系统。源码仓库地址&#xff1a;ym.fzapp.top 在线客服系统的…...

MySQL原理简介—11.优化案例介绍

大纲 1.禁止或改写SQL避免自动半连接优化 2.指定索引避免按聚簇索引全表扫描大表 3.按聚簇索引扫描小表减少回表次数 4.避免产生长事务长时间执行 1.禁止或改写SQL避免自动半连接优化 (1)业务场景介绍 (2)SQL性能问题分析 (3)SQL性能调优 (1)业务场景介绍 某互联网公司…...

Http 响应协议

HTTP的响应协议 响应数据格式 响应行 响应数据的第一行&#xff0c;包括协议、状态码、描述 响应头 从响应数据格式的第二行开始&#xff0c;也是以key:value的格式 响应体 和响应头之间有一个空行&#xff0c;是响应数据格式的最后一部分&#xff0c;用于存放响应的数据 常见响…...

实现 Browser 客户端下载 XML 文件功能

后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包&#xff08;上图代码&#xff09;in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…...

Matlab以一个图像分类例子总结分类学习的使用方法

目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…...

AI-agent矩阵营销:让品牌传播无处不在

矩阵营销是一种通过多平台联动构建品牌影响力的策略&#xff0c;而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能&#xff0c;帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广&#xff1a;多平台联动可以覆盖不同用…...

HDMI转VGA方案 LT8612UX(HDMI2.0) LT8612SX LT8511EX LT8522EX LT8612EX_e(HDMI1.4)

一、产品概述 LT8612UX是一款高性能的HDMI至HDMI&VGA转换器&#xff0c;由龙迅半导体公司推出。它能够将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号&#xff0c;同时输出8通道I2S和SPDIF信号&#xff0c;实现高质量的7.1声道音频。该转换器采用最新的ClearEdge技术&…...

零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu

1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统&#xff0c; 内核是Linux操作系统&#xff0c; 具有Ubuntu特色的可视…...

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中&#xff0c;车牌识别&#xff08;LPR&#xff09;技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力&#xff0c;为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…...