- 博客(10)
- 收藏
- 关注
原创 Manacher(马拉车)算法详解
算法的主要思路是维护一个最右回文子串,利用该区间的对称性,计算当前遍历位置为中心的回文半径,回文半径就是从中心(如果为奇回文串,就包含中心位置)到回文串一端的距离。我们可以再每个字符之间加入特殊字符,奇回文串的中心不变,偶回文串的中心就变成了特殊字符。还有另一种枚举的方法,是中心扩散法,利用了回文串的对称性,枚举每一个字符,然后从中心向两边比较,时间复杂度也为。求最长回文子串的方法,最容易想到的就是暴力枚举,将所有的回文子串都找出来,然后找做大的,时间复杂度就相当高了。,回文串可以分为奇回文串和偶回文串,
2023-07-24 14:30:40 1479 3
原创 关于智能指针你应该知道这些
构造不再会出现这样的问题了,因为 C++17 以后要求,函数的每个参数的表达式必须完整执行完,才可以执行其他参数的表达式。使用元素时通常也会用到引用计数,所以如果物理内存相隔比较远,导致不在一个缓存行上,可能会导致多一次的访存。不用考虑内存分配次数的问题,因为没有控制块的存在。但这也会导致原始指针释放的延迟,因为我们不能释放部分的内存,所以只能等所有的。或是第三方的智能指针,甚至手动维护这个原始指针(当然这并不推荐)。更简单的,不用维护控制块,相应的消耗就少。管理,就被跳过了,最终导致内存泄漏。
2024-08-14 23:39:43 562
原创 基础分块、基础莫队详解
分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。我们很容易可以发现,在块间移动时,也有可能会有很大的震动,所以在排序时可以使用奇偶性排序,让奇数块和偶数块采用相反的对右端点的排序。我们将所以的查询都抽象成点,放到坐标轴里观察,上面的问题其实转化为我们从原点开始,我们要不重不漏的走完这些点,走到一个点就记录一个点的答案。线段树一次操作的复杂度是树的高度,而分块一次操作的复杂度取决于块的大小,我们可以写出一次操作进行的运算次数为。
2023-10-29 10:07:19 240 3
原创 new/delete详解
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。答案是B类会引起报错。这是编译器优化的结果,因为A类中使用的是C++默认的析构函数,这是编译器已经知道析构函数什么都不会做,也就不需要记录具体的元素个数,所以编译器就没有额外申请空间,返回的指针就是动态内存正确的开始位置,所以可以正常运行。
2023-10-24 18:02:34 79
原创 全网最细【树状数组】
树状数组是利用数的二进制特征进行检索的一种树状的结构。它用于维护前缀和的数据结构,支持单点修改、区间查询;区间修改、区间查询等一系列操作。树状数组维护的元素要满足结合律和可差分的性质。
2023-09-01 17:58:19 81 1
原创 最小表示法详解
最坏情况,字符串S有大量相同元素,但不是全相同,使得。时间复杂度分析,一般情况,序列随机时间复杂度为。这里有几道运用最小表示法的习题,来练习一下吧!位置为下一个循环同构串的开头,那一定存在以。所有循环同构的字符串中字典序最小的字符串。内,就不会有最终的答案,我们就可以直接将。为开头的循环同构串是比前者更优的,因为。都不是最终的答案,所以就可以直接跳到。我没可以画一个图来理解,如下图。内,就不会有最终的答案呢?每次遍历,都能到最大值,两个区间是完全相同的,且。这里的优化类似字符串。
2023-07-18 22:35:53 186 1
原创 分治法及应用(附练习)
虽然没有优化,但是这个递归式给了我们优化的思路,我们可以想办法降低递归的时间消耗,就是减少计算矩阵乘法的次数或是改变分块的方式,改变分块的方式显然是行不通的,因为你将一个块矩阵分的小一些,其他块矩阵一定会变大,相当于没怎么变,那就只有减少计算矩阵乘法的次数了。分治是一个简单但是非常有效的算法,它的思想也很简单,就是将原问题分成几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再将这些问题的结果合并,就得到的原问题的解。下面我们分析一下归并排序的时间复杂度,有人会说,这很简单呀,不就是。
2023-07-02 00:23:58 589 1
原创 详解快速幂(附习题)
再将这些结果累乘起来,并且利用模运算的性质,在累乘过程中不断取模,防止溢出,最后就可以得到最后的答案。写成一个二进制累加的形式,再利用幂的运算规则,就可以将。的就将其乘起来,并且不断取模保证不溢出,最后遍历完。都会溢出),这时就需要快速幂来解决这个问题。,并且这样一个大的数字很难存储在计算机中(的一个二进制位,我将幂次写成二进制的形式。的二进制位,循环结束,得到的乘积就是结果。快速幂其实就是利用了分治的思想,将。的位置,就是上式中乘数的幂次。两个部分,一直细分,直到幂次。,这个结果就是模运算的结果。
2023-06-23 20:05:59 92
原创 KMP算法(C语言)——next数组的求解
简介:KMP算法是D.E.Knuth、J,H,Morris 和 V.R.Pratt 发表的一个模式匹配算法,可以大大避免重复遍历的情况(即消除了主串指针回溯的),从而提高算法效率。
2023-04-06 19:49:57 760
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人