1. 程式人生 > >Lyndon word問題的Duval演算法入門詳解

Lyndon word問題的Duval演算法入門詳解

一.Lyndon串的定義.

對於兩個串s1與s2,令 n = s 1 , m =

s 2 , x = m i n (
n , m ) n=|s1|,m=|s2|,x=min(n,m) s 1 =
s 2 s1=s2
僅當 n = m n=m s 1 [ 1.. n ] = s 2 [ 1.. m ] s1[1..n]=s2[1..m] s 1 < s 2 s1<s2 僅當 s 1 [ 1.. x ] < s 2 [ 1.. x ] s1[1..x]<s2[1..x] ,或 s 1 [ 1.. x ] = s 2 [ 1.. x ] s1[1..x]=s2[1..x] n < m n<m .

一個字串s為Lyndon串僅當s在它的所有後綴中最小.


二.Lyndon串的一個性質.

性質1:當u,v為Lyndon串且u<v時,uv(u與v相連線)也為Lyndon串.

證明如下:
首先顯然uv大於任意一個u的字尾與v連線.
然後因為 u &lt; v &lt; v [ i . . v ] u&lt;v&lt;v[i..|v|] ,所以 u v &lt; v [ i . . v ] uv&lt;v[i..|v|] .
綜上所述,uv小於所有它的字尾,即uv為一個Lyndon串.
證畢.


三.Lyndon word問題.

Lyndon word問題是指,將一個字串s分解成   s 1 s 2 . . . s k \ s_1s_2...s_k ,其中   s i \ \forall s_i 為Lyndon串, s i s i + 1 s_i\geq s_{i+1} ,求拆分方案.

這個問題首先具有存在性,證明:
首先當一個串只有一個字元時,顯然這個串為一個Lyndon串.
當一個串S不是Lyndon串時,它顯然可以被分成 S |S| 個單個字元組成的字串合併的形式.
根據性質1,這些串中只要有 s i &lt; s i + 1 s_i&lt;s_{i+1} 的情況,就可以被合併成一個新的Lyndon串.
證畢.

這個問題也具有唯一性,用反證法證明如下:
設若有兩種方案,設兩種方案不同的位置為 s i s_i ,兩種方案分別為 s i s_i s i s&#x27;_i ,且 s i &gt; s i |s_i|&gt;|s&#x27;_i| .
我們令 s i = s i s i + 1 . . . s k s k + 1 [ 1.. j ] s_i=s&#x27;_is&#x27;_{i+1}...s&#x27;_{k&#x27;}s&#x27;_{k&#x27;+1}[1..j] ,其中 s k + 1 [ 1.. j ] s&#x27;_{k&#x27;+1}[1..j] 表示 s k + 1 s&#x27;_{k&#x27;+1} 的一個字首.
根據定義, s i &lt; s k + 1 [ 1.. j ] s k + 1 s i &lt; s i s_i&lt;s&#x27;_{k+1}[1..j]\leq s&#x27;_{k+1}\leq s&#x27;_i&lt;s_i .
證畢.


四.Duval演算法.

Duval演算法是用來線上性求解拆分方式的一種演算法,它需要用到下面這個性質2
當字串s與字元c組成的字串sc是某個Lyndon串的字首時,對於字元 d &gt; c d&gt;c 滿足sd為Lyndon串.

證明如下:
首先顯然對於一個Lyndon串的字首s s s [ i . . s + 1 ] s\leq s[i..|s|+1] ,即s小於等於它的所有後綴.
所以s與sc必然都滿足小於等於它們的所有後綴,加入一個大於c的字元自然也就變成了Lyndon串.
證畢.

那麼我們就可以開始講解Duval演算法了,Duval演算法只需要維護三個指標i,j,k就可以求出一個串的Lyndon分解.

首先,i表示當前未確定拆分的第一個點,即 s [ 1.. i 1 ] s[1..i-1] 已經被確定了拆分方式.

然後,我們設 s [ i . . k 1 ] = t 1 t 2 . . t h v s[i..k-1]=t_1t_2..t_hv ,其中 t 1 = t 2 = . . . = t h t_1=t_2=...=t_h 都是Lyndon串,v必須是一個 t i t_i

相關推薦

Lyndon word問題的Duval演算法入門

一.Lyndon串的定義. 對於兩個串s1與s2,令 n = ∣

針對初學者的A*演算法入門(附帶Java原始碼)

      英文題目,漢語內容,有點掛羊頭賣狗肉的嫌疑,不過請不要打擊我這顆想學好英語的心。當了班主任我才發現大一18本書,11本是英語的,能多用兩句英語就多用,個人認為這樣也是積累的一種方法。      Thanks open source pioneers dedicated to computer s

目標跟蹤演算法——KCF入門

一直以來沒有很想寫這個,以為這個東西比較簡單,還算是比較容易理解的一個演算法,但是在知乎上回答過一個問題之後就有朋友私信我一些關於細節的東西,我一直以為關於細節的東西大家可以自己去理解,大家都是想快速瞭解這個,那我就厚臉皮了在這寫一下自己的見解了,如果有寫的不詳細或者大家想了解的東西沒寫到的都可以留言,我

Asp.Net MVC3 簡單入門過濾器Filter

添加 重復 權限 組件 再次 ace text ext 開發 前言 在開發大項目的時候總會有相關的AOP面向切面編程的組件,而MVC(特指:Asp.Net MVC,以下皆同)項目中不想讓MVC開發人員去關心和寫類似身份驗證,日誌,異常,行為截取等這部分重復的代碼,那我們可以

線段樹 入門

ear 接下來 數組 編譯器 一位 離散化 都是 並且 建立 概念(copy度娘): 線段樹是一種二叉搜索樹,與區間樹相似,它將一個區間劃分成一些單元區間,每個單元區間對應線段樹中的一個葉結點。 使用線段樹可以快速的查找某一個節點在若幹條線段中出現的次數,時間復雜度為O

PHP基礎入門(一)【世界上最好用的編程語言】

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

Selenium Grid分布式測試入門

lena 客戶端 odi before ons cycle lean efault 命令 本文對Selenium Grid進行了完整的介紹,從環境準備到使用Selenium Grid進行一次完整的多節點分布式測試。 運行環境為Windows 10,Selenium版本為

無向圖的割頂和橋,無向圖的雙連通分量入門及模板 -----「轉載」

dbr break nts word 否則 mark push gravity 無向連通圖 https://blog.csdn.net/stillxjy/article/details/70176689 割頂和橋:對於無向圖G,如果刪除某個節點u後,連通分量數目

linux三劍客之sed入門

linux 三劍客 sed sed介紹sed流編輯器(stream editor),在三劍客中排行老二,是一款簡單的文本編輯語言。sed並不直接處理源文件,而是逐行讀取源文件的內容到內存(稱模式空間)中,然後在模式空間中使用sed命令處理,再打印模式空間處理後的內容到標準輸出。sed的能夠實現的功

生成函數(母函數)入門

參考 nsh 意義 數值 tar 得到 再次 fin 表達式 本文章從以上兩位大佬的博客參考而來!再次感謝! 母函數,又稱生成函數,是ACM競賽中經常使用的一種解題算法,常用來解決組合方面的題目。 在數學中,某個序列的母函數(Generating funct

樹鏈剖分入門

管理 組成 你們 其它 現在 範圍 pro 所有 關系 樹鏈剖分入門詳解 以前沒有接觸過樹鏈剖分的同學們看到這個東西是不是覺得很高大上呢,下面我將帶你們進入樹的世界(講得不好別打我) 首先我們來看一道題 NOI2015D2T2軟件包管理器 題目描述如下 Linux用戶和O

深度學習——優化器演算法Optimizer(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

在機器學習、深度學習中使用的優化演算法除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢,又該怎麼選擇呢? 在 Sebastian Ruder 的這篇論文中給出了常用優化器的比較,今天來學習一下:https://arxiv.org/pdf/160

區塊鏈以及區塊鏈技術入門(2)

很多人迷惑於區塊鏈和以太坊,不知如何學習,本文簡單說了一下學習的一些方法和資源。 一、    以太坊和區塊鏈的關係      從區塊鏈歷史上來說,先誕生了比特幣,當時並沒有區塊鏈這個技術和名詞,然後業界從比特幣中提取了技術架構和體系,稱

區塊鏈以及區塊鏈技術入門(1)

區塊鏈是目前一個比較熱門的新概念,蘊含了技術與金融兩層概念。從技術角度來看,這是一個犧牲一致性效率且保證最終一致性的的分散式的資料庫,當然這是比較片面的。從經濟學的角度來看,這種容錯能力很強的點對點網路,恰恰滿足了共享經濟的一個必須要求——低成本的可信環境。 1. 技術人員看待區塊鏈的正確姿勢

主席樹入門+題目推薦

主席樹學名可持久化線段樹,就是這個可持久化,衍生了多少資料結構 為什麼會有主席樹這個資料結構呢?它被髮明是用來解決什麼問題的呢? 給定n個數,m個操作,操作型別有在某個歷史版本下單點修改,輸出某個歷史版本下某個位置的值的值,n和m小於等於1e6 乍一看是不是一點頭緒也沒有。我們先來想想暴力怎麼

經典ASP NET MVC3 0入門

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

R語言 apriori演算法案例

轉載自http://blog.csdn.net/gjwang1983/article/details/45015203 1.概念 1.1 引論 關聯規則(AssociationRules)是無監督的機器學習方法,用於知識發現,而非預測。 關聯規則的學習器(learner)無

lambda表示式入門

轉自 2018-03-02 Sevenvidia 碼農翻身 1、什麼是Lambda? 我們知道,對於一個Java變數,我們可以賦給其一個“值”。   如果你想把“一塊程式碼”賦給一個Java變數,應該怎麼做呢?  比如,我想把右邊那塊程式碼,賦給一個叫做aBlo

知識:整合營銷新手入門

現在很多企業會提到整合營銷的概念。從字面理解,可能是把各種企業資源柔和在一起,發揮各自的最大化效益。整合營銷的目的是把現有的各種營銷方式進行合理化“加工”以後,再服務於企業的一種營銷策略。然而,在企業實際操作過程中,大部分經營者曲解了整合營銷的出發點,知道整合營銷很好,都在積極嘗試,但在嘗試

Spring Security 入門

Spring Security 入門詳解   1.Spring Security介紹 Spring Security是基於spring的應用程式提供宣告式安全保護的安全性框架,它提供了完整的安全性解決方案,能夠在web請求級別和方法呼叫級別 處理身份證驗證和授權.它充分使用了依