![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 86
h0l10w
这个作者很懒,什么都没留下…
展开
-
扩展欧几里得求逆元
若a和n互素,a∗x≡1modn上面这个式子中的x就被称为a关于n的逆元。原创 2023-07-04 14:56:12 · 132 阅读 · 0 评论 -
快速幂算法
考虑如下问题:计算a的b次方当然这个结果可能会很大,哪怕是long long类型也存不下。所以我们对计算结果做一个约束,比如说后3位,即求a的b次方的后3位。其中,mod是模数,可以根据需求取后几位。显然,这个方法的时间复杂度为Ob。当b很大的时候这个算法的性能就略显不足了。原创 2023-06-27 17:14:08 · 367 阅读 · 0 评论 -
KMP算法
概述KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为子串),如果它在一个主串中出现,就返回它的具体位置,否则返回-1(常用手段)。首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将子串向右移动一位。这种方法也叫朴素的原创 2023-06-20 20:13:48 · 100 阅读 · 0 评论 -
Pollard’s rho算法
给定一正整数N∈N∗,试快速找到它的一个因数。很久很久以前,我们曾学过试除法来解决这个问题。很容易想到因数是成对称分布的:即N1N和NN。这个很容易想清楚,我们只需要把区间1N扫一遍就可以了,此时试除法的时间复杂度为ON。对于N≥1018的数据,这个算法运行起来无疑是非常糟糕的。我们希望有更快的算法。对于这样的算法,一个比较好的想法是去设计一个随机程序,随便猜一个因数。如果你运气好,这个程序的时间复杂度下限为O1。但对于一个N≥10。原创 2023-06-09 00:03:03 · 533 阅读 · 0 评论 -
大步小步法
大步小步算法(baby step giant step,BSGS),是一种用来求解离散对数(即模意义下对数)的算法,即给出ax≡bmodm中abm的值(这里保证a和m互质),求解x。实际上,大步小步算法就是对暴力枚举的一个简单的改进,使用了类似的思想。我们把x拆成At−B,拆分成这种形式是为了后面移项后指数上能是正的,然后原式就可以化为aAt−B≡bmodm,即aAt≡baBmodm。对于这个式子,如果我们固定一个t值的话,随着B。原创 2023-06-02 22:19:05 · 823 阅读 · 0 评论 -
Dijkstra算法
最短路径问题:任给一个简单带权图 G=<V,E,W>及 u,v属于V,求 u,v之间的最短路径及距离。下面介绍最短路径问题的一个有效算法,它是 E. W. Dijkstra 于 1959 年给出的。Dijkstra算法适用于所有边的权大于等于 0 的情况,它可以求从给定的一个顶点到其余所有顶点的最短路径及距离。设G=<V,E,W>,V={v1,v2,…,vn},求从 v1 到其余各顶点的最短路径和距离。Dijkstra 算法是一种标号法,每一个顶点有一个标号,标号分永久标号和临时标原创 2022-04-04 22:09:50 · 1926 阅读 · 0 评论 -
关键路径算法
概述1956年,美国杜邦公司提出关键路径法,并于1957年首先用于1000万美元化工厂建设,工期比原计划缩短了4个月。杜邦公司在采用关键路径法的一年中,节省了100万美元。在项目管理中,关键路径是指网络终端元素的元素的序列,该序列具有最长的总工期并决定了整个项目的最短完成时间。关键路径的工期决定了整个项目的工期。任何关键路径上的终端元素的延迟将直接影响项目的预期完成时间(例如在关键路径上没有浮动时间)。AOE网AOE网(Activity On Edge)即边表示活动的网,是与AOV网(顶点表示活动)原创 2022-03-21 22:47:31 · 3439 阅读 · 2 评论 -
Prim算法
概述最小生成树(Minimum Spanning Tree,MST)在一给定的无向图G = ( V , E ) 中,<u, v>代表连接顶点u 与顶点v 的边,而 w(u, v)代表此边的权重,若存在 T 为 E 的子集且为无循环图,使得 w(T) 最小,则此 T 为 G 的最小生成树,因为T是由图G产生的。其中,w(T)=∑(u,v)∈Tw(u,v)w(T)=\sum_{(u,v)\in T}^{} w(u,v)w(T)=(u,v)∈T∑w(u,v)最小生成树其实是最小权重生成树原创 2022-02-17 10:36:34 · 618 阅读 · 0 评论 -
多重背包及其优化
问题描述有n种物品,它们有各自的体积,价值和一定的数量。现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?算法思想在解决问题之前,为描述方便,首先定义一些变量:vi表示第 i 种物品的价值,wi表示第 i 种物品的体积或重量,si表示第i种物品的数量。定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值。多重背包问题其实可以转换为01背包来解决,那么如何转换呢?有一种朴素思想:对于同一种物品,如果我们把不同数量的该物品看作一个新品种,那么这种物品不就化成了很多个新品种但每原创 2022-02-12 12:00:00 · 641 阅读 · 0 评论 -
完全背包及其优化
问题描述有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的费用是wi,价值是vi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。算法思想朴素思想完全背包与01背包不同的是同一种物品可多次选取。有了01背包的基础,再来理解完全背包就很容易了。先回顾一下01背包的状态转移方程:j<w(i) V(i,j)=V(i-1,j)j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+原创 2022-02-08 12:00:00 · 1403 阅读 · 0 评论 -
01背包及其优化
引入总体思路此类问题一般是寻找最优解,但由于最终的最优解取决于前面一系列的决策,局部最优不一定能导出整体最优,所以贪心的思想对此种问题束手无策。所以需要从最简单的小问题开始,逐步扩展,最终扩展到我们需要的地方为止。这里的扩展就是决策,就是状态转移。根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出问题的最优解以及解组成,然后编写代码实现。动态规划的原理动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与原创 2022-01-22 11:13:03 · 2248 阅读 · 1 评论 -
Kruskal算法
Kruskal算法需要用到并查集的知识,如果不了解并查集,可以先看我的另一篇博客:[并查集及其实现_m0_51507437的博客-CSDN博客]Kruskal算法从边的角度求带权图的最小生成树,时间复杂度为O(eloge)。和Prim算法恰恰相反,Kruskal算法更适合于求边稀疏的带权图的最小生成树。先来看几个概念:带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。最小生成树(MST):权值最小的生成树。最小生成树的性质:假设G=(V,E)是一原创 2022-01-11 09:08:29 · 752 阅读 · 0 评论 -
并查集及其实现
概述定义:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。主要构成:并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。数组 pre[ ] 记录了每个点的前驱节点是谁,函数 find(x) 用于查找指定节点 x 属于哪个集合,函数 join(x,y) 用于合并两个节点 x 和 y 。作用:并查集的主要作用是求连通分支数。如果一个图中所有点都存在可达关系原创 2022-01-05 14:20:25 · 1203 阅读 · 0 评论 -
Huffman算法
概述在计算机数据处理中,哈夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节,即8个比特。二原创 2022-01-05 14:15:26 · 1493 阅读 · 0 评论 -
常用排序算法实现
冒泡排序#include<iostream>using namespace std;void BubbleSortAsc(double num[],int length){ bool exchange=true; for(int i=0;i<length-1;i++) { for(int j=0;j<length-1-i;j++) { if(num[j]>num[j+1])原创 2021-12-14 22:47:32 · 106 阅读 · 0 评论 -
基于C++和Python的Dijkstra算法实现及其堆优化
本文从邻接矩阵入手,对Dijkstra算法进行了初步的实现,然后通过堆和链式前向星实现了一定的优化原创 2021-12-14 22:38:26 · 2109 阅读 · 1 评论