算法

hdu 3068 最长回文 manacher算法(视频)

五迷三道 提交于 2020-02-01 12:19:24
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接: 戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大。 manacher算法把所有的回文都变成了奇数形式的,所以判断的时候就很方便了,并且p[i]数组存的是: 以第i个为中心,他的回文半径是多少。 这算法其中还有id和mx,mx是对于一个位置id回文串最长半径是mx。2*id-i是以id为中心关于i对称的那个位置,mx-i是回文串半径长度。 还有qsc推荐的题 POJ 1159 Palindrome HDU 3068 最长回文 POJ 3974 Palindrome HYSBZ 2342 双倍回文 HYSBZ 2565 最长双回文串 代码: #include <bits/stdc++.h> using namespace std; const int maxn = 3e5; char s[maxn],str[maxn]; int len1,len2,p[maxn],ans; void init() { str[0]='$'; str[1]='#'; for (int i=0;i<len1;i++) { str[i*2+2]=s[i]; str[i*2+3]='#'; } len2=len1*2+2; str[len2]='*'; } void manacher() {

阅读笔记(六)共识算法2PC

情到浓时终转凉″ 提交于 2020-02-01 11:51:44
一. 前言   本文记录2pc算法的一些论文、博客的精华内容。 二. 共识算法   根据 CAP理论 ,当网络发生分隔的时候,如果保持高可用性,则会损失一致性;反之亦然。为了实现一致性或者最终一致性,必须要实现分隔后可能不同的数据同步,我们称之为共识算法。共识算法主要应用场景包括: 决定是否提交操作存入数据库 同步时钟 是否同意进入分布式算法下一阶段(常用于复制状态机中) 选举领导者节点用于更高层的协议处理   对于一个共识算法,最重要的是以下三个特性: 达成承诺(Agreement):所有的节点会保持一个相同的值 有效性(Validity):决定采取的值必须是由某个节点提出的 终结性(Termination):所有节点均会做出决定 二. 2PC(Two-Phase Commit)   2PC(Two-Phase Commit), 即二阶段提交,是一种最简单的共识算法,也非常易于理解。主要包括以下两阶段: 组织者向所有参与者建立连接,并给出一个建议的值并收集他们的回复 如果所有人同意,则再次和所有参与者沟通并让他们知道。否则告诉所有参与者取消该共识。   下图所示为二阶段的1,2阶段示意图   考虑到组织者也可能会是出问题的那个节点,因此很多时候我们需要采用哨兵模式,增加一个观察节点,当组织者出问题时代替进行共识算法的通信。 四. 参考文献 【1】https://www.the

路由表生成算法

倖福魔咒の 提交于 2020-02-01 10:35:33
一:几个概念 1:路由器: 是连接因特网中的个局域网,广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号. 路由器又称网关设备是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网,当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成.因此,路由器具有潘丹网络地址和选择IP路径的功能,它能在多个网络互联的环境中,简历灵活的连接,可用完全不同的数据分组和介质访问方法连接各种网络,路由器只接受受源站或其他路由器的信息,属于网络层的互联设备. 2:路由表 是指路由器或者其他互联网的网络设备上存储的一张信息表, 该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。 lLinux下查看路由设备 Destination:是目的网络地址 Genmask:是子网掩码 Gateway:是下一条地址 Iface是发送接口 Flags中的U标志表示此条目有效,G标志表示此条目的下一条地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由转发,因此下一条地址地址处记为*号. 如果发送数据包的目的地址是192.168.0.0根第一韩的子网掩码做与运算得到192.168.0.0与第一行的目的网络地址相符.因此从etho接口发送出去,

tcp拥塞控制(摘自维基百科)

我的梦境 提交于 2020-02-01 03:19:13
TCP使用多种拥塞控制策略来避免雪崩式拥塞。TCP会为每条连接维护一个“拥塞窗口”来限制可能在端对端间传输的未确认分组总数量。这类似TCP流量控制机制中使用的滑动窗口。TCP在一个连接初始化或超时后使用一种“慢启动”机制来增加拥塞窗口的大小。[6]它的起始值一般为最大分段大小(Maximum segment size,MSS)的两倍,虽然名为“慢启动”,初始值也相当低,但其增长极快:当每个分段得到确认时,拥塞窗口会增加一个MSS,使得在每次往返时间(round-trip time,RTT)内拥塞窗口能高效地双倍增长。 当拥塞窗口超过慢启动阈值(ssthresh)时,算法就会进入一个名为“拥塞避免”的阶段。[注 1]在拥塞避免阶段,只要未收到重复确认,拥塞窗口则在每次往返时间内线性增加一个MSS大小。 在TCP中,拥塞窗口(congestion window)是任何时刻内确定能被发送出去的字节数的控制因素之一,是阻止发送方至接收方之间的链路变得拥塞的手段。他是由发送方维护,通过估计链路的拥塞程度计算出来的,与由接收方维护的接收窗口大小并不冲突。 当一条连接创建后,每个主机独立维护一个拥塞窗口并设置值为连接所能承受的MSS的最小倍数,之后的变化依靠线增积减机制来控制,这意味如果所有分段到达接收方和确认包准时地回到发送方,拥塞窗口会增加一定数量。该窗口会保持指数增大

优化算法:AdaGrad | RMSProp | AdaDelta | Adam

时光总嘲笑我的痴心妄想 提交于 2020-02-01 01:18:20
0 - 引入   简单的梯度下降等优化算法存在一个问题:目标函数自变量的每一个元素在相同时间步都使用同一个学习率来迭代,如果存在如下图的情况(不同自变量的梯度值有较大差别时候),存在如下问题: 选择较小的学习率会使得梯度较大的自变量迭代过慢 选择较大的学习率会使得梯度较小的自变量迭代发散   因此,自然而然想到,要解决这一问题,不同自变量应该根据梯度的不同有不同的学习率。本篇介绍的几种优化算法都是基于这个思想的。 1 - AdaGrad算法   使用一个小批量随机梯度$g_t$按元素平方的累加变量$s_t$,在时间步0,AdaGrad将$s_0$中每个元素初始化为0,其更新公式为: $$s_t\leftarrow s_{t-1}+g_t\odot g_t$$ $$x_t\leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t$$   其中$\odot$是按元素相乘,$\eta$是学习率,$\epsilon$是为了维持数值稳定性而添加的常数(如$10^{-6}$)。 2 - RMSProp算法   由于AdaGrad算法的机制,导致每个元素的学习率在迭代过程中只能降低或者不变,因此很可能出现早期迭代到不好的极值点之后,由于学习率太小而无法冲出这个极值点导致最后收敛到的解不优,为了解决这一问题

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

时光毁灭记忆、已成空白 提交于 2020-02-01 00:48:04
最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高。 《数据结构与算法图解》电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑。主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈、队列等的合理使用,等等。 《算法图解》电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构和算法的电子资料,可以给你一个整体的感觉,很多细节需要继续学习,例子也很适合笔算,一步步的图解也很好! 《我的第一本算法书》电子书采用大量图片,通过详细的分步讲解,以直观、易懂的方式展现了7个数据结构和26个基础算法的基本原理。第1章介绍了链表、数组、栈等7个数据结构;从第2章到第7章,分别介绍了和排序、查找、图论、安全、聚类等相关的26个基础算法,内容涉及冒泡排序、二分查找、广度优先搜索、哈希函数、迪菲 - 赫尔曼密钥交换、k-means 算法等。 配合《算法图解》,算法动画图解APP,《学习JavaScript数据结构与算法第3版》电子书,非常直观的通过图示的方式分解各算法每一步的变化,对于初学者来说非常友好。我同时配合《算法图解》一起看,效率非常高。 《学习JavaScript数据结构与算法第3版

基础算法-高精度减法

巧了我就是萌 提交于 2020-02-01 00:22:17
高精度减法 Method 从低位开始AB对位相减,如果不够减则向前借1。 用t来保存借位状态,即:A-B+t (t+10)%10 包含了两种情况:1、如果A[i]-B[i]>=0,则+10取余数还是个位数。2、A[i]-B[i]<0则要借位+10然后取余10,还是回得到个位的数 去掉前导00 Example 给定两个正整数,计算它们的差,计算结果可能为负数。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的差。 数据范围 1≤整数长度≤1051≤整数长度≤105 输入样例: 32 11 输出样例: 21 #include <iostream> #include <vector> using namespace std; //判断都否有 A>=B,返回true或者false bool cmp(vector<int> &A, vector<int> &B) { //A 长度比 B长度不同则比较大小 if (A.size() != B.size()) return A.size() > B.size(); //如果AB长度相同则从高到低循环遍历对比每位大小 for (int i = A.size() - 1; i >= 0; i --) if(A[i] != B[i]) return A[i] > B[i]; return true; } //C = A - B

数据结构和算法(数据结构引入)

允我心安 提交于 2020-02-01 00:09:09
数据结构 我们如何用python中的类型来保存一个班的学生信息?如果想要快速的通过学生姓名获取信息呢? 实际上当我们在思考这个问题时,我们已经用到了数据结构。列表和字典都可以存储一个班的学生信息,单数想要在列表中获取一名同学的信息时,就要遍历整个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历,使得快速获取学生信息,其时间复杂度为O(1)。 我们为了解决问题,需要将数据存储起来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理,我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。 在上面的问题中我们可以选择python中的列表或字典来储存学生信息。列表和字典就是python内建帮我们封装好的两种数据结构。 概念 数据是一个抽象的概念,将其进行分类后得到程设计语言中的基本类型,如int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。 数据结构指数据对象中数据元素之间的关系 python给我们提供了很多现成的数据结构类型,这些系统是自定义好的,不需要我们自己去定义的数据结构叫做python的内置数据结构,比如列表,元组和字典。而有些数据组织方式,python系统里面没有直接定义

数据结构和java容器实现小结

依然范特西╮ 提交于 2020-01-31 21:26:25
数组 连续分配的内存块 一维数组 多维数组 自动扩容功能 链表 分散分配的内存块 单链表 双向链表 循环链表 单向循环链表 双向循环链表 队列 (链表的子集) 先进先出视为队列,队列的功能可以被链表覆盖。 单向先进先出队列 双线先进先出队列 循环队列(仅数组实现) 优先级队列 (使用堆实现) 栈 (链表的子集) 先进后出视为栈 同上,可以被链表覆盖 树 (链表的父级) 树的节点有一个父节点和多个子节点的数据结构。 链表是有一个父节点并且只有一个子节点的特殊的树 不同树结构的区别。 有序/无序 有权/无权 子节点上限(2个,3个,多个等) 是否自平衡(最低层和最高层层级差不超过1) 二叉树 (最多有2个子节点) 完全二叉树 (只有叶子层节点不满,上层节点已满) 最小/大堆 满二叉树(每个节点都有2个子节点) 二叉查找树(左子节点<根节点<=右子节点,有序的二叉树) 平衡二叉查找树 红黑树 AVL树 多叉树 有多个子节点 B树 B+树 B*树 B-树 字典树 trie树 前缀树 后缀树 贴个图 还有其他的: BKD-树 (elasticsearch 中用于存储整数并且快速查找) 相关算法: 前/中/后序遍历 图(树的父集) 图表示节点和节点之间的关系,不限制父节点和子节点的个数 图和图的区分 有向/无向 有环/无环 完全/不完全 有权/无权 相关概念 无向图 有向图 完全图

第二十一个知识点:CRT算法如何提高RSA的性能?

狂风中的少年 提交于 2020-01-31 15:59:37
第二十一个知识点:CRT算法如何提高RSA的性能? 中国剩余定理(The Chinese Remainder Theorem,CRT)表明,如果我们有两个等式 \(x = a \mod N\) 和 \(x = b \mod M\) ,那么 \(x\) 存在一个唯一一个 \(\mod MN\) 的解,当且仅当 \(gcd(M,N)=1\) . 在RSA中,我们可能会执行一个模幂在一个几千个位的数字上[1].一般来说,公钥加密要比对称加密要慢.这种特性可能导致web服务器网络变慢,而在实现过程中提高效率(软件算法)对于避免性能问题起着至关重要的作用. 我们表示RSA方案中主要的加密操作就是模幂算法 \(M= C^d \mod N\) .模幂能够用h-1次乘法和t-1次平方运算.(t是指数的长度,h是汉明系数).平均来说需要的次数一共是 \(t + t/2 -1\) . 更多的性能提升需要二进制指数算法或者窗口方法.对于后者我们依次处理 \(w\) 位.对于这个方案我们仍然需要t次平方运算,但是乘法次数减少到 \(t/w\) .更多的性能提升能通过滑动窗口法得到进一步改进. 为了让RSA指数算法更快,我们能够执行一些额外的小技巧,当我们加密或者解密RSA的时候.CRT被用于这种情况.因此我们首先考虑一个私钥操作,这意味着我们能够获得私钥,因此获得了 \(N\) 的分解数 \(N = pq