【leetcode】最长公共子路径问题

滚动hash

滚动哈希(rolling hash)也叫 Rabin-Karp 字符串哈希算法,它是将某个字符串看成某个进制下的整数,并将其对应的十进制整数作为hash值。

滚动hash算法的推导

假设有一个长度为n的数组a[0],a[1],a[2],…a[n-1],数组中的最大值为ma, 我们选取进制k满足k>ma,将数组a看成是n位k进制整数,那么其对应的10进制整数为:

∑ i = 0 n − 1 a [ i ] ∗ k n − 1 − i \sum_{i=0}^{n-1} a[i] * k^{n-1-i} i=0n1a[i]kn1i

这样一来,在子数组长度固定的前提下,给定进制 k,子数组与其十进制值满足「一一对应」的关系,即不会有两个不同的子数组,它们的十进制值相同。因此滚动哈希得到的哈希值是可以表示原子数组的。

滚动哈希的一大优势在于,如果我们需要求出一个数组中长度为 len 的所有子数组的哈希值,需要的时间仅为线性,即如果我们已经计算出数组中以 j 开始的子数组的哈希值:

h a s h ( j ) = ∑ i = 0 l e n − 1 a [ j + i ] ∗ k l e n − 1 − i hash(j) = \sum_{i=0}^{len-1} a[j+i] * k^{len-1-i} hash(j)=i=0len1a[j+i]klen1i

那么要计算以 j+1 开始的子数组的哈希值,我们通过公式推导:

h a s h ( j + 1 ) = ∑ i = 0 l e n − 1 a [ j + 1 + i ] ∗ k l e n − 1 − i = ∑ i = 1 l e n a [ j + i ] ∗ k l e n − i = k ( ∑ i = 1 l e n a [ j + i ] ∗ k l e n − 1 − i ) = k ( h a s h ( j ) − a [ j ] ∗ k l e n − 1 + a [ j + l e n ] ∗ k − 1 ) = k ∗ h a s h ( j ) − a [ j ] ∗ k l e n + a [ j + l e n ] \begin{aligned} hash(j+1) &= \sum_{i=0}^{len-1} a[j+1+i] * k^{len-1-i} \\ &= \sum_{i=1}^{len} a[j+i]*k^{len-i} \\ &= k(\sum_{i=1}^{len} a[j+i]*k^{len-1-i}) \\ &= k(hash(j) - a[j]*k^{len-1} + a[j+len]*k^{-1}) \\ &= k*hash(j) - a[j]*k^{len} + a[j+len] \end{aligned} hash(j+1)=i=0len1a[j+1+i]klen1i=i=1lena[j+i]kleni=k(i=1lena[j+i]klen1i)=k(hash(j)a[j]klen1+a[j+len]k1)=khash(j)a[j]klen+a[j+len]

就可以在 ϕ ( 1 ) \phi(1) ϕ(1)的时间内得到该值。

利用滚动hash算法计算最长公共子路径的代码示例如下:

请添加图片描述

上述代码的执行效率较低,以下代码通过二分法优化,可以有效降低代码的时间复杂度:

def longest_common_subpath_2(n: int, paths: List[List[int]]) -> int:mod = (10 ** 9 + 7) * (10 ** 9 + 9)base = 10 ** 6 + 3# get min len of pathsmin_len = len(min(paths, key=lambda x: len(x)))def check(x: int) -> bool:k = pow(base, x, mod)hash_values = defaultdict(int)for path in paths:cnt = Counter()hash_value = 0for i in range(x):hash_value = (hash_value * base + path[i]) % modcnt[hash_value] += 1hash_values[hash_value] += 1for i in range(x, len(path)):hash_value = (hash_value * base + path[i] - path[i - x] * k) % modif hash_value not in cnt:cnt[hash_value] += 1hash_values[hash_value] += 1return max(hash_values.values(), default=0) == len(paths)l, r, ans = 1, min_len, 0while l <= r:mid = (l + r) >> 1if check(mid):ans = midl = mid + 1else:r = mid - 1return ans

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络】:套接字之UDP

一、UDP和TCP协议 TCP &#xff08;Transmission Control Protocol 传输控制协议&#xff09;的特点&#xff1a; 传输层协议有连接&#xff08;在正式通信前要先建立连接&#xff09;可靠传输&#xff08;在内部帮我们做可靠传输工作&#xff09;面向字节流 UDP &#xff08;U…

React19 useOptimistic 用法

用法 乐观更新 发起异步请求时&#xff0c;先假设请求会成功立即更新 UI 给用户反馈若请求最终失败&#xff0c;再将 UI 恢复到之前的状态 const [optimisticState, addOptimistic] useOptimistic(state, updateFn) 参数 state&#xff1a;实际值&#xff0c;可以是 useSta…

Deepseek-v3+cline+vscode java自动化编程

1、Deepseek DeepSeek 充值后&#xff0c;创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来&#xff0c;用了几次后&#xff0c;不能使用了&#xff0c;请求…

数据分析案例:环境数据分析

目录 数据分析案例&#xff1a;环境数据分析1. 项目背景2. 数据加载与预处理2.1 数据说明2.2 读取与清洗 3. 探索性数据分析&#xff08;EDA&#xff09;3.1 时序趋势3.2 日内变化3.3 气象与污染物相关性 4. 特征工程4.1 时间特征4.2 滞后与滚动统计4.3 目标变量 5. 模型构建与…

网络原理 - 8

目录 补充 网络层 IP 协议 基本概念&#xff1a; 协议头格式 地址管理 如何解决 IP 地址不够用呢&#xff1f;&#xff1f;&#xff1f; 1. 动态分配 IP 地址&#xff1a; 2. NAT 机制&#xff08;网络地址映射&#xff09; 3. IPv6 网段划分 一些特殊的 IP 地址 …

向量检索新选择:FastGPT + OceanBase,快速构建RAG

随着人工智能的快速发展&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;技术日益受到关注。向量数据库作为 RAG 系统的核心基础设施&#xff0c;堪称 RAG 的“记忆中枢”&#xff0c;其性能直接关系到大模型生成内容的精准度与…

dify对接飞书云文档,并且将图片传入飞书文档

前面讲了如何让dify展示图片&#xff0c;但是如果想让智能体回答的带图片的内容生成个文档该怎么弄呢&#xff1f;今天来实践一下。 dify工具带的有飞书云文档&#xff0c;正好&#xff0c;咱们就利用飞书云文档。 1、首先配置飞书云文档的key跟secret 注意要开头左侧的权限&a…

Linux系统之设置开机启动运行桌面环境

Linux 开机运行级别介绍与 Ubuntu 桌面环境配置指南 一、Linux 开机运行级别(Runlevel) 在传统的 Linux 系统(如 SysV init 初始化系统)中,运行级别定义了系统启动时加载的服务和资源。常见的运行级别如下: 运行级别模式用途0Halt(停机模式)关闭系统1Single User Mode…

Spring Cloud Gateway配置双向SSL认证(完整指南)

本文将详细介绍如何为Spring Cloud Gateway配置双向SSL认证,包括证书生成、配置和使用。 目录结构 /my-gateway-project ├── /certs │ ├── ca.crt # 根证书 │ ├── ca.key # 根私钥 │ ├── gateway.crt # 网关证书 │ ├── …

【虚幻5蓝图Editor Utility Widget:创建高效模型材质自动匹配和资产管理工具,从3DMax到Unreal和Unity引擎_系列第二篇】

虚幻5蓝图Editor Utility Widget 一、基础框架搭建背景&#xff1a;1. 创建Editor Utility Widget2.根控件选择窗口3.界面功能定位与阶段4.查看继承树5.目标效果 二、模块化设计流程1.材质替换核心流程&#xff1a;2.完整代码如下 三、可视化界面UI布局1. 添加标题栏2. 构建滚动…

LabVIEW实现DMM与开关模块扫描测量

该程序基于 LabVIEW&#xff0c;用于控制数字万用表&#xff08;DMM&#xff09;与开关模块进行测量扫描。通过合理配置触发源、测量参数等&#xff0c;实现对多路信号的自动化测量与数据获取&#xff0c;在电子测试、工业测量等领域有广泛应用。 ​ 各步骤功能详解 开关模块…

OpenAvatarChat要解决UnicodeDecodeError

错误信息如下 ailed to import handler module client/h5_rendering_client/client_handler_lam Traceback (most recent call last):File "E:\Codes\Python\aigc\OpenAvatarChat\src\demo.py", line 82, in <module>main()File "E:\Codes\Python\aigc\O…

数据库中的主键(Primary Key)

数据库中的主键&#xff08;Primary Key&#xff09; 主键是数据库表中用于唯一标识每一行记录的一个或多个列的组合&#xff0c;是关系型数据库中的重要概念。 主键的核心特性 唯一性&#xff1a;主键值必须唯一&#xff0c;不能重复非空性&#xff1a;主键列不能包含NULL值…

MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级

开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布&#xff01;作为企业级数据库的“扛把子”&#xff0c;此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域&#xff0c;同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…

Rmarkdown输出为pdf的方法与问题解决

R 是一种在数据分析与统计计算领域广泛使用的编程语言。其关键优势之一是能够生成高质量的报告和文档&#xff0c;这些报告和文档可以使用 RMarkdown 轻松定制和更新。在本文中&#xff0c;我们将探讨使用 R 从 RMarkdown 文件生成.pdf 文件 1.生成方法 新建Rmarkdown&#xf…

毕业设计-基于机器学习入侵检测系统

选题背景与意义 随着互联网技术的飞速发展&#xff0c;网络在人们的生活、工作各个领域都发挥着至关重要的作用。但与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;各类网络攻击事件频发&#xff0c;给个人、企业乃至国家都带来了巨大的经济损失和安全威胁。入侵检测…

React 实现爱心花园动画

主页&#xff1a; import React, { useEffect, useRef, useState } from react; import /assets/css/Love.less; import { Garden } from /utils/GardenClasses;// 组件属性接口 interface LoveAnimationProps {startDate?: Date; // 可选的开始日期messages?: { // 可…

从零开始了解数据采集(二十一)——电子制造行业趋势分析案例

这次分享一个偏行业性的趋势分析案例,在项目中为企业实实在在的提高了良品率。不懂什么是趋势分析的同学,可以翻看前面的文章。 在广东某电子制造厂中,管理层发现最近几个月生产良品率有所波动,但无法明确波动原因,也无法预测未来的趋势。为了优化生产过程并稳定良品率,…

在 Git 中,撤销(回退)merge 操作有多种方法

在 Git 中&#xff0c;撤销&#xff08;回退&#xff09;merge 操作有多种方法&#xff0c;具体取决于是否已提交、是否已推送&#xff0c;以及是否需要保留历史记录。以下是几种常见的撤销 merge 的方法&#xff1a; 1. 未提交 merge&#xff08;未 commit&#xff09; 如果 …

基于 Python 的实现:居民用电量数据分析与可视化

基于 Python 的实现:居民用电量数据分析与可视化 本文将介绍如何利用 Python 技术栈(包括 pymysql、pandas、matplotlib 等库)对居民用电量数据进行分析和可视化,以帮助我们更好地理解用电行为模式。 数据准备 在MySQL数据库中创建数据,,数据库表结构如下: date:记录…