Advanced Data Structure&Algorithm

后缀数组

树哈希

  • 572. 另一棵树的子树
    //这里采用的哈希公式是:h(X) = Xv + mb + lb * h(Xl) + rb * h(Xr), 且h(nullptr) = 1
    constexpr uint64_t lb = 2333, rb = 97755331, mb = 23333;
    class Solution {
    public:
        int trans(TreeNode* root){
            return !root ? 1 : root->val = lb * trans(root->left) + rb * trans(root->right) + root->val + mb;
        }
        bool dfs(TreeNode* root, int k){
            return root && (root->val == k || dfs(root->left, k) || dfs(root->right, k));
        }
        bool isSubtree(TreeNode* root, TreeNode* subRoot) {
            return dfs((trans(root), root), trans(subRoot));
        }
    };

Rabin-Karp算法:

子字符串匹配、优化散列查找

快速幂和快速乘

double binaryExponentiation(double x, long long n) {
    if (n == 0) {
		return 1.0;
    }
    double half = binaryExponentiation(x, n >> 1);
    return n & 1? half * half * x : half * half;
}

double iteration(double x, long long n) {
	double res = 1.0;
    double xContribution = x;
    while (n > 0) {
		if (n & 1) {
            res *= xContribution;
        }
        xContribution *= xContribution;
        n >>= 1;
    }
    return res;
}
long mul(int x, long n) {
	long res = 0;
    while (n > 0) {
        if (n & 1) {
            res += x;
        }
        n >> 1;
        x += x;
    }
    return res;
}

Manacher

区间查询修改

  • 数组不变,区间查询:__前缀和__、树状数组、线段树;
  • 数组单点修改,区间查询:__树状数组__、线段树;
  • 数组区间修改,单点查询:__差分__、线段树;
  • 数组区间修改,区间查询:__线段树__。

前缀和 前缀和

差分数组

应用场景:区间修改, 单点查询。

模板题

变式

树状数组

单点修改, 区间查询

待学习: 【宫水三叶の相信科学系列】二维最长上升子序列:朴素 DP & 二分 DP(含证明)& 树状数组 DP - 俄罗斯套娃信封问题 - 力扣(LeetCode)

分段树(线段树)segment tree

区间修改, 区间查询.

  • 以上区间求和题目都能做, 但不是最优.

启发式搜索

A Star

最好提前判断是否有解, 无解情况需要遍历所有可能.

  1. 设置f()作为启发式函数, 用于计算于终点的最短距离.
  2. 用优先队列存储过程, 优先取出与终点理论距离最短, 即f()算出来最短的那个中间值.

待学习:

IDA Star

相对于 A*算法,它的优势如下:

  1. 不需要判重,不需要排序;
  2. 空间需求减少。

待学习:

字符串哈希


Advanced Data Structure&Algorithm
https://messenger1th.github.io/2024/07/24/LeetCode/Advanced Data Structure&Algorithm/
作者
Epoch
发布于
2024年7月24日
许可协议