nlog

后缀数组

耗尽温柔 提交于 2020-10-31 08:42:16
Meaning 所谓后缀数组,就是将一个字符串的所有后缀形式化的一个数组。由于所有子串都必定是某个后缀的前缀,所以利用后缀数组我们可以处理不少字符串题目。 General 对于所有后缀,我们一般先针对它们按字典序排好序,那么这样就能保证相邻后缀的重合部分最大,对于一些重叠相同的子串一类,我们就能迅速地找出它们。 Sort 好的,接下来我们研究如何排序! Power 暴力的排法自然是将所有后缀记录下来并直接 $sort$ 一发,不过此方法空间复杂度达到了 $n^2$ ,且时间复杂度达到了 $n^2log$ ,在 $nlog$ 横行的今天显然是撑不住的。那么有没有什么好方法呢?答案是肯定的! Multiplication $O(n*log^2)$-$QuickSort$ 倍增算法自然为人所皆知,这是一个巧妙的算法,应用范围也还算广,只需要变化规则相同且有规律,那么这些变化则可以使用倍增来加速状态的推导。 打个比方,变化矩阵单调的 $DP$ ,我们就可以使用倍增来加速,同时譬如 $LCA$ 的变化也很单调,那么我们就可以通过 $2^i=2^{i-1}\ and\ 2^{i-1}$ 这样两个状态的叠加来快速得到结果。一般多用二进制优化,因为二进制下只需要 $1/0$ 表示即可,即有与无。偶尔我们也可能需要 $k$ 进制优化 = =,譬如固定底数的幂次方,那么我们可以通过对 $65536$

python实现十大经典算法

戏子无情 提交于 2020-10-28 09:36:26
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释: n:数据规模 k:“桶”的个数 In-place:占用常数内存,不占用额外内存 Out-place:占用额外内存 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同 冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

「集训」2020集训记录

情到浓时终转凉″ 提交于 2020-10-24 20:16:08
  01.02 「数学一」     T1因为不会exlucas只拿了80     T2失智没想到异或FWT,后面的倍增求鬼畜数列前缀和了。     T3是个特别神的期望?的确是枚举最后一个拔掉的位置,然后区间dp      如何让区间dp方便地统计答案同时转移?当然是弄出一个优秀的状态定义了       (也就是只要和出题人想到一块就AC否则暴力滚粗)      定义区间右端点是区间最后一个拔掉的点,枚举倒数第二个      这样对于左右子区间来说,他们的右端点恰好也是他们中最后一个拔掉的,      于是可以直接借用他们的贡献来计算。      01.04 「数学二」     T1杜教筛全场切 而我差点被卡常     T2神仙结论题,由于结论证明不了也理解不了,心情差到不想写代码     T3疯狂化柿子套FFT,太过丧心病狂,于是想打多项式多点求值      然后调不出来。      利用$val^{2ij}=val^{(i+j)^2-i^2-j^2}$      把巨型柿子变成若干次FFT   01.06 「数学三」     T1毒瘤dp,又是构造一堆函数...      其实本应该想到的,毕竟已经做过「最小生成树计数」,应该意识到在这个完全图里      代价最小的一组点要放在一个联通块内考虑/代价最大的边必定只出现一条(来沟通两个代价较小的联通块)     

算法中:算法复杂度

拈花ヽ惹草 提交于 2020-10-24 20:13:04
算法复杂度 记录所用,如有内容有误请谨慎。 目录:     1、简介     2、时间频度     3、时间复杂度      3-1、简介      3-2、常数阶 O(1)      3-3、对数阶 O(log₂n)      3-4、线性阶 O(n)      3-5、线性对数阶 O(nlog₂n)      3-6、平方阶 O(n²)      3-7、立方阶 O(n³)      3-8、k次方阶 O(n k )      3-9、指数阶 O(2 n )     4、平均时间复杂度和最坏时间复杂度     5、空间复杂度 1、简介 我们的一个算法如何来判断它的好坏,我们一般有两种方法: 第一种:事后统计法   这种方式就是在算法开始执行以前记录开始时间,然后算法执行结束以后记录结束时间,用结束时间-开始时间就是这个算法运行花费的时间。   但是这种方法会受到计算机硬件、软件的影响,比如同一个算法,在不同配置不同环境的电脑上运行效果是不一样的。 第二种:事前统计法   这种方式就是通过时间复杂度来判断一个算法的好坏,而时间复杂度呢就是用特殊的符号特殊的规则来记录这个算法耗时的大致情况。 2、时间频度 一个算法中语句执行次数称之为时间频度或者时间频度, 记作T(n)。 来举例1+2+3+...+n: 1 public static int sum1( int n) { 2

(一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore

冷暖自知 提交于 2020-10-23 17:51:54
  想深入了解OrchadCore源码许久了,但是读源码的时候遇到很多问题而网上的参考资料太少了(几乎都是OrchadCms不带OrchardCore的),现在解决得差不多了,做下笔记方便自己查看,有错误之处也请大家帮忙指出,谢谢。   OrchardCore是一个基于asp.net core的cms(废话),其结构类似于asp.net core(为啥说类似我也不知道,asp.net core的源码我只看了一部分,似是而非吧)。因此,我将直接从asp.net core的角度来解析OrchardCore,从asp.net core的角度就是说关于asp.net core的靠自己理解,可以省略1万字。   废话结束,开始正题,源码直接github搜索OrchardCore就可以下载了,我直接用visual studio(我不用rider,首先我没钱买,其次我之前是弄.net framework不是java,我用的vs都是社区版)自带的git去clone半天(这小水管受不了后面直接码云找镜像仓库clone了)。   clone完了,第一个坑出现了,选择记得选择版本和分支,说多都是泪,OrchardCore支持的版本(从.net core 1.0到.net core 3.1都有)和自身的分支太多了,第一次接触没注意跳坑了导致各种出错(原因是我没有装对应的.net core版本,默认好像2

第一类斯特林数

隐身守侯 提交于 2020-10-23 05:39:34
两类斯特林数的其中之一 还是要了解一下的。 一般形如 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 写作 \(s(n,k)\) 组合意义: \(s(n,k)\) 表示把n个数分成k组 每组是一个环 求分成的方案数。 环的意思其实是类似于圆排列的东西。 递推式: \(s(n+1,k)=s(n,k-1)+s(n,k)\cdot n\) 有边界 \(s(0,0)=1\) . 性质: \(s(n,1)=(n-1)!\) 这个看起来挺显然不正了 当然可以相当于圆排列来理解。 \(s(n,2)=(n-1)!\times\sum_{i=1}^{n-1}\frac{1}{i}\) 这个利用数学归纳法也很好证。 \(\sum\limits_{i=0}^ns(n,k)=n!\) 证明:求n个数的所有排列方案数n! 对于某种排列其中必然有k个置换 而置换就是我们上述所说的环的概念。 对于有k个置换的方案数 其为s(n,k)所以可以得到 \(\sum\limits_{i=1}^ns(n,k)=n!\) 因为s(n,0)=0所以原式成立。 这里先规定一下上升幂和下降幂。 定义下降幂为 \(x^{\underline{n}} = x(x-1)\cdots (x-n+1).\) 上升幂为 \(x^{\overline{n}} = x(x+1)\cdots (x

交换排序算法之快速排序

穿精又带淫゛_ 提交于 2020-10-09 06:03:33
八种排序算法可以按照如图分类,本文主要介绍快速排序。 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的。 快速排序 快速排序的思想很简单,就是先把待排序的数组拆成左右两个区间,左边都比中间的基准数小,右边都比基准数大。接着左右两边各自再做同样的操作,完成后再拆分再继续,一直到各区间只有一个数为止。 举个例子,现在我要排序 4、9、5、1、2、6 这个数组。一般取首位的 4 为基准数,第一次排序的结果是: 2、1、4、5、9、6 可能有人觉得奇怪,2 和 1 交换下位置也能满足条件,为什么 2 在首位?这其实由实际的代码实现来决定,并不影响之后的操作。 以 4 为分界点,对 2、1、4 和 5、9、6 各自排序,得到 1、2、4、5、9、6 不用管左边的 1、2、4 了,将 5、9、6 拆成 5 和 9、6,再排序,至此结果为 1、2、4、5、6、9 为什么把快排划到交换排序的范畴呢?因为元素的移动也是靠交换位置来实现的。 算法实现 大体思路已经有了,接下来就是具体实现。 相信大家已经看出来了,算法的实现需要用到递归(拆分区间之后再对每个区间作同样的操作)。所有关于算法实现的阐述仅以一次排序为例。 基准数一般取数组首位的数,而最终基准数是要放在中间位置的。我们使用一个临时变量 stard 来保存选取的基准值

Python、Java、C++一网打尽,这个GitHub项目用多种语言实现经典算法

天大地大妈咪最大 提交于 2020-10-08 08:22:39
经典数据结构和算法你了解几个?想去大厂面试?想成为算法工程师?收下这份全面的复习材料。 机器之心报道,参与:Racoon、Jamin。 不想做低级码农,不想成为前端抠图达人或是后台「增删改查」小王子?那你可能需要好好复习下算法与数据结构。想成为算法工程师,基础知识是绕不开的大山。机器之心 这次要推荐的项目是数据结构与算法的开源项目集,覆盖多种主流语言,实现各类经典数据结构及算法 。 项目地址: https:// github.com/trending The Algorithms 项目介绍 正如 The Algorithms 项目主页上介绍的那样,这是一个使用多种编程语言,实现经典数据结构与算法的开源项目集。这里的「any Programming Language」真是没有虚假宣传,我们可以看到 The Algorithms 里从较为流行的 Python、Java、C、C++到 C#、Go、Rust、Kotlin 语言应有尽有,当然有的编程语言实现的算法还不是那么的丰富,其中维护较好的还是 Python 和 Java。 本文以 The Algorithms 的 Python 项目为例进行介绍。 截至目前, 该项目已经有 7 万多星,内容涵盖加密算法、图像处理、动态规划、线性代数、经典机器学习算法、搜索算法、排序算法以及各种数据结构等,单是所实现算法的目录就有 600 多行 ……当然