【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=0n?1?a[i]?kn?1?i

這樣一來,在子數組長度固定的前提下,給定進制 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=0len?1?a[j+i]?klen?1?i

那么要計算以 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=0len?1?a[j+1+i]?klen?1?i=i=1len?a[j+i]?klen?i=k(i=1len?a[j+i]?klen?1?i)=k(hash(j)?a[j]?klen?1+a[j+len]?k?1)=k?hash(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.pswp.cn/web/77645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77645.shtml
英文地址,請注明出處:http://en.pswp.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:記錄…