算法基础
文章平均质量分 91
num73
num73.github.io
展开
-
【算法基础】数字的基本性质
and b0and rbqr, where 0≤rbcdab. When gcdab1, we say aand bareand band tcdabasbtcdabsbt.If aand band tsbt1.p∣abp∣ap∣bIf p, then pdivides aor pdivides bp1p1⋅⋅⋅prand nq1q2⋅⋅。原创 2024-06-23 00:08:56 · 640 阅读 · 0 评论 -
【算法基础】Newton求根法
虽然Newton更早发现了这种方法,但Raphson首先在自己的文章中介绍了这种方法。可能会非常大,所以算法开始时有理由对答案进行一个初始的估计。很显然,这个估计值离答案跃进,算法收敛的越快。最后,这个问题还有一个解决非常大的数字(bignum arithmetic)的形式。更具体地来说,我们需要找到这个方程的一个根(假设这个根存在)。在上一次迭代中减小了,在当前的迭代中又增加了,这个时候算法必须停止。这样的化就需要稍微改变一下这个算法的结束条件,因为当。的根,带入上面的式子化简,可以得到。翻译 2024-06-21 14:42:28 · 745 阅读 · 0 评论 -
【算法基础】ST表
当查询区间最小值的时候,区间的重叠对结果没有影响。因为相对于把区间分解成多个不相交的区间,我们可以把区间分解成两个长度为2的幂的两个区间,这两个区间可能重叠也可能不重叠。ST表的关键就是提前计算出所有长度为2的幂的区间的查询。任何一个非负整数都可以唯一表示为一组递减的2的幂的和,这等价于一个数的二进制表达。同样的,任何一个区间都可以被唯一的表示为一组长度为2的幂的不相交区间的并集。取决于查询的类型,对于求和的查询就是求和函数,对于最小值的查询就是求最小值函数。的区间查询,我们从大到小迭代2的幂,只要当前。翻译 2024-05-15 11:17:07 · 845 阅读 · 0 评论 -
【算法基础】图上的博弈
首先我们先遍历一般所有的结点,找到那些开始就确定是胜利点和失败点的结点。从每个这样的点开始跑一遍dfs。如果当前结点的上一个结点是失败点,那么就是上面的第一种情况,即这个结点是成功点。如果当前结点的上一个结点是成功点,还需要判断所有到达它的结点是否是成功点,这个过程可以通过增加一个。在两名选手都使用最佳策略的情况下,如果某个点作为初始点先手能获得胜利,那就把这个点叫做胜利点。类似的,如果某个点作为初始点,先手失败,那这个点就叫失败点。图上所有没有出边的点,我们是可以马上判断出该点是胜利点还是失败点。翻译 2024-05-14 21:15:02 · 83 阅读 · 0 评论 -
【算法基础】三分搜索算法(Ternary Search)
重复上面的过程,我们可以得到任意小的一个区间。最终这个区间的长度会小于一个特定的值(精确度),然后整个过程就可以停止了。外,我们还可以选择一个常数,当循环次数超过这个常数时,算法结束。处的函数值后,我们都可以让整个区间减少三分之一。的区间最值问题的算法。区间中的所有函数值(不超过两个),可以确定哪个是所求的最大值。区间内的函数值都是可以接受的最大值。和之前不同的是算法的结束条件。因此,通过对两个点函数值的比较,我们可以将当前的区间。的选择没有任何的限制,算法的正确性不受影响。,换成一个新的,更小的区间。翻译 2024-05-05 21:16:08 · 281 阅读 · 0 评论 -
【算法基础】MEX的计算,MEX(minimal excluded) of a sequence
每一个节点来维护一个区间里数的频率,并且存储当前区间中出现的不同的数的数量。的所有元素都放到一个set里,这样就可以很快地检查一个数是否在这个集合里。的时间内计算MEX,可以使用一个bool类型的vector来代替集合,这样我们需要的就是和。问题:改变数组里的单个数,在每次更新后都计算数组里新的MEX。翻译 2024-05-07 15:05:53 · 439 阅读 · 0 评论 -
【算法基础】平衡三进制(Balanced Ternary)
这是一个不太标准的数字符号系统(numeral system)。它的特点是每一位数字可以是-10和1。它是一个基于三进制的数字符号系统。因为使用-1来作为一个数字不太方便,我们接下来会使用字母Z来代替-1。图片里展示的是一台使用这种系统的计算机。0 01 12 1Z3 104 115 1ZZ6 1Z07 1Z18 10Z9 100这种符号系统允许你在书写符号的时候不使用前置的负号:在将正数转换成负数时,你需要将每一位数字转置(1变成ZZ变成1-1 Z-2 Z1-3 Z0-4 ZZ。翻译 2024-05-05 14:07:35 · 224 阅读 · 0 评论 -
【编程基础】递归的简单理解
递归:参见递归。递归:如果你还不理解递归是什么,请参见递归。递归事实上就是函数直接或间接调用自身的一个过程。(或者其它本质上相似过程的也可以称为递归。)但和许多基本的概念一样,定义总是很简洁,但真正运用起来却并不容易。在程序设计中为了保证递归能够结束,递归函数一定需要一个结束条件,称这个条件为基线条件,满足基线条件时停止递归调用。原创 2024-05-09 12:06:06 · 591 阅读 · 0 评论 -
【算法基础】动态规划导论
因此,相比于重复计算这些子问题,我们通过把这些问题的结果存在一个表中来避免重复的计算。自底向上方式和自顶向下的方式完全相反,我们从最底层开始(递归的初始条件(base case)),然后扩展到更多的数。不过我们还要注意到这是结果的正确性还取决于我们使用的数据类型,在32位整数类型下,我们最多能计算第46位的斐波那契数。其次我们只需要之前的两个数就可以计算当前的值。因此我们把空间复杂度从。上面这种方式叫做自顶向下的,因为我们从询问的数开始计算,并且计算的过程是从上到下的,通过记忆化的方式保留中间的计算结果。翻译 2024-05-13 18:54:55 · 699 阅读 · 0 评论