C++
文章平均质量分 97
流云IoT
这个作者很懒,什么都没留下…
展开
-
数据结构与算法分析(十八)--- 如何使用动态规划高效寻找最优解?
对于多阶段决策问题,我们使用回溯剪枝算法虽然可以穷举所有可行解,但复杂度太高阶。现实问题通常只关注最优解,针对多阶段决策最优解问题,我们可以使用动态规划算法大幅降低求解复杂度。动态规划的核心是划分阶段和可供决策的状态,然后找到阶段递推的状态转移方程,以便从初始状态递推到目标最优解。由于动态规划后面阶段的最优解通常跟前一阶段多个状态相关,因此存在大量的重叠子问题,通常使用备忘录或状态转移表解决重叠子问题重复求解的问题。如果后面阶段的最优解跟前面阶段无关,只需要选择最快逼近目标值的状态分支,可用贪心算法更高效。原创 2021-01-15 22:56:18 · 2009 阅读 · 0 评论 -
数据结构与算法分析(十七)--- 怎么用回溯剪枝高效穷举所有可行解?
当我们遇到一个比较复杂的问题时,通常会想到将一个复杂的问题分解为多个简单的等价子问题去解决。关键是如何分解复杂问题呢?我们可以从两个大的维度去分解:一个是从空间维度上将原大规模问题分解为多个等价的小规模子问题,再把容易求得的小规模子问题的解合并即可得到原大规模问题的解,这就是分治算法;另一种是从时间维度上将原多阶段决策问题分解为多个等价的单阶段决策子问题,再按照DFS 深度优先遍历顺序尝试所以的决策组合,所有满足约束条件的解的组合共同构成原多阶段决策问题的解,这就是回溯剪枝算法,本文以排列组合为例介绍其原理原创 2021-01-10 23:20:29 · 1431 阅读 · 2 评论 -
数据结构与算法分析(十五)--- String 和Regex 支持的字符处理操作(C++11)
字符处理是计算机的核心任务之一,各种编程语言也为字符处理提供了丰富的库函数。由于字符处理中查找匹配操作很常用,C++ 为此设计了string class 和regex class,以保证整个字符串复制传递的最优化。本文介绍了string class 支持的字符串创建、赋值、销毁操作,元素访问、容量管理操作,字符序列比较、新增、删除、替换操作,字符数值转换操作,查找、匹配操作等。C++ 提供了regex class 允许开发者使用正则表达式实现更复杂的字符序列查找、匹配、替换、分割操作。原创 2020-12-15 21:57:02 · 1053 阅读 · 0 评论 -
C++多线程并发(一)--- 线程创建与管理
一、何为并发简单来说,并发指的是两个或多个独立的活动在同一时段内交替发生。与并发相近的另一个概念是并行,并行则强调的是多个独立的活动在同一时刻点同时发生。二、为什么使用并发在应用程序中使用并发的原因主要有两个:关注点分离和性能。事实上,甚至可以说它们差不多是使用并发的唯一原因;当你观察的足够仔细时,一切其他因素都可以归结到这两者之一(或者可能是二者兼有)。原创 2020-03-16 22:21:32 · 22667 阅读 · 9 评论 -
数据结构与算法分析(十三)--- 集合与映射 + Set/Map容器(C++11)
一、集合与映射人们把一堆东西放到一起,就称之为集合了。一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集,构成集合的事物或对象称作元素或是成员。集合的元素可以是任何事物,集合具有无序性、互异性、确定性等特性。在数学上,我们可以把映射看作是集合与集合之间的一种对应关系,比如函数实际上就是数的集合到数的集合之间的映射关系。计算机更擅长处理数字编号,我们的大脑更擅长处理概念词汇,因此我们经常需要通过某个关键词key来查询一组数据的信息value,于是就把这种映射关系抽象为一个数据结构:键值对。原创 2020-01-16 16:39:13 · 2542 阅读 · 0 评论 -
数据结构与算法分析(二)--- STL简介 + 线性表容器(C++11)
STL是由一些可适应不同需求的集合类和一些能够在这些数据集合上运作的算法构成,STL内的所有组件都由模板构成,所以其元素可以是任意类型。STL组件包括以下部分: - 容器(container):用来管理某类对象的集合,容器可以是array、list、set、map等; - 迭代器(iterator):用来在一个对象集合内遍历元素,这个对象集合或许是个容器,或许是容器的一部分; - 算法(algorithm):用来处理集合内的元素,它们可以出于不同的目的而增、删、改、查、排序、使用元素。原创 2019-12-19 19:18:43 · 2188 阅读 · 0 评论 -
C++多线程并发(五)---原子操作与无锁编程
一、何为原子操作前面介绍了多线程间是通过互斥锁与条件变量来保证共享数据的同步的,互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候,对共享资源的访问主要是对某一数据结构的读写操作,如果数据结构本身就带有排他性访问的特性,也就相当于该数据结构自带一个细粒度的锁,对该数据结构的并发访问就能更加简单高效,这就是C++11提供的原子数据类型< atomic >。下面解释两个概念:...原创 2019-05-12 13:21:23 · 15632 阅读 · 4 评论 -
C++多线程并发(四)---异步编程
一、何为异步编程前面用两篇文章谈到了线程同步的两个工具:互斥量与条件变量。这里怎么又开始谈论异步编程了呢?同步与异步分别是什么意思呢?如果细心观察不难发现,前面提到的线程同步主要是为了解决对共享数据的竞争访问问题,所以线程同步主要是对共享数据的访问同步化(按照既定的先后次序,一个访问需要阻塞等待前一个访问完成后才能开始)。这篇文章谈到的异步编程主要是针对任务或线程的执行顺序,也即一个任务不需要...原创 2019-05-06 23:15:13 · 19242 阅读 · 9 评论 -
C++多线程并发(三)---线程同步之条件变量
一、何为条件变量在前一篇文章《C++多线程并发编程(二)—线程同步之互斥锁》中解释了线程同步的原理和实现,使用互斥锁解决数据竞争访问问题,算是线程同步的加锁原语,用于排他性的访问共享数据。我们在使用mutex时,一般都会期望加锁不要阻塞,总是能立刻拿到锁,然后尽快访问数据,用完之后尽快解锁,这样才能不影响并发性和性能。如果需要等待某个条件的成立,我们就该使用条件变量(condition var...原创 2019-05-03 12:43:12 · 18291 阅读 · 22 评论 -
C++多线程并发(二)---线程同步之互斥锁
一、何为线程同步在前一篇文章《C++多线程并发编程(一)—线程管理》中解释多线程并发时说到两个比较重要的概念:多线程并发:在同一时间段内交替处理多个操作,线程切换时间片是很短的(一般为毫秒级),一个时间片多数时候来不及处理完对某一资源的访问;线程间通信:一个任务被分割为多个线程并发处理,多个线程可能都要处理某一共享内存的数据,多个线程对同一共享内存数据的访问需要准确有序。如果像前一篇文...原创 2019-03-20 00:08:29 · 18857 阅读 · 6 评论 -
Windows静态链接库与动态链接库的创建和显式与隐式调用
一、链接库简介之前已经写过一篇Linux环境下的静态与动态链接库对比和应用的文章:C++静态库与动态库—Linux基础篇。这里不再赘述,主要介绍Windows环境下与Linux的区别。二、Windows静态库的创建和使用2.1 Windows静态库的创建如果是使用VS命令行生成静态库,也是分两个步骤来生成程序:首先,通过使用带编译器选项 /c 的 Cl.exe 编译代码 (cl /c ...原创 2019-03-13 22:40:53 · 2926 阅读 · 4 评论 -
Linux静态链接库与动态链接库的创建和显式与隐式调用
一、可执行程序的参数传递二、可执行程序的扩展链接库三、Linux静态链接库的创建和使用四、Linux动态链接库的创建和使用五、Linux动态链接库的显式调用原创 2019-03-11 23:26:22 · 2057 阅读 · 0 评论