标准库中的搜索算法

深入解析VRPTW标准库R2类问题数据集 VRPTW(Vehicle Routing Problem with Time Windows)是一种在约束条件下的车辆路径优化问题,特别考虑了时间窗口的限制。它旨在最小化总行驶距离或成本,同时确保在为每个客户规定的时间窗口内完成货物的配送或服务。时间窗口的引入使得问题更加贴合实际应用场景,如快递配送、垃圾回收等物流和运输行业。车辆路径问题(Vehicle Routing Problem, VRP)是组合优化和运营研究中的一个重要问题,其主要目标是确定一组车辆服务一系列客户点的最有效路线。 阅读详情
 

The Standard Librarian: Searching in the Standard Library

Matthew Austern

http://www.cuj.com/experts/1911/austern.htm?topic=experts

 

The genius as well as the oversights in the design of the Standard C++ library surface in a simple discussion of its linear and binary search algorithms.


    在一个集合中找到一个特别的条目是个很重要的问题,标准C++运行库提供了许多不同的搜索技术。

    在 C++运行库中,指明一个集合的常用方法是通过iterator指示出区间。区间可以被写为[first, last),此处,*first是区间内的第一个元素而last则指向最后一个元素的下一个。本文展示了我们如何考虑一个通用问题:给定一个区间和一个准 则,找到指向第一个满足准则的元素的iterator。因为我们将区间表示为不对称的形式,于是避开了一个特殊情况:搜索失败可以返回last,没有任何 元素的区间可以写为[i, i)。

线性搜索和它的变种

    最简单的搜索是线性搜索,或,如Knuth所称呼的,顺序搜索:依次查看每个元素,检查它是否为我们正在搜索的那个。如果区间中有N个元素,最坏的情况就需要N次比较。

    标准运行库提供了线性搜索的一些版本;两个最重要的版本是find() (它接受一个区间和值x,并查找等价于x的元素)和find_if()(接受一个区间和判决条件p,并查找满足p的元素)。线性搜索的其它版本是 find_first_of()(接受两个区间,[first1,last1)和[first2,last2) ,并在[first1, last1)中查找第一个等价于[first2, last2)中任何一个元素的元素)和adjacent_find()(接受单一区间,并查找第一个等价于其后继元素的元素)。

    举例来说,假如,v是一个int的vector。你能用下面的代码查找第一个0:

vector < int > ::iterator i  =   find(v.begin(), v.end(),  0 );  

查找第一个非0值:
vector < int > ::iterator i =   find_if(v.begin(), v.end(), not1(bind2nd(equal_to<int>(), 0)));

查找第一个小质数:

A[ 4 ]  =   { 2, 3, 5, 7 } ;
vector
< int > ::iterator i  =   find_first_of(v.begin(), v.end(), A + 0 , A + 4 );


找到第一个重复对:

vector < int > ::iterator i  =   adjacent_find(v.begin(), v.end());


   
没有任何独立版本以对区间进行逆向搜索,因为你不需要:你能用一个简单的iterator adaptor来达到相同的效果。比如,在v中找到最后一个0,可以这么写:

vector < int > ::reverse_iterator i  =   find(v.rbegin(), v.rend(),  0 );

    线性搜索是一个简单的算法,它的实现看起来没什么可讨论的。许多书(包括我的)展示了std::find()的一个简单的实现:

template  < class  InIter,  class  T >
InIter find(InIter first, InIter last, 
const  T &  val)
{
  
while (first != last && ! (*first == val))  ++first;
  
return first;
}

    这的确是线性搜索算法的一个忠实的实现,满足C++标准的需求;第一个模板参数的名字,InIter,意味着实参只需要是非常弱的Input Iterator[注1]。它看起来可能是如此的简单,以致于还不如在代码中直接手写出来。虽然如此,还是有一个令人懊恼的问题:这个实现没有达到它应该 的效率。循环条件很复杂,需要为取得的每个元素作两个测试。有条件的分支昂贵的,并且复杂的循环条件不会得到与简单的循环条件同样程度的优化。

    问题的答案之一,并是被某些标准运行库的实作所采用[注2],是“解开”循环,每次检查4个元素。这是比较复杂的解决方法,因为find()然后必须处理残 余元素(区间不会总是4的倍数!),以及它还需要find()基于Iterator的种类进行分解--“解开”只能工作于Random Access Iterator指示的区间,对一般情况还是需要使用老的实现。但是,“解开”是有效果的:它将对每个元素的测试的数目从2降到 1.25。它是标准库的实现人员不需要改动任何接口就能采用的技术。

    你将会在讲述算法的常见书籍中看到一个不同的答案。需要对每个元素作两次测试的原因是,如果到达区间结束还没有找到所要找的元素,我们必须承认已经失败。但 是如果我们碰巧所要查找的元素总是存在,搜索绝不会失败时,会怎么样?在那种情况下,为区间结束作的测试是多余的;会没有任何的理由认为搜索算法应该首先 掌握区间结束的信息(there wouldn’t be any reason for the search algorithm to keep track of the end of the range in the first place)。取代std::find(),我们可以如下实现线性搜索算法:

template  < class  InIter,  class  T >
InIter unguarded_find(InIter first, 
const  T &  val)
{
  
while (!(*first==val)) ++first;
}

    Knuth 的线性搜索版本[注3]更接近unguarded_find()而不是std::find()。注意,unguarded_find()不是C++标准的 一部分。它比find()危险,通用性上也稍差。你只能在确保有一个元素等价于val时使用它--这通常意味着你自己已经将那个元素放在里面了,并作为区 间结束的哨兵。使用哨兵并不总是成立。(如果你正在搜索的是一个只读区间怎么办?)但当它可用时,unguarded_find()比标准库中的所有东西 都更快,更简单。

二分搜索

    线性搜索很简单,并且,对于小区间,它是最好的方法。然而,如果区间越来越长,它就不再是合理的解决方案了。在最近使用XSLT的时候,我想起这个问题。我的XSLT脚本包括了一个类似于这样的一行:

< x:value - of select = " /defs/data[@key=$r] " />

    我用来跑这个的XSLT引擎肯定是使用的线性搜索。我在一个list中搜索,并对list中的每个条目执行了这个搜索。我的脚本是O(N2)的,它运行需要花几分钟。

    如果你正在搜索一个完全一般的区间,不能比线性搜索做得更好了。你必须检查每一个元素,否则你漏掉的可能就是你正在寻找的。但如果你要求这个区间是以某种方式组织的,你就可以做得更好了。

    比如,你可以要求区间是已排序的。如果有一个已序区间,就可以使用线性搜索的一个改良版本(当你到达一个比所寻找的元素更大的元素时,不需要继续到区间结束 就可以知道搜索已经失败了),但更好的方法是使用二分搜索。通过查看区间中央的元素,你就可以说出所搜索的元素在前半部分还是后半部分;重复这个分解过 程,你不需要遍历所有元素就能找到要找的元素。线性搜索需要O(N)的比较,而二分搜索只需要O(log N)。

    标准运行库包含二分搜索的四个不同版本:lower_bound(),upper_bound(),equal_range()和 binary_search()。他们全部都有着相同的形式:接受一个区间、一个试图查找的元素,和可选的比较函数。区间必须是根据此比较函数进行过排序 的;如果不提供比较函数,它必须是根据通常的“<”运算排序的。于是,举例来说,如果你正在一个升序排序的int数组中搜索时,你可以使用默认行 为。如果在一个降序排序的int数组中搜索时,你可以传入一个std::greater<int>作为比较函数。

    在四个二分搜索函数中,最没用的一个是名字最一目了然的那个:binary_search()。它所返回是简单的yes或no:存在于区间中时返回 true,否则为false。但光这么一个信息没什么用;我从未遇到什么场合来使用binary_search()。如果你想搜索的元素存在,你可能想知 道它的位置;如果不存在,你可能想知道如果它存在,这个位置是哪里。

    关于元素的位置,你可以想问几个不同的问题,而这正是二分搜索的几个不同版本存在的原因。当相同的元素存在好几个拷贝时,它们的区别就很重要了。举例来说,假如你有一个int的数组,然后使用lower_bound()和upper_bound()都找寻同一个值:

int A[10] = { 1, 2, 3, 5, 5, 5, 5, 7, 8, 9 };
int* first = std::lower_bound(A+0, A+10, 5);
int* last = std::upper_bound(A+0, A+10, 5);

    名字first和last暗示了区别:lower_bound()返回第一个你正在寻找的数值(对本例,是&A[3]),而upper_bound ()返回最后一个你正寻找的值的下一个的iterator(对本例,是&A[7])。
    如果你搜索的值不存在,你将得到如果它存在的话,应该位于的 位置。和前面一样,我们可以写:

int* first = std::lower_bound(A+0, A+10, 6);
int* last = std::upper_bound(A+0, A+10, 6);

    first和last都将等于&A[7],因为这是6在不违背排序时可以插入的唯一位置。

    实践中,你看不到lower_bound()的调用后面立即跟一个upper_bound()。如果你同时需要这两个信息,那正是引入最后一个二分搜索算法 的原因:equal_range()返回一个pair,第一个元素是lower_bound()将要返回的值,第二个元素是upper_bound()的 返回值。

    直到此时,我在讨论中故意比较粗略:我说了lower_bound()和upper_bound()找一个值,但没有正确说明它的含义。如果你写

iterator i = std::lower_bound(first, last, x); 

而且搜寻成功,你保证 *i 和 x 相等吗?不一定!lower_bound()和upper_bound()从不对等价性进行测试(WQ注:逻辑相等,使用operator==())。它们使用你提供的比较函数:operator<()或其它一些功能象“less than”的比较函数。这意味着在*i不小于x并且x不小于*i时,搜索成功(WQ注,即等值性,数学相等)。

    这个区别看起来象吹毛求疵,但它不是。假如你一些具有很多字段的复杂记录,你使用其中的一个字段作为排序的key值(比如,人的姓)。两个记录可能有相同的key值,于是,即使所有其它子段都是不同的,它们哪一个也不小于另外一个。

    一旦开始想到记录和key值,二分搜索的另外一个问题就变得很自然了:你能用二分搜索根据key来搜索记录吗?更具体些,假设我们定义了一个struct X:

struct X {
  
int id;
  ... 
// other fields
}
;

再假设有一个vector<X>,根据元素的id进行过排序。你如何使用二分搜索来找到一个指定id(比如148)的X?

    一个方法是创建一个有着指定的id哑X对象,并在二分搜索中使用它:

X dummy;
 dummy.id 
= 148;
 vector
<X>::iterator = lower_bound(v.begin(), v.end(), dummy, X_compare);

    目前而言,这是最可靠的方法。如果你关心最大程度的可移植性,它是你所应该使用的方法。另一方面,它不是非常优雅。你必须创建一个完整的X对象,虽然你需要 的只是其中一个字段;其它字段不得不被初始化为默认值或随机值。那个初始化可能是不方便的,昂贵的,或有时甚至不可能的。

    可能直接将id传给lower_bound()吗?也许,通过传入一个异质比较函数,它接受一个X和一个id?这个问题没有一个简单的答案。C++标准没有 完全说清楚是否允许这样的异质比较函数;依我之见,对标准的最自然的读解是不允许。在现今的实践中,异质比较函数在一些实作上可行,而在另外一些上不行。 另一方面,C++标准化委员会认为这是一个缺陷,并且在未来版本的标准将明确是否允许异质比较函数[注4]。

总结

C++运行库还提供了其它一些形式的搜索算法。使用find()和lower_bound(),搜索只限于单个元素,但标准运行库还提供了serach(),它寻找整个子区间。比如,你可以在一个字符串s中搜索一个单词:

std::string the = "the";
std::
string::iterator i = std::search(s.begin(), s.end(), the.begin(), the.end());

返回值,i,将指向“the”在s中第一次出现的开始处--或,和往常一样,如果“the”不存在将返回s.end()。还有一个变种以从尾部开始搜索:

std::find_end(s.begin(), s.end(), the.begin(), the.end());

    它返回一个iterator,指向“the”最后出现处的开始,而不是第一个。(如果你认为这很奇怪,search的逆向变种叫find_end()而不是search_end(),那么你并不孤独。)

    搜索可以被封装入数据结构。最明显地,标准运行库的关联容器,set、multiset、map和multimap,被特别设计为根据key进行搜索将很高 效[注5]。运行库的string类也提供了许多搜索用的成员函数:find()、rfind()、find_first_of()、 find_last_of()、find_first_not_of()和find_last_not_of()。我建议避免使用它们。我发现这些特殊的 成员函数难以记忆,因为它们拥有如此多的形式,并且接口形式与运行库的其它部分不同;无论如何,他们不会提供任何不能从find()、find_if ()、search()得到的功能。

    但是,如果你仍然认为看到了一些重要的省略,你是正确的!我没有提到hash表,因为标准运行库中没有hash表。我提到了search()的子区间匹配,但那当然只是模式匹配的一个特例--标准运行库中没有正则表达式搜索或任何类似的东西。

    C++标准化委员会刚刚开始考虑对标准运行库扩充,而hash表和正则表达式是未来版本的标准的优先候选者。如果你认为标准运行库缺少了什么,并且你想提交一份提议,那么现在是你应该开始准备时候了。
  

注:

[1] See Table 72 in the C++ Standard. Some of the other search algorithms, which I discuss later, rely on the stronger Forward Iterator requirements.

[2] See, for example, <www.sgi.com/tech/stl>.

[3] See “Algorithm Q,” in §6.1 of D. E. Knuth, The Art of Computer Programming, vol. 2, Sorting and Searching, Second Edition (Addison-Wesley, 1998).

[4] See <http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#270>. Dave Abrahams had the insight that enabled the proposed resolution to this issue. He pointed out that it’s possible to think of binary searches not in terms of sorting and comparisons, but in terms of partitioning: we’re given a range with the property that all elements before a certain point satisfy a condition and all elements after it fail to satisfy the condition, and we’re looking for the transition point.

[5] But these containers aren’t the most efficient choice as often as one might think. See my earlier column “Why You Shouldn’t Use set — and What You Should Use Instead,” C++ Report, April 2000.
掌握Java核心排序与搜索算法 本文深入探讨了Java中核心的排序和搜索算法,包括插入排序、快速排序、归并排序和二分查找。文章详细解释了每种算法的工作原理、性能特点以及适用场景,并通过代码示例加深理解。同时,提醒读者面试时对算法的实现和性能的理解至关重要,以及在实际应用中应优先考虑使用成熟的库实现。 阅读详情

相关推荐

D.E.Knuth(高德纳)著,计算机程序设计艺术第三卷,英文原版,epub

资源来自http://b-ok.org/,本人对相关版权等问题不了解,可联系删除 The Art of Computer Programming, Volume 3: Sorting and Searching (2nd Edition) Donald E. Knuth This volume comprises Chapters 5 and 6 of the complete series. Chapter 5 is concerned with sorting into order; this is a large subject that has been divided chiefly into two parts, internal sorting and external sorting. There also are supplementary sections, which develop auxiliary theories about permutations (Section 5.1) and about optimum techniques for sorting (Section 5.3). Chapter 6 deals with the problem of searching for specified items in tables or files; this is subdivided into methods that search sequentially, or by comparison of keys, or by digital properties, or by hashing, and then the more difficult problem of secondary key retrieval is considered. There searching related to sorting is a surprising amount of interplay between both chapters, with strong analogies tying the topics together. Two important varieties of information structures are also discussed, in addition to those considered in Chapter 2, namely priority queues (Section 5.2.3) and linear lists represented as balanced trees (Section 6.2.3).

C++ STL标准库:算法<algorithm> 查找算法 search()自定义规则

#include <functional> #include <iostream> #include <vector> #include <algorithm> using namespace std; template <class T> void FillValue(T& vect, int first, int last) { if (last >= first) { for (int i = first; i &l

超级大洋葱的博客 1071

python爬取巨潮资讯网所有股票年报数据

爬虫获取巨潮资讯网数据

qq_42752524的博客 6126

线性搜索算法find

最基本的线性搜索函数是find。它在读迭代器的区间内搜索一个值,返回指向该区间内的首次匹配到目标元素的迭代器,如果没有找到,则返回末端迭代器的副本。 运用find可以快速到一个数据序列中查找一个数据。 EXAMPLE   #include #include #include #include #include //C++实现的快速排序,运用C++标准库中的快速排序函数,

yulang1989的专栏 1157

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 540

(92页PPT)某大型集团信息化项目企业数字化转型ERP系统蓝图设计规划方案(附下载方式)

同时,外贸获利空间被严重挤压,必须从价格竞争转向品牌竞争。该方案针对某大型外贸集团在数字化时代的转型需求,提出了一套完整的ERP系统建设框架和实施路径,具有很高的专业参考价值。特别值得关注的是方案提出的"价值为先"指导思想,通过将企业价值图与信息系统建设紧密结合,确保IT投资直接支撑价值创造。同时,方案充分考虑了集团多元化、国际化的发展需求,设计了灵活可扩展的系统架构。总的来说,这份实施方案专业性强、内容全面、措施具体,既立足解决当前问题,又着眼未来发展需求,为大型集团企业的数字化转型提供了优秀范本。

AI_data_cloud的博客 1027

[转载]标准库的字符串哈希算法

// http://en.cppreference.com/w/cpp/string/basic_string/hash#include <iostream> #include <string> #include <functional>int main() { std::string s = "abc"; std::hash<std::string> hash_fn; siz

机器人们的后勤仓库 321

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1075

查找算法之线性查找算法

线性查找算法 线性查找也叫顺序查找,这是最基本的一种查找方法,从给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。 如果元素个数为 N,那么线性查找的平均次数为: N/2 代码演示 /** * 线性查找 * * @author Yuan-9826 */ public class SequenceSearch { public static void main(String[] args) { int[] arr = {7, 8, 9, 1, 0, 2,

qq_47897078的博客 433

基于YOLOv8的植物生长阶段识别系统设计与实现

本文详细介绍了一个基于YOLOv8深度学习模型的植物生长阶段识别系统,包含完整的数据集构建、模型训练、评估以及基于PyQt5的用户界面开发过程。系统能够自动识别植物在不同生长阶段(如发芽期、生长期、开花期、结果期等)的形态特征,为精准农业和智能种植提供技术支持。文章提供了完整的代码实现,并讨论了模型优化策略和实际应用场景。关键词:植物生长阶段识别、YOLOv8、目标检测、PyQt5、深度学习。

YOLO 467

海德汉机床采集数据

海德汉数控系统我一般在高端机床上见得比较多。有好多五轴加工精度比较高的机床都用的是海德汉的系统。市面上常见的有530和640等型号。海德汉的采集还是有点难度的,需要对SDK有深度的了解。

若云流风的专栏 1531

标准库:标准库中的搜索算法

标准库:标准库中的搜索算法The Standard Librarian: Searching in the Standard Library Matthew Austern http://www.cuj.com/experts/1911/austern.htm?topic=experts  The genius as well a

yewuyu的专栏 1302

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1897

CUJ:标准库:标准库中的搜索算法

The Standard Librarian: Searching in the Standard LibraryMatthew Austernhttp://www.cuj.com/experts/1911/austern.htm?topic=experts The genius as well as the oversights in the design of the Stan

taodm的专栏 2057

【Qwen2微调实战】LLaMA-Factory框架对Qwen2-7B模型的微调实践

在人工智能的浪潮中,大型语言模型(LLMs)正逐渐成为研究和应用的热点。它们在自然语言处理(NLP)的各个领域,如文本生成、翻译、问答等任务中展现出了卓越的能力。Qwen2-7B模型,作为该领域的佼佼者,不仅因其庞大的参数量和强大的表示能力受到关注,更因其在微调后能够更好地适应特定任务而备受关注。本文将详细介绍如何利用LLaMA-Factory这一高效的微调框架对Qwen2-7B进行微调,以期达到提升模型在特定任务上的表现。

寻道AI,探索AI无限可能! 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CUJ:标准库:标准库中的搜索算法 (转)

CUJ:标准库:标准库中的搜索算法 (转)[@more@]The Standard Librarian: Searching in the Standard LibraryXML:namespace prefix = o ns ...

csd3176的博客 194

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

探索C++标准库中的隐藏宝藏:强大而鲜为人知的搜索算法

本文将介绍一些鲜为人知但非常有用的算法。这些算法可以帮助高效地查找子序列或特定值的位置。本文详细解释了每个算法的用法、参数和返回值,并提供了相应的示例代码。通过学习和掌握这些隐藏宝藏算法,可以更加灵活和高效地处理各种搜索需求。以下所有函数都不假设它们操作的元素是有序的,因此它们使用operator==(或提供的自定义比较器)来执行比较。以上就是使用STL进行搜索的内容。C++标准库中的搜索算法提供了强大而高效的功能,但很多开发者可能对它们不太熟悉。本文介绍了和这三个宝藏级算法。

Lion_Long的博客 2181

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

stl中的二分查找

binary_search 使用方式 binary_search(区间起始,区间结束后一个,要查找的元素。 #include<bits/stdc++.h> using namespace std; int main() { int a[3]={1,2,3}; cout<<binary_search(a+0,a+3,2)<&l...

dieyao5340的博客 195

暴力搜索算法

暴力搜索算法过程,用模式串P去和目标串T比较,如果对应字符匹配成功,两两后移一位,如果匹配不成功,模式串从T的下一个字符开始匹配,重复上述执行过程 /**暴力搜索算法,使用STL*/ #include<string> #include<iostream> using namespace std;//记得要写命名空间std,不然用不了string int i=0,j=0;...

qq_43625764的博客 2085

C++ search和search_n

#include #include #include #include #include using namespace std; int main(){ array test = {3,5,7,7,11,6,17,19}; array t2 = {11,13}; array::iterator it; //找到t2中元素在test中第一次出现的位置,不像find函数

王川的私房菜 3670

刷完这50个标准库模块:没人比我更懂Python了

python强大,主要是因为包多,且不说第三方包,单是标准库就让人望而生畏了。 在整理标准库的过程中,查阅了大量资料,以及官方文档,发现很多中文资料都有一个共同的特点——机翻风格严重。对于一些不常用,但有助于理解python运行机制的包,不仅中文资料乏善可陈,连英文资料都很稀缺,所以又不得不翻阅源码这个工作还是十分耗时的。

微小冷的学习笔记 6677

深度强化学习在智能家居中的5个落地案例:从理论到产品化的关键步骤

本文探讨了深度强化学习在智能家居领域的5个具体落地案例,涵盖能耗优化、个性化照明、安防识别、园艺灌溉及多设备协同。文章重点剖析了从理论模型到产品化的关键工程步骤,包括问题定义、奖励函数设计、模拟环境构建、模型轻量化与边缘部署,并强调了隐私保护与持续学习在产品化中的重要性。

tgb345678的博客 526

Effective_STL 学习笔记(四十五) 注意 count、find、binary_search、lower_bound、upper_bound 和 equal_range 的区别...

如果区间有序,可以使用对数时间的算法,binary_search、lower_bound、upper_bound 和 equal_range 如果迭代器没有划分一个有序区间,只能用线性时间的算法 count、count_if、find 和 find_if cout 回答: 是否存在这个值,如果有,那么存在几分拷贝? find 回答: 是否存在,如果有,那么它在哪? c...

weixin_33674976的博客 124

板凳——————————————————c++(62)

#include <array> #include <vector> #include <deque> #include <list> #include <forward_list> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <algorithm> #in

fengye207161的博客 509
上一篇: C++的疑问
下一篇: typedef的四个用途和两个陷阱
HateCode
博客等级 码龄20年 25粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值