算法
文章平均质量分 71
数学小牛马
数学专业本科在读,有奇奇怪怪的coding算法/或者其他想法的可以留言,我会积极为大家带来更多好的原创博文~
展开
-
Bellman-Ford算法cpp算法导论原理实现
Bellman-Ford算法该算法的特性是针对更广泛情况下的最短路径查询,其中边权可以为负数,并且会针对数据判断图中是否有从源节点到达负权环路的路径。方法依旧基于Class<Graph>实现,其中对少数地方做了对应修正,在带权边最短路算法中需要两个最基本的操作:初始化操作:使得除了根节点以外的节点d属性设置为∞\infty∞,前驱节点设置为空,这里的d属性表示的是该节点距离源节点的上界或标准最小值;void Graph::InitializeSingleSource(string s原创 2022-04-18 16:35:50 · 480 阅读 · 0 评论 -
[算法导论24章]单源最短路径Ⅰ
Background最短路径更多的是针对一张有向有权图G=(V,E)G=(V,E)G=(V,E),图中存在某条路径:p=<v0,v1,...,vk>p=<v_0,v_1,...,v_k>p=<v0,v1,...,vk>则其路径的权重则为点集合对应的边权之和:w(p)=∑i=1kw(vi−1,vi)w(p)=\sum_{i=1}^{k} w\left(v_{i-1}, v_{i}\right)w(p)=i=1∑kw(vi−1,vi)所以定义最短原创 2022-04-16 21:14:23 · 959 阅读 · 0 评论 -
拉格朗日插值公式与mathematica程序实现
插值多项式唯一性继续上一节中假设的多项式L(x)L(x)L(x),但此时为了便于分析定义最高次数为nnn:Ln(x)=∑j=0najxjL_n(x)=\sum_{j=0}^{n} a_{j} x^{j}Ln(x)=j=0∑najxj定理(插值多项式的唯一性):对任意n+1n+1n+1个互不相同的点集合{(xi,yi)∣i=0...n}\{(x_i,y_i)|i=0...n\}{(xi,yi)∣i=0...n}会存在唯一的次数界为n+1n+1n+1的多项式Ln(x)L_n(x)Ln(x原创 2022-04-15 19:35:10 · 2579 阅读 · 1 评论 -
算法导论:从推排序到优先队列
堆排序一般来说堆排序针对的是二叉堆,这是一种数组结构,且表达为完全二叉树的形式:完全二叉树:除最底层都是满的,且最下层节点从左到右依次排开。这样的好处是能够通过简单的代数计算获得父节点、左孩子、右孩子节点在数组结构中的编号:如此可以很简便的用代码表达为:int Parent(int i){ return i >> 1;}int Left(int i){ return i << 1;}int Right(int i){ return原创 2022-04-11 11:36:56 · 1153 阅读 · 0 评论 -
算法导论摊还分析总结Ⅰ
摊还分析摊还分析(amortized analysis):主要通过求解数据结构中一系列的操作,获得操作的平均时间评价操作的代价;不同于算法的期望,不涉及概率的另一种评价操作代价的方法;主要分为三种方法:聚合分析、核算法、势能法。首先介绍两个常规例子,之后通过例子对上述方法进行说明:例1 栈操作提供三类栈的基本操作:Push(x):将xxx压入栈中;pop():删除栈顶元素;Multipop(k):删除栈顶kkk个元素;其中假设基本操作不存在对空栈的删除操作。例2 二进制计数器原创 2022-04-04 18:58:45 · 634 阅读 · 0 评论 -
算法导论最小生成树安全边规则
最小生成树证明最小生成树(Minimum Spanning Trees)表示的问题抽象后更多的是在联通无向图G=(V,E)G=(V,E)G=(V,E)中,寻找∣V∣−1|V|-1∣V∣−1条边的集合T⊆ET\subseteq ET⊆E使得在新图GT=(V,T)G^T=(V,T)GT=(V,T)为一个联通无向图且边权之和w(T)=∑(u,v)∈Tw(u,v)w(T)=\sum_{(u, v) \in T} w(u, v)w(T)=∑(u,v)∈Tw(u,v)最小。换句话说就是寻找∣V∣−1|V|-1∣V原创 2022-04-03 23:52:41 · 1255 阅读 · 0 评论 -
python实现LU分解与LUP分解
计算机求解线性方程组Ax=bAx=bAx=b过程中,更多的是采用数值计算方法求解而取代数学意义上效率更高的求逆运算,其中一个重要的问题是数值的稳定性。上述线性方程组中AAA为nnn阶方阵,其中实际求解问题中只针对非奇异矩阵的情况下,这里首先介绍一种较为常见的LUPLUPLUP分解方式求解方法。LUPLUPLUP方法求解原理为找出满足条件的三个nnn阶方阵LUPLUPLUP使得PA=LUPA=LUPA=LU其中LLL为下三角矩阵,UUU为上三角矩阵,PPP为置换矩阵,在原方程Ax=bAx=bAx原创 2022-04-02 21:05:59 · 2242 阅读 · 0 评论 -
算法导论中循环不变式的简要应用
循环不变式的理解应用数学归纳法第一数学归纳法:验证n=1n=1n=1命题成立,假设n=kn=kn=k命题成立,证明n=k+1n=k+1n=k+1命题成立那么推得对任意正整数情况成立;第二数学归纳法:验证n=1,n=2n=1,n=2n=1,n=2命题成立,假设n<kn<kn<k命题成立,证明n=kn=kn=k命题成立那么推得对任意正整数情况成立;总体来说两类方法均采用递归演绎推理命题的方式将结论延伸到整个正整数集合中。循环不变式很多算法的正确性采用循环不变式的方法原创 2022-04-01 20:07:10 · 268 阅读 · 0 评论 -
c++算法导论原理实现拓扑排序与强连通分量并证明
拓扑排序对于有向无环图G=(V,E)G=(V,E)G=(V,E),拓扑排序的效果是将所有顶点集合进行线性排序,排序与数据的大小排序不同,拓扑排序更多的是依赖于节点间的方向关系,或者解释为是“先有鸡还是先有蛋”的故事,将蛋生鸡,鸡生蛋这种拓扑的顺序结构转变为线性结构“就是“蛋变成鸡”这种排序效果,更多的可能会应用到工程流程上或是其他领域。上述举得例子不合理因为针对有向无环图,图中存在环则意味着无法找到一个不被依赖的节点提取出来,所以”蛋变成鸡“这种线性结果是存在矛盾的。上述拓扑图是书中的例子,描述的是原创 2022-03-31 20:36:05 · 1171 阅读 · 0 评论 -
[CLRS Chapter22]基本的图算法Ⅳ(深度优先搜索后图中每条边的类型可以提供关于图的重要信息)
边的分类G(V,E)G(V,E)G(V,E)在基于深搜定义下的前驱子图GπG_\piGπ(又称深度优先森林)中定义了四种类型的边:树边均为深度优先森林的边(EπE_\piEπ);后向边为EEE中非树边且将节点连向祖先节点的边(自循环的边被认为是后向边);前向边为后向边的反向描述,连接向后代节点的边;横向边为所有其他类型的边,包含同一树中非祖先、深搜森林中连接两棵树的边等等;对应上节验证括号化定理的深搜的前驱子图可以得出,粗线描述的都为树边构成了前驱子图,标注为B为的是连接祖先的后向边,原创 2022-03-30 23:17:56 · 438 阅读 · 0 评论 -
[CLRS Chapter22]基本的图算法Ⅱ验证广搜最短路径的正确性
验证广搜最短路径的正确性首先定义最短路径δ(s,v)\delta(s,v)δ(s,v)是节点s到节点v的最短路径,若没有通路那就记为δ(s,v)=∞\delta(s,v)=\inftyδ(s,v)=∞,注意该处定义的最短路径由于是无权图所以都是单位长度。引理1. 给定有(无)向图G=(V,E)G=(V,E)G=(V,E),sss为任意节点,给定任意边(u,v)∈E(u,v)\in E(u,v)∈E会得到δ(s,v)≤δ(s,u)+1\delta(s,v)\le \delta(s,u)+1δ(s,v)≤原创 2022-03-28 21:53:16 · 493 阅读 · 0 评论 -
[CLRS Chapter22]基本的图算法Ⅰ(从算法导论原理c++实现算法)
书中在第二十二章图的基本算法中主要提到了以下几个部分:图的表示BFSDFS拓扑排序强连通分量相关算法题目的语言实现操作这里不做阐述,主要实现书中提到的伪代码实现与证明过程:图的表示对于G=(V,E)G=(V,E)G=(V,E)主要针对点集为VVV,边集为EEE的有向图和无向图,其中两种标准的方法是邻接链表和邻接矩阵:邻接矩阵可以看作是空间复杂度为O(V×V)O(V\times V)O(V×V)的01矩阵,当边带权重时则矩阵内部的信息会出现边权取代01值;邻接链表通过链表方式记录每原创 2022-03-27 22:00:40 · 1365 阅读 · 0 评论 -
[主定理证明]递归算法时间复杂度怎么算?
文章目录分治算法递归式主定理方法定理描述:证明主定理nnn为bbb的幂次向上向下取整增加常数规模重现三种情况情况3的弱条件分治算法分治算法强调递归的求解一个问题,每个递归都有三个步骤:分解:将问题分解为子问题,子问题规模<<<原问题规模;解决:解决递归最底层无法分解的子问题;合并:将已解决的最小问题递归至上一层直至到根节点。递归式递归式是描述分治算法的一个等式或不等式,例如归并排序递归式为:T(n)={Θ(1)n=12T(n2)+Θ(n)n>1T(n)=\le.原创 2022-03-22 21:00:16 · 1133 阅读 · 0 评论 -
c++模板元实现二叉搜索树
文章目录二叉搜索树定义节点性质以及创建BST对象插入节点前中后序遍历查找操作最小值最大值后继前驱删除节点欢迎关注公众号二叉搜索树二叉搜索树(Binary Search Trees,BST)是一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势,所以应用十分广泛。涉及本文的全部代码与实例已全部上传至Github。定义节点每一个节点就是一个对象,其中主要包含键值、左右孩子指针和父亲指针,更泛泛地说还可以包含其他数据对象。所以首先定义节点结构:template <t原创 2022-03-21 02:13:14 · 1568 阅读 · 0 评论 -
Codeforces Round #762 (Div. 3)(A~C,E)
文章目录题目链接A Square String?B Squares and CubesC Wrong AdditionE MEX and Increments有能力再继续补题目链接补题挖坑A Square String?判断拆两半是不是一样,奇数直接NO,偶数从中间分开判断一下#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include原创 2021-12-21 01:18:55 · 894 阅读 · 0 评论 -
leetcode 419甲板上的战舰
leetcode扫描一遍如果左边或者上边有X则不加,反之则加,注意边界判断class Solution {public: int countBattleships(vector<vector<char>>& board) { int num = 0; for(int i = 0; i < board.size(); ++i) { for(int j = 0; j < board原创 2021-12-19 23:21:12 · 187 阅读 · 0 评论 -
codeforces EDU round#119 div2(A~C, E)
文章目录题目链接ABC有能力再继续补E题目链接补题挖坑A今天的代码都比较难看,稍作改正,第一题可以得到只有一个N的情况不合法,其余都合法#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;typedef long l原创 2021-12-19 01:53:01 · 120 阅读 · 0 评论 -
codeforces round#760 div3(A~E)
文章目录题目链接ABCDE有能力再继续补题目链接补题挖坑A看样例猜数据,最小最大肯定有,然后那就再用最大减最小拿出来一共三个数字#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;typedef long long原创 2021-12-15 01:33:16 · 463 阅读 · 0 评论 -
Educational Codeforces Round 118 (Rated for Div. 2)ABC+半个E
文章目录题目链接ABCE有能力再继续补题目链接补题挖坑A码风淳朴勿喷呜呜,找位数关系,总位数大的就大,相等的凑到前面两个数相等然后继续比#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;typedef long l原创 2021-12-02 02:35:12 · 215 阅读 · 0 评论 -
Deltix Round, Autumn 2021 (Div. 1 + Div. 2)
文章目录题目链接ABCDE有能力再继续补题目链接补题挖坑A凡是有2的因子的全提出来,之后排序乘给最大的奇数#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;typedef long long ll;ll t, n原创 2021-11-29 01:39:48 · 310 阅读 · 0 评论 -
codeforces round#756 div3
文章目录题目链接ABCD有能力再继续补题目链接补题挖坑A绝对值记录,map方便就直接搞了#include <iostream>#include<algorithm>#include <vector>using namespace std;int t, n;int main(){ cin>>t; while(t--) { cin >> n; vector<int&g原创 2021-11-03 00:59:57 · 187 阅读 · 3 评论 -
python实现单纯形法迭代形式(待更新人工法+对偶)
输入格式与matlab的linprog公式类似链接,之前还写过这个已经忘了,可以参考,但是这个的写法要求不等式必须是≤,有需求可以自己变通单纯形法的迭代公式建议看厦大运筹学之规划论剩下的实现和原理之后再写,这个确实挺好用的????我把例子找了三个朴素的例子做了实现,结果还可以import numpy as npdef LinearProgram(f, A, b, Aeq=-1, beq=-1): """ 传入matlab样式参数,通过判断选择单纯形法,选择性添加人工法,对偶问题原创 2021-10-21 21:04:56 · 654 阅读 · 0 评论 -
Codeforces Round #728 (Div. 2)【ABC】
文章目录A.Pretty PermutationsB.Pleasant PairsC. Great GraphsA.Pretty Permutations构造,处理奇数前三个顺序1,2,3->3,1,2然后搞,反思一下自己把最后一个搬在第一个FastFastWA着急了代码比较丑但是能看懂凑合看/* * @Descripttion: * @Author: ssw * @Date: 2021-05-30 04:49:52 * @LastEditors: ssw * @LastEdit原创 2021-06-26 02:24:49 · 454 阅读 · 0 评论 -
自动微分前置知识学习(1)sympy
语雀更新地址挖坑原创 2021-06-08 02:12:28 · 136 阅读 · 0 评论 -
[每日一题]连续数组和(前缀和+哈希)
题目地址:力扣题目描述::给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。示例 1:输入:nums = [23,2,4,6,7], k = 6输出:true解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。原创 2021-06-02 02:31:43 · 247 阅读 · 0 评论 -
[每日一题]吃糖果(前缀和+区间)
题目地址:力扣题目表述给你一个下标从 0 开始的正整数数组 candiesCount ,其中 candiesCount[i] 表示你拥有的第 i 类糖果的数目。同时给你一个二维数组 queries ,其中 queries[i] = [favoriteTypei, favoriteDayi, dailyCapi] 。你按照如下规则进行一场游戏:你从第 0 天开始吃糖果。你在吃完 所有 第 i - 1 类糖果之前,不能 吃任何一颗第 i 类糖果。在吃完所有糖果之前,你必须每天 至少 吃 一颗 糖原创 2021-06-01 17:44:25 · 294 阅读 · 0 评论 -
[每日一题]最长回文子串(动态规划实现)
题目地址:力扣题目描述::给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring原创 2021-06-01 13:51:52 · 102 阅读 · 0 评论 -
并行MPI计算三维nbody问题
介绍::生成数据,迭代计算,输出数据均可调参数MPI::{暂时空缺}并行MPI还是有些不理解的地方稍后会补上:代码::/* * @Descripttion: * @Author: ssw * @Date: 2021-05-30 16:26:58 * @LastEditors: ssw * @LastEditTime: 2021-05-31 20:36:19 * * 粒子个数 n * 时间间隔 delta_time = 1/timestep * 运行时长 cycle_time原创 2021-06-01 12:51:04 · 443 阅读 · 0 评论 -
O(n)时间寻找中位数(未完全完成待续)
先放代码,有时间详细写原理,代码在递归查找的时候还有些问题,挖坑ing/* * @Descripttion: * @Author: ssw * @Date: 2021-05-30 02:21:22 * @LastEditors: ssw * @LastEditTime: 2021-06-01 12:44:39 */#include <iostream>#include <algorithm>#include <ctime>#include <原创 2021-06-01 12:45:14 · 202 阅读 · 0 评论 -
tir树学习洛谷P2580
#mermaid-svg-oCaRty5zVktVUekk .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-oCaRty5zVktVUekk .label text{fill:#333}#mermaid-svg-oCaRty5zVktVUekk .node rect,#mermaid-svg-oCaRty5zVk原创 2021-01-16 00:50:57 · 219 阅读 · 0 评论 -
博弈论初步(巴什博弈)
文章目录巴什博弈巴什博弈一堆物品为n,轮流取,最大m最小为1n=k(1+m)+rn = k(1+m)+rn=k(1+m)+r,当n%(m+1)=0n\%(m+1)=0n%(m+1)=0先手必输总数为(1+m)*k1个,A方拿到x个,B方要拿走(m+1-x)个,这一回合总共拿到了m+1个又一次进行最后都是B方最后拿完直到结束先手必输HDU4764l类比操作#include <bits/stdc++.h>#define ll long longusing namespace原创 2020-09-22 21:20:19 · 540 阅读 · 1 评论 -
牛客每日一题(1)NC50439(堆优化)
文章目录题面思路priority_queue小根堆使用代码题面一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。但是这些士兵有特殊的要求:如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。)tokitsukaze想知道,团的战力最大为多少。链接https://ac.nowcoder.com/acm/problem/50439来源:牛客网输入描述:第一行包原创 2020-08-27 02:17:37 · 150 阅读 · 0 评论 -
学习二叉树三序遍历笔记
二叉树前中后序遍历二叉树相关问题二叉树:每个节点做多含有两个子树的树满二叉树:最后一层无任何子节点,剩下每一层都有两个子节点#mermaid-svg-UxmThJfiKu3g7Llb .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-UxmThJfiKu3g7Llb .label text{fill:#原创 2020-08-16 01:24:49 · 254 阅读 · 2 评论 -
2020杭电第五场Tetrahedron(数学推导+期望(打表)+逆元)
Tetrahedron题目大意:四面体,三个面是直角三角形,三条直角边随机处于[1,n]区间,求解直角顶点到地面距离的期望,最终分数用逆元表达原创 2020-08-14 16:02:37 · 148 阅读 · 0 评论 -
2/3维向量叉乘意义&&判断二维平面点的相对位置&&向量法证明海伦公式
向量叉乘a=(x1,y1)b=(x2,y2)a=(x_1,y_1)\quad b=(x_2,y_2)a=(x1,y1)b=(x2,y2)点乘:a→⋅b→\overrightarrow{a}·\overrightarrow{b}a⋅b得到实数,属于向量之间的标量运算叉乘:a→×b→\overrightarrow{a}\times\overrightarrow{b}a×b二维叉乘的数值概念为以两个向量为边所围成的平行四边形面积集合概念为a→与b→\overrightarrow{a}与\ov原创 2020-08-14 15:11:40 · 2454 阅读 · 0 评论 -
2020杭电第六场Divisibility(数学推导思维)
Divisibility多组数据,给b和x两个数字定义:b进制下的任意数字Y中只要是各个位数加起来的和的结果可以整除x,那么那个数字就可以整除x类似证明可得提取之后得出结论前提(b−1)%x=0(b-1) \%x=0(b−1)%x=0#include<bits/stdc++.h>using namespace std;long long n,b,x;int main(){ scanf("%lld",&n); while(n--){ s原创 2020-08-06 16:20:46 · 265 阅读 · 2 评论 -
Selfish Grazing贪心_stl
基础-贪心题目要求,给n对整数对存在于数轴上不可重叠,寻找存在最多的整合对数贪心操作,对整数对的后一个数排序v[i-1].second<=v[i].first才可以进行cnt++操作#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<map>using namespace std;int N,cnt,flag;ve原创 2020-08-06 11:38:01 · 98 阅读 · 0 评论 -
Subsequence尺取法基础练习
基础训练尺取法长度为N的序列,找一个最小连续序列使其之和>=S双指针做法(尺取进行sum加和操作,当达到目标的时候前指针向后移,以此类推遍历序列时间复杂度O(N)#include<algorithm>#include<cstdio>#include<iostream>using namespace std;const int maxn = 1e5+10;int t,n,s,S[maxn],sum,cnt=maxn;int main(){原创 2020-08-06 11:11:28 · 159 阅读 · 0 评论 -
2020牛客多校第一场F题 Infinite String Comparision(字符匹配+神奇的周期引理)
牛客多校第一场F题Infinite String Comparision由犇犇PPT得到周期性引理:匹配长度应等于a+b-gcd(a,b)然后除了引理不咋理解但是纸上画画觉得还有点道理就先这样,等到见到了在做学习代码就成了:#include<iostream>using namespace std;string a,b;int len,f;int gcd(int x,int y){ return x%y?gcd(y,x%y):y;}int main(){ while(c原创 2020-07-12 23:23:56 · 489 阅读 · 2 评论 -
2020牛客多校第一场J题[Easy Integration(逆元+数学推导打表)
牛客多校第一场J题 Easy Integration先解决数学问题解积分表达式,听说这是高数题目,(水平还需要提高,这种式子算起来还是不算太难的,但是当时死活不知道咋求,放假放傻了…高中爷orz∫01xn(1−x)ndx=1n+1∫01(1−x)ndxn+1=1n+1xn+1(1−x)n−nn+1∫01xn+1(1−x)n−1(−1)dx∵前一项积分上下限01均等于0所以可省略,经过n次约简得到=n!(n+1)(n+2)×(2n−1)(2n)∫01x2ndx=n!2(2n+1)!\begin{ali原创 2020-07-12 22:53:29 · 312 阅读 · 1 评论