算法笔记
文章平均质量分 62
本专栏为个人总结的算法中的一些个人见解,欢迎请教讨论和指正批评。
A Dream er
这个作者很懒,什么都没留下…
展开
-
STL_字符串_【string】
一、string对象的定义,初始化及读写string s1;//默认构造函数,s1为空串string s2(s1);//将s2初始化为s1的副本string s1('wuyang');//将s1初始化为一个字符串面值副本string s1(n,'w');//将s1初始化为'w'的n个副本cin>>s1;//读取有效字符,遇到空格结束getline(cin,s1);//...转载 2018-03-19 17:22:20 · 609 阅读 · 0 评论 -
STL_排序_【sort】
排序可以将容器中的值按照某种规则进行排序,同时可以进行结构体排序 对于普通的数组排序这里不再展开讲,我们根据一道题讲解:天梯赛练习题:L2-009. 抢红包下面就通过简单易懂的代码对其讲解#include<bits/stdc++.h>using namespace std;const int maxn = 1e4 +10;int a[maxn] = {0...原创 2018-03-19 17:15:40 · 328 阅读 · 0 评论 -
STL_队列_【queue、priority_queue】
队列,使用时需要加头文件queue。特点先进先出。 成员函数有: q.front();返回队首元素 注意:优先队列为q.top(); q.back();返回队尾元素 q.push ();压入队列元素 q.pop();弹出队列元素 q.size();返回队列的大小,即栈中有多少个元素 q.empty();判断队列是否为空 队列的应用:广搜等...原创 2018-03-19 17:10:37 · 393 阅读 · 0 评论 -
STL_栈_【stack】
栈,使用时需要加头文件statck。特点:栈中的数据是后进先出。 成员函数: s.top();返回栈顶元素 s.push();压栈 s.pop();出栈 s.size();返回栈的大小,即栈中有多少个元素 s.empty();判断栈是否为空下面就通过简单易懂的代码对其讲解///括号匹配问题#include <iostream>...原创 2018-03-19 17:07:13 · 303 阅读 · 0 评论 -
STL_集合_【set】
顾名思义,就是数学上的集合——每个元素最多只出现一次, 并且set中的元素已经从小到大排好序。使用时需要加头文件set。下面就通过简单易懂的代码对其讲解#include <iostream>#include <set>using namespace std;struct Info{ string name; double s...原创 2018-03-19 17:01:38 · 356 阅读 · 0 评论 -
STL_映射_【map】
map是STL的一个关联容器,它提供一对一的数据处理能力。(其中第一个可以称为关键字, 每个关键字只能在map中出现一次,第二个可以称为该关键字的值) 比方说 字典, 统计单词下面就通过简单易懂的代码对其讲解#include <iostream>#include <map>using namespace std;//构造方法 int c...原创 2018-03-19 16:58:23 · 384 阅读 · 0 评论 -
STL_动态数组_【vector】
动态数组,使用时需要加头文件vector。 它的特点可以实现动态增长的数组。也就是说我们不必关心该数组事先定义的容量是多少,它的大小会动态增长。 与数组类似的是,我们可以在末尾进行元素的添加和删除, 也可以进行元素值的随机访问和修改。下面就通过简单易懂的代码对其讲解#include <iostream>#include <vector>...原创 2018-03-19 16:55:07 · 395 阅读 · 0 评论 -
STL_二分_【binary_search、upper_bound、lower_bound】
关于STL中的二分查找 (1)STL中关于二分查找的函数有三个:lower_bound 、upper_bound 、binary_search —— 这三个函数都运用于有序区间(当然这也是运用二分查找的前提) (2)ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val) 算法返回一个...原创 2018-03-19 16:37:15 · 371 阅读 · 1 评论 -
数组使用负数下标
在刷题的过程中,很多时候都用到区间[- maxn, maxn]。但我们知道常规的数组的下标都是从0开始的并没有负数,这时候,要么开一个二维数组,要么就是开一个[0, 2 * maxn]的数组。 下面的方法就可以解决负数作为下标的问题。代码部分# include <bits/stdc++.h>using namespace std;const int maxn = 1e6;///先声明数组i原创 2017-08-23 09:38:23 · 9255 阅读 · 2 评论 -
STL之bitset位集合
首先是需要头文件的#include bitset是C++语言的一个类库,用来方便地管理一系列的bit位。有些程序要处理二进制位的有序集,每个位可能包含的是0(假)或1(真)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。bitset的操作 函数 作用 b.any() b中是否存在值为1的二进制位? b.none() b中不存在值为1的二进制位吗?原创 2017-08-12 16:59:57 · 590 阅读 · 0 评论 -
STL之deque双向队列
简单介绍deque双向队列是一种双向开口的连续性空间,可以高效的在头尾两段插入和删除元素代码讲解用法#include <iostream>#include <deque>using namespace std;int main(){ deque<int> ideq;//声明一个int 类型的双向队列 deque<int>::iterator pos;//双向队列的迭代器原创 2017-08-10 08:15:37 · 490 阅读 · 0 评论 -
位运算操作详解
首先先声明原文链接:MoreWindows Blog在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。 在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。位运算的基础操作基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算原创 2017-08-09 11:30:46 · 508 阅读 · 0 评论 -
读入外挂 std::ios::sync_with_stdio(false);
在此郑重说明,这是水的一篇博客,哈哈哈哈哈。读入外挂当遇到坑的题scanf都过不了的时候就用这个,不过这样的情况一般都是代码效率问题。#include <bits/stdc++.h>using namespace std;inline int Scan() //inline为内联函数,目的是预处理,可减少时间{ int res = 0, ch, flag = 0; if((ch原创 2017-08-09 11:13:27 · 4588 阅读 · 0 评论 -
C++之inline内联函数
inline内置函数又叫内联函数。简单介绍使用的时候在函数前加上inline,该函数就被生命为内置函数。每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句之处,而不是将流程转出去,同时用实参代替形参,以便在程序运行时不再进行函数调用。引用目的引入内置函数的目的就是:消除调用时系统的开销,以提高运行的速度,减少对CPU的中端次数。详细内容我们知道,在程序执行过程中调用转载 2017-08-09 11:10:36 · 279 阅读 · 0 评论 -
STL之binary_search
真的发现c++ 提供了一系列便利的东西。提供了各种各样的容器不说,还提供了很多高效便利的操作。这次要讲述的就是STL中的二分查找函数。简单介绍大家都知道,二分查找是在排序后的基础上来对其进行查找操作。所以在使用binary_search的时候,需要对将要查找的容器进行排序。详细介绍这里说明两种,一种是对结构体二分操作,一种是对数组进行二分操作,在操作之前,肯定是需要对结构体进行排序,如何排序,这里就原创 2017-08-09 11:01:04 · 817 阅读 · 0 评论 -
动态规划学习【一】
动态规划思想一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种原创 2017-04-26 20:18:26 · 273 阅读 · 0 评论 -
字符流(stringstream|sscanf|sprintf)
stringstream:顾名思义,字符串的流入流出。举例分析:#include #include #include using namespace std;int main(){ string s1,s2; getline(cin,s1);//读取字符直至遇到换行(可以读取空格) stringstream s(s1);//注意使用的时候需要加头文件原创 2017-04-06 20:03:31 · 1025 阅读 · 0 评论 -
大数(高精度)问题 【一】
处理大数问题为什么用字符串数组接收数据又转存到整型数组? 整型数组接收单个数字是以空格或者回车作为结束符,大整数的输入过程是没有空格或回车的。 字符串数组实际存储的是一个字符对应的Ascll码值,9+8其实是9对应的Ascll码和8对应的Ascll码相加得到新的Ascll码,结果肯定不是17,因为Ascll码表中只有0~9。为什么要倒叙转存进整型数组? 要留足进位空间。假如是正序存原创 2017-03-04 17:33:11 · 1213 阅读 · 2 评论 -
同余定理【数论】
同余定理是数论中的重要概念。给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。同余符号两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对模m同余或a同余于b模m。记作a≡b(mod m)【定义】 设m是大于1的正整数,a、b是整数,如果m|(a-b),则称a与b关于模m同余,记作a≡b(mo原创 2017-08-19 10:49:22 · 33616 阅读 · 7 评论 -
欧几里得算法详解
欧几里得算法欧几里得的辗转相除法计算的是两个自然数a和b的最大公约数g,意思是能够同时整除a和b的自然数中最大的一个。两个数的最大公约数通常写成gcd(a, b),如果有gcd(a, b)==1,则有a,b互质。环论定义在数学中,尤其是高等数学的环论中,最大公约数有一个更加巧妙的定义:a和b的最大公约数g是a和b的线性和中(绝对值)最小的一个,即所有形如ua + vb(其中u和v是整数,并且u,v都原创 2017-08-09 11:24:10 · 3558 阅读 · 0 评论 -
二分图的基础定义
二分图又称作二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G是一个二分图。定义 简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。辨析区分二分原创 2017-08-09 11:33:29 · 15667 阅读 · 0 评论 -
莫比乌斯详细介绍
莫比乌斯反演莫比乌斯反演是数论数学中很重要的内容,可以用于解决很多组合数学的问题。莫比乌斯函数莫比乌斯函数,数论函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯首先使用μ(n)作为莫比乌斯函数的记号。莫比乌斯函数是指以下的函数:在这里,λ(n)是刘维尔函数莫比乌斯函数是一个数论函数,它同时也是一个积极函数(μ(ab) =μ(a)μ(b), a,b互质 )当n不等于1时,n的所有因子的莫比乌斯函数值的原创 2017-08-09 11:28:22 · 5847 阅读 · 1 评论 -
学习ACM的系统大纲 【技能树】
今天听了知乎大佬SimonS的一个Live:如何快速攻克传统算法和数据结构? Live链接 欢迎大家支持里面有很多受益匪浅的地方,在这里和大家分享一下。 学习算法是否有必要参加ACM算法编程竞赛? 这里给出的答案是一定有必要,不论专科还是本科,无论你在算法方面是否真的有所建树,都建议参加。其中主讲人提到:ACM是未来就业的金牌敲门砖,可想这比赛的含金量是真的高。除此之外,ACM...原创 2018-04-09 08:52:09 · 3415 阅读 · 0 评论 -
C++_STL基础易学教程_【ORZ式教学】
在讲STL之前,首先来引入C plus plus (c++)浅谈c++的优点:1.输入输出流:输入输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型并根据其类型选择调用与之匹配的运算符重载函数。这个过程都是自动的,用户不必干预。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应的输出格式符,十分麻烦,而且容易出错。 2.变量的定义可以在for循环里...原创 2018-03-19 17:41:12 · 844 阅读 · 0 评论 -
乘法逆元数论篇【ORZ式教学】
引入篇乘法逆元较多用于求解除法取模问题 例如:(a/b)%m时,可以将其转换为(a%(b×m))/b,但这样求解的过程依然涉及到除法,所以我们应当避免除法的直接计算。这时候就需要用到我们要讲的乘法逆元。 可以使用逆元将除法转换为乘法:假设b存在乘法逆元,即与m互质(充要条件)。 设c是b的逆元,即 b×c≡1(mod m) 那么有 a/b=(a/b)×1=(a/b)×b×c=a×c(m原创 2017-08-19 10:28:03 · 1301 阅读 · 0 评论 -
邻接链表的构建详解【头插法&&尾插法】
这里要讲的邻接链表的构建是在练习ACM中的从常见的存储方式,方便图的存储与构建,并非是数据结构书中的那么复杂,但思想都是相同的。 大家都知道,临界链表的构建有两种,一种是头插法,一种是尾插法。尾插法会更容易理解。所以先讲下较难理解头插法。头插法头插法是用结构体数组来实现的。 具体的思路是:在建立邻接表时,记录的不是点而是边,对于每一个点所对应的邻接表都是以栈的形式存储的,也就是说先添加的边在遍历原创 2017-08-09 11:19:55 · 9598 阅读 · 3 评论 -
字典树详解和应用【ORZ式教学】
Trie的简介Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。Trie树的特性根节点不包含字符,除根节点外每一个节点都原创 2017-08-11 20:43:18 · 1324 阅读 · 0 评论 -
KMP算法详解【ORZ式教学】
引入篇KMP算法又称“看毛片”算法[/捂脸],是一个效率非常高的字符串匹配算法;是一种在线性时间内能处理两个字符串的包含关系的算法。那有没有效率更高的呢?当然是有的,就是Boyer-Moore算法。这里就只讲述一下KMP。 举例说明该算法的核心:求一个字符串里有没有另一个字符串返回其下标;一个字符串里有几个另一个字符串。 问A中是否存在B: A=”abcaabababaa” B=”ab原创 2017-08-18 19:27:47 · 2483 阅读 · 2 评论 -
并查集详解【ORZ式教学】
并查集的概念并查集(Union-find Sets)非常精巧而实用,本身不具备结构,借助一定的数据结构以得到支持和实现,他主要用于处理一些不相交集合的合并问题。 举个简单的例子:想必大家都听说过七大姑八大姨九大娘十大爷吧,那么问题来了,给你一个群体的人,他们之间存在有数对亲属关系,给定一对人判断他们之间是否存在亲属关系(近亲、远房亲戚、七大姑八大姨都可以啦~)。PS:关系只能是年幼的指向年长...原创 2018-03-24 21:07:42 · 555 阅读 · 0 评论 -
背包九讲【ORZ式教学】
背包问题P01: 01背包问题1.1 问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。1.2 基本思路在不超过背包容量的情况下,最多能获得多少价值 子问题状态:f[j]:表示前i件物品放入容量为j的背包得到的最大价值 状态转移方程:f[j] = max{f[j],f[j - weigh...原创 2017-12-06 11:22:09 · 971 阅读 · 0 评论