
算法笔记
一些算法的总结
ityanger
大道至简,知易行难
展开
-
快速读入(出)/读入(出)优化(模板)
文章目录一、前言二、输入1.入门级的cin2.普遍的scanf3.关闭流同步的cin4.读入优化read5.读入优化fread比较三、输出1.入门级的cout2.普遍的printf3.关闭流同步的cout4.读出优化write5.数组优化比较一、前言众所周知:scanf比cin快得多,printf比cout快得多。这里的优化思想就是运用getchar(putchar)比scanf(print...原创 2019-11-26 16:17:46 · 18629 阅读 · 1 评论 -
树状数组(单点修改&&区间查询、区间修改&&单点查询、区间修改&&区间查询)
今天看了一下树状数组,个人认为树状数组是一个很优美的数据结构,虽然看的并不是很懂。。。一些简单的知识就不讲的,请自行百度。。不过还是讲一些最基础的吧。概述树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取一个区间的和?树状数组基本...原创 2019-04-27 22:30:51 · 7823 阅读 · 0 评论 -
乘法逆元小结
概述乘法逆元,一般用于求的值(p通常为质数),是解决模意义下分数数值的必要手段。当求解公式:(a/b)%p 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:设c是b的逆元,则有b*c≡1(mod p);则(a/b)%p = (a/b)*1%p = (a/b)*b*c%p = a*c(mod p);即a/b的模等于a*b的逆元的模;逆元就是这样应用的.逆元定义若,且a与p互...原创 2019-05-12 22:37:31 · 7655 阅读 · 0 评论 -
波兰式与逆波兰式的转换和表达式求值
文章目录一、前言二、表达式1.中缀表达式1.1 定义2.前缀表达式2.1 定义2.2 求值3.后缀表达式3.1 定义3.2 求值三、表达式转换1.中缀表达式转换成后缀表达式1.1 算法1.2 例子2.中缀表达式转换成前缀表达式四、END一、前言逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式...原创 2019-11-22 20:58:47 · 20418 阅读 · 2 评论 -
数据结构 - 自写链式队列
数据结构学了有一阵子了,就自己模仿C++自带的队列写了一个链队,用法和C++的差不多,不足之处请指教。#include <stdio.h>#include <stdlib.h>typedef int QElemType;//数据类型 typedef struct QNode { QElemType data; struct QNode *next...原创 2019-06-12 23:18:03 · 2409 阅读 · 0 评论 -
快速幂和矩阵快速幂详解+模板
1.快速幂一般的,我们都知道求只需要连续乘3次2就能得到,那么等于多少呢?其实这个一很简单,不就是13个2相乘吗,连续乘13次2就行了。那么,呢? 是不是要连续乘100次、1000次,我们将这类问题归结为求。那么当b很大的时候,是很浪费时间的,往往会造成超时,那有没有更快的计算方法呢?当然了,接下来就是这篇文章的重点:快速幂。我们以b=13为例,将b表示为二进制:那么:那么我们观察只要b的...原创 2019-05-12 21:22:14 · 11095 阅读 · 0 评论 -
找出数组中出现奇数次的元素(1个或2个)
1.题目:给定一个含有n个元素的整型数组arr,其中只有一个元素出现奇数次,其余的都出现偶数次,找出这个元素。思路:我们基本上都知道计算机的位运算,其中有一个异或运算:对于任意一个数k,k^k=0,k^0=k,所以我们只需要将arr中所有的元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下那个个数为奇数的那个元素。#include <stdio.h>void Find(...原创 2019-03-04 19:22:10 · 3967 阅读 · 2 评论 -
已知矩形的三个顶点坐标,求最后一个的顶点坐标(向量求法)
做car的旅行路线遇到的,先用向量法找出直角边,再利用对角线上的点横坐标之和等于中点横坐标的二倍求出。例如上面这个矩形,当已知三个点的时候,我们很容易可以用向量法求出哪个点是直角点。我们可以判断(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)是否为0,如果为0,则证明点(x1,y1)即为直角点,如果不是,我们继续判断(x2,y2),(x3,y3),这三个点肯定有一个是直角点...原创 2018-12-14 19:14:00 · 12603 阅读 · 2 评论 -
判断一个数是不是2的整数次幂(两种方法)
方法一:用这个数来除以2,得到商和余数,如果余数不为0,那这个数就不是2的整数次幂,否则再用商除以2,又得到商和余数,重复上面的操作,直到商为1,当商为1,余数为0时,这个数就是2的整数次幂当商为0。/* * @Author: lzyws739307453 * @Language: C++ */#include <iostream>using namespace ...原创 2018-12-02 19:57:49 · 11782 阅读 · 0 评论 -
求区间[1,n]之间的回文数
题目描述输入一个t, 表示有t组样例,每组样例输入一个整数n,求区间 [1,n]内有多少个回文数。解题思路按照常规的从1枚举到n再依次判断每个数是否为回文数显然是行不通的,所以我们需要用数学方法。首先考虑位数为偶数的时候,如1542,位数为4,将它对半分为15和42,则当前半部分为14的时候,后两位可以取00到99之间的任意数,所以前两位从10到14都可以找到对应的后两位(如01,...原创 2018-11-26 22:24:35 · 6270 阅读 · 0 评论 -
最小生成树算法总结
最小生成树算法总结Kruskal算法Kruskal算法是典型的最小生成树算法,用于计算将所有顶点连通的最小权值。最常见的问题就是:已知N座城市中任意两座城市之间建造道路所需要的费用,求最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达。算法核心:首先选择最短的边,然后选择次短的边……直到选择n-1条边为止。算法的时间复杂度为O(MlogM),空间复杂度为O(M)。...原创 2018-10-24 21:07:00 · 3539 阅读 · 0 评论 -
并查集算法总结
并查集算法总结并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。主要就是判断两个元素是否连通。每个集合可能包含一个或多个元素,选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是无所谓的,具体选择哪个元素作为代表一般也是无所谓的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及合并两个元素所在的集合。并查集通过一个一维数组来实现,...原创 2018-10-24 19:53:16 · 2471 阅读 · 0 评论 -
最短路算法总结
最短路算法总结Dijkstra算法Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。最常见的问题就是:给你一张地图,让你求出指定的点到其余各定点的最短路径。算法核心:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终的到源点到其余所有点的最短路径。算法的时间复杂度为O(N2),空间复杂度为O(N3)。基本步骤如下:...原创 2018-10-24 19:48:59 · 3045 阅读 · 0 评论 -
KMP算法总结
KMP算法总结KMP算法关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。KMP算法的关键在于求算next[]数组的值,即求算A串的最长后缀与B串的前缀相同的长度,具体如下:1. 令k代表B串开头所在的序号,j代表A串开头所在的序号,起始的时候j=1,k=0。...原创 2018-10-24 13:53:53 · 2472 阅读 · 0 评论 -
匈牙利算法总结
二分图:定义:如果一个图的所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好一个属于集合X,另一个属于集合Y,即每个集合内的顶点没有边相连,那么此图就是二分图。很多问题都可以转化为二分图匹配模型来计算。二分图有如下几种常见变形:(1)最小顶点覆盖选取最少的点(X或Y中都行),让每条边都至少和其中一个点关联。Knoig定理:二分图的最小顶点覆盖数等于二分图的最大匹配数。...原创 2018-10-13 18:23:13 · 4298 阅读 · 0 评论