クヌース–モリス–プラット法

クヌース–モリス–プラット法(Knuth–Morris–Pratt algorithm、KMP法と略記)とは、文字列検索アルゴリズムの一種。テキスト(文字列)Sから単語Wを探すにあたり、不一致となった位置と単語自身の情報から次に照合を試すべき位置を決定することで検索を効率化するアルゴリズムである。

このアルゴリズムは1977年ドナルド・クヌースと Vaughan Pratt および(単独で)J. H. Morris が発明し、3人共同で発表した。

本項目では文字列を表すにあたって、0 からインデックスを開始する配列を用いる。従って(後述の)単語 W 内の文字 'C'W[2] と表される。

KMP法

この検索アルゴリズムの実施例

実際にこのアルゴリズムがどのように動作するかを見てみよう。このアルゴリズムの状態は二つの整数 mi で表される。m はテキスト S 内の文字の位置であり、単語 W にマッチする可能性のある位置でもある。i は、その時点で照合中の W 内の文字の位置を示す。検索開始時点の状態は以下のように表される。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

まず、上記の状態で W の先頭と S の先頭から照合していく。この例では4文字目の照合で S[3] が空白、W[3] = 'D' となるため、不一致となる。W 内でそこまでに照合された範囲で 'A' が 0 番目にしかないことから、そこまで照合した S の範囲内に 'A' が出現しないことは明らかである。つまり、S[1] から S[3] までは W[0] とマッチすることはない。そのため、次の照合を単純に S[1] から開始するのではなく、m = 4 および i = 0 として次の照合を開始する。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W:     ABCDABD
i:     0123456

ここで、"ABCDAB" までマッチすることがわかるが、W[6] (S[10]) で不一致となる。しかし、前回の不一致とは異なり、"AB" が2回出現していることに注意が必要である。この範囲での2回目の "AB" は W の先頭ともマッチするので、ここでは m = 8 および i = 2 として照合を再開する。これにより S の事前にマッチした文字列の照合を省くだけでなく、W 内の照合済み文字列の照合も省略している。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W:         ABCDABD
i:         0123456

今回の照合は即座に失敗し、次の照合は m = 11 および i = 0 として再開する。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W:            ABCDABD
i:            0123456

ここでも "ABCDAB" までマッチしていることが明らかとなるが、次の一文字は 'C' であり、W 内の次の文字 'D' と不一致となる。前述の場合と同様 "AB" が2回マッチしているので、m = 15 および i = 2 として検索を行う。

m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W:                ABCDABD
i:                0123456

ここで完全に照合でき、その際の最初の文字の位置は S[15] となる。

この検索アルゴリズムの擬似コードと解説

前述の実施例はこのアルゴリズムのあらゆる要素を含んでいる。ここで、現在の照合が不一致に終わった際に次の照合の開始時点で参照する「部分マッチ」テーブル T を使用するものとする(後述)。T のエントリは、S[m] から照合して S[m + i]W[i] が不一致となった際に次に照合を開始すべき位置を Sm + i - T[i] 番目とするよう設定される(つまり、T[i] は不一致の際のバックトラッキングを示す)。これには2つの意味がある。第一に T[0] = -1W[0] が不一致の場合にバックトラックできず単に次の文字を照合すべきであることを示す。第二に m + i - T[i] が次の照合のインデックスとなるが、その先頭 T[i] 個の文字を照合する必要はなく、照合は W[T[i]] からでよい。以下の擬似コードは KMP法の実装例である。

algorithm kmp_search:
    input:
        an array of characters, S (検索対象のテキスト)
        an array of characters, W (単語)
    output:
        an integer (W が見つかった際の S 内の位置。ただし先頭文字は 0番目とする)

    define variables:
        an integer, m ← 0 (S 内の現在照合中の開始位置)
        an integer, i ← 0 (W 内の現在位置)
        an array of integers, T (テーブル。他で事前に構築される)

    while m + i is less than the length of S, do:
        if W[i] = S[m + i], let i ← i + 1
            if i equals the length of W, return m
        otherwise, let m ← m + i - T[i], and if i > 0, let i ← T[i]

    (W が S 内に見つからなかった場合)
    return the length of S

この検索アルゴリズムの効率

テーブル T が事前に用意されているとした場合、クヌース-モリス-プラット法の検索部分の計算量O(k)(ここで kS の長さ)となる。関数呼び出しに関わる固定オーバヘッド部分を除くと、全ての計算は while ループ内で行われるため、このループの繰り返し回数の上限が計算量となる。ここで T の性質が重要となる。S[m] から開始された照合が S[m + i]W[i] の不一致で失敗したとき、次の照合は S[m + (i - T[i])] から開始される。次の照合は m 以降のインデックスから開始される必要があるため、T[i] < i が成り立つ。

このことから、ループが最大 2k 回繰り返されることがわかる。繰り返しのたびにループ内の2つの分岐のいずれかが実行される。最初の分岐では、常に i をインクリメントして m をそのままとし、インデックス m + i を変化させることで S 内の文字を調べていく。次の分岐では i - T[i]m に加算する。前述の通り、この加算する値は常に正の値である。従って、照合開始位置 m は増加していく。ループの終了は m + i = k となったときである。従ってループ内の各分岐は k 回実行され、各分岐は m + im のいずれかを増加させる。ここで、m ≤ m + i である。m = k となったとき、m + i ≥ k なので、それ以前のいずれかの時点で m + i = k となっているはずである。従っていずれにしても処理は終了する。

以上からループの繰り返し回数は最大でも 2k 回であり、この検索アルゴリズムの計算量は O(k) となる。

「部分マッチ」テーブル

このテーブルの目的は S 内の各文字を複数回照合することを防ぐことである。線形検索の性質として、パターンの先頭とマッチする文字列に遭遇したとき、次の照合を開始すべき位置を与えることで複数回照合を防ぐことができる。換言すれば、パターン内を事前に検索して照合する必要のない文字数を各文字位置に対応して算出しておくのである。

ここで W の各文字位置で不一致が発生したとき、その直前の位置の文字列と W の先頭からの文字列が一致している場合、そのサブ文字列の長さのぶんだけバックトラックする。従って、T[i] の値は W の先頭からの文字列と W[i - 1]で完了する文字列が一致している長さに対応する。ここで空の文字列の長さを 0 とする。単語の先頭で不一致となる場合は特殊ケースであり(バックトラックできないため)、T[0] = -1 とする。

テーブル生成法の実施例

W = "ABCDABD" の例を考えてみよう。まず T[0] = -1 とする。T[1] は単語の2文字目で不一致となった場合のバックトラックする文字数であるが、1文字しか一致していない状態ではバックトラックできないので、T[1] = 0 となる。

T[2] は、そこまでの文字列 "AB" にその文字列の先頭部分と等しいサブ文字列がないため T[2] = 0 となる。

T[3] についても同様の判定を行う。つまり、T[i] を検討する場合、W[0] から W[i-1] までの文字列について、W[i-1] で終わる文字列と W[0] から始まる文字列が一致するかどうかを調べる。しかし、長さ 2 の文字列(考えられる最長のサブ文字列)が一致するなら、それは T[2] の段階で見つかっていたはずである。従って長さ 2 のサブ文字列はありえない。また、長さ 1 では "C" は "A" とは一致しない。以上のことから T[3] = 0 とする。

次に W[4] つまり 'A' を渡す。同様の考え方で考慮すべき最長のサブ文字列の長さは 1 であり、この場合 'A' は単語の先頭と一致している。しかし、テーブルには現在位置の「直前」のサブ文字列長を格納するので、T[4] = 0 となる。

次に W[5] を調べると 'B' である。ここで W[4] から W[5] のサブ文字列は単語の先頭サブ文字列に等しい。従って W[5] で不一致となった場合に W[4] 以前に対応する部分を再度照合する必要はない。そこで T[5] = 1 となる。

現在注目している W[4] = 'A' から始まる文字列の次の文字は 'B' であることが期待されるが、これは W[5] と等しい。さらに前述の通り W[6] のためのサブ文字列を探索するのに W[4] より前を考慮する必要はない。従って、T[6] = 2 となる。

以上から、この場合のテーブルは以下のように生成される:

i 0 1 2 3 4 5 6
W[i] A B C D A B D
T[i] -1 0 0 0 0 1 2

テーブル生成法の擬似コードと解説

上述の実施例はテーブル生成の一般的な技術を説明している。基本的にそれが全てである。ある位置に到達したとき、すべきことは既に完了している。複雑化させる小さな問題は先頭で間違ってサブ文字列を与えてしまうことである。これに対処するにはちょっとした初期化コードが必要となる。

algorithm kmp_table:
    input:
        an array of characters, W (解析すべき単語)
        an array of integers, T (生成すべきテーブル)
    output:
        nothing (ただし、処理を行うことでテーブルの中身が書き込まれる)

    define variables:
        an integer, i ← 2 (T の中で現在計算している位置)
        an integer, j ← 0 (現在見ているサブ文字列の次の文字のインデックス。0から始まる)

    (先頭ふたつの値は固定。ただしアルゴリズムの実装によっては具体的値は異なる)
    let T[0] ← -1, T[1] ← 0

    while i is less than the length of W, do:
        (第一の場合: サブ文字列は継続中)
        if W[i - 1] = W[j], let T[i] ← j + 1, i ← i + 1, j ← j + 1

        (第二の場合: サブ文字列は継続しないが、フォールバック可能)
        otherwise, if j > 0, let j ← T[j]

        (第三の場合: 対象をはみ出した。このとき j = 0)
        otherwise, let T[i] ← 0, i ← i + 1

テーブル生成法の効率

テーブル生成アルゴリズムの計算量は O(n)(ここで nW の長さ)である。初期化コードを除くと処理は全て while ループ内で行われるので、このループを O(n) 回実行することを示せばよい。これは ii - j の値を考えていくことで明らかとなる。第一の分岐では i - j は変化せず、ij が同時にインクリメントされる。第二の分岐では jT[j] で置換される。これは既に述べたように j より常に小さい。従って i - j は増加する。第三の分岐では、i だけがインクリメントされる。つまり、ii - j も増加する。i ≥ i - j であるので、これは各段階で ii の下限が増加するのと同じことである。このアルゴリズムは i = n となったとき終了し、i - j の初期値は 1 なので、ループは最大で 2n 回くりかえされる。以上からテーブル生成アルゴリズムの計算量は O(n) となる。

KMP法の効率

このアルゴリズムの各部分は(上述の通り)それぞれ O(k)O(n) の計算量があるので、全体としての計算量は O(n + k) となる。

先述の実施例でも明らかなように、文字をスキップできればできただけ単純な文字列検索アルゴリズムよりも有利となる。つまり、バックトラックがない方が好ましい。換言すれば T が全て 0 になっていればよい。従って "ABCDEFG" のような単語ではこのアルゴリズムは最も効率的に動作し、その際のテーブルは先頭が -1 でそれ以外は全て 0 となっている。逆に W = "AAAAAAA" のような場合は最悪である。このときのテーブルは以下のようになる。

i 0 1 2 3 4 5 6
W[i] A A A A A A A
T[i] -1 0 1 2 3 4 5

これは T の最悪のパターンであり、S = "AAAAAABAAAAAABAAAAAAA" といった単語にもあてはまる。S の中に "AAAAAAB" が出現する頻度が多いほど繰り返し回数が増える。この単語のテーブル生成は高速となるが、検索は複数回行われる可能性があるのに対して、テーブル生成は1回だけである。従って、このような単語を検索する場合、このアルゴリズムの性能は低下する。ちなみに、このような文字列はボイヤー-ムーア法では最高の性能となる。KMP法は最良でも最悪でも線形時間で検索が完了するのに対して、ボイヤー-ムーア法は最良と最悪で大きく時間が異なる。

外部リンク

参考文献

  • Thomas H. Cormen; Charles E. Leiserson, Ronald L. Rivest, Clifford Stein (2001年). “Section 32.4: The Knuth-Morris-Pratt algorithm”. Introduction to Algorithms (Second edition ed.). MIT Press and McGraw-Hill. pp. pp923-931. ISBN 0262032937 

Read other articles:

Payment networks linked to payment cards This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Card scheme – news · newspapers · books · scholar · JSTOR (July 2021) (Learn how and when to remove this template message) Card schemes are payment networks linked to payment cards, such as debit or credit cards, of whic...

Усов Анатолій МиколайовичДата народження 21 вересня 1940(1940-09-21) (83 роки)Місце народження Горький, РРФСР, СРСРГромадянство  СРСР РосіяAlma mater Нижньогородський державний університет імені М. І. ЛобачевськогоПрофесія сценаристIMDb ID 0882409 У Вікіпедії є статті про інших лю�...

Cole 2013 Cole 2006 Lily Luahana Cole (* 27. Dezember 1987 in Torquay, England) ist ein britisches Model. Cole hat auch als Schauspielerin Bekanntheit erlangt, so übernahm sie 2008 die weibliche Hauptrolle in Terry Gilliams Film Das Kabinett des Doktor Parnassus. Inhaltsverzeichnis 1 Leben 2 Filmografie (Auswahl) 3 Musikvideos 4 Einzelnachweise 5 Weblinks Leben Cole 2006 auf der London Fashion Week Cole wuchs in London auf. Sie wurde im Alter von 14 Jahren in einem Fast-Food-Restaurant in So...

العلاقات المالديفية الإسبانية جزر المالديف إسبانيا   المالديف   إسبانيا تعديل مصدري - تعديل   العلاقات المالديفية الإسبانية هي العلاقات الثنائية التي تجمع بين المالديف وإسبانيا.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولت�...

Élisabeth de GramontDuchess of Clermont-TonnerrePhotograph of Elisabeth de Gramont by NadarBornAntonia Corisande Élisabeth de Gramont23 April 1875Nancy, French Third RepublicDied6 December 1954Paris, FranceBuriedAncy-le-FrancNoble familyde GramontSpouse(s)Philibert, Duke of Clermont-TonnerreFatherAgénor, 11th duc de GramontMotherPrincesse Isabelle de Beauvau-CraonOccupationAuthor Antoinette Corisande Élisabeth, Duchess of Clermont-Tonnerre (née de Gramont; 23 April 1875 – 6 Decembe...

Ісландська літературна премія Дата створення / заснування 1989 Країна  Ісландія Ісландська літературна премія (ісл. Íslensku bókmenntaverðlaunin) — це нагорода, яку щороку присуджує Ісландська спілка видавців за три книги в рік. Премія була заснована на сторіччя асоціації у 1989...

Administrative division in southwestern Japan during the Edo period (1600-1871) Imabari Domain今治藩Domain of Japan1636–1871Imabari Castle Mon of the Hisamatsu-Matsudaira clan CapitalImabari CastleArea • Coordinates34°3′48.01″N 133°0′24.5″E / 34.0633361°N 133.006806°E / 34.0633361; 133.006806 HistoryHistorical eraEdo period• Established 1636• Abolition of the han system 1871 Contained within • ProvinceIyo Toda...

Historic site in HelstonHelston Coinage HallView looking up Coinagehall Street, Helston, where the coinage hall would have stood prior to 1796.LocationHelstonOS grid referenceSW 6573 2741Built1557Built fortin coinageDemolished1796Architectural style(s)Chantry The Helston Coinage Hall was a Tudor coinage hall created for the purposes of tin coinage out of a 13th century chapel of ease.[1] Its position lay at the southern end of Coinage Hall Street, opposite the Helston Castle.[2 ...

Korps Marinir BelandaKorps MariniersLambang Korps Marinir BelandaNegara BelandaCabang Angkatan Laut Kerajaan BelandaTipe unitMarinirJumlah personelsekitar 2.300 personelBagian dariAngkatan Bersenjata BelandaGarnisun/MarkasGrup Tempur Laut – DoornNLMARSOF – Doorn & Den HelderSkuadron Serbu 32 – ArubaGrup Pelatihan dan Penyerangan Permukaan (SATG) – TexelJulukanSetan HitamMotoQua Patet OrbisSejauh Dunia MembentangPertempuran Daftar pertempuran Perang Inggris-Belanda KeduaPerang...

PlayCanvasThe PlayCanvas web-based Editor and example of a 3d application in-developmentDeveloper(s)Will Eastcott, Dave Evans, Vaios Kalpias Ilias, Kevin Rooney, Maksims MihejevsRepositorygithub.com/playcanvas/engineWritten inJavaScriptOperating systemOS independentPlatformCross-platformTypeHTML5 3D engineLicenseMIT LicenseWebsiteplaycanvas.comAs ofJuly 2014 PlayCanvas is an open-source[1] 3D game engine/interactive 3D application engine alongside a proprietary cloud-hosted creation p...

Sculptures de la maison de l'eau Le parc des Tanneries, la nuit La ville du Mans est traversée par deux cours d'eau: la Sarthe et l'Huisne. Les romains construisirent les premiers aqueducs de la ville au cours du Ier siècle de notre ère. Un port de commerce primitif fut installé, certainement sur la rive gauche de la Sarthe. Cet axe finit par devenir entièrement navigable au cours du XIXe siècle, avant d'être supplanté par les voies ferroviaires. La Sarthe fut toujours privi...

This article is about the town in Uganda. For the company whose stock ticker is PARAA, see Paramount Global.Place in Northern Uganda, UgandaParaaParaaLocation in UgandaCoordinates: 02°18′00″N 31°33′00″E / 2.30000°N 31.55000°E / 2.30000; 31.55000Country UgandaRegionNorthern UgandaSub-regionAcholi sub-regionDistrictNwoya DistrictElevation2,230 ft (680 m) Paraa is a location in Northern Uganda. Location Paraa is located in Nwoya District, Acholi sub-...

Television channel TMFCountryBelgiumBroadcast areaFlandersNetworkVIMN BelgiumHeadquartersAntwerpProgrammingPicture format16:9 576i (SDTV)OwnershipOwnerViacom International Media Networks Northern EuropeSister channelsComedy CentralSpikeMTVNickelodeonNick Jr.NicktoonsNick HitsHistoryLaunched3 October 1998Closed1 November 2015Replaced byComedy Central going 24 HoursLinksWebsitewww.tmf.beAvailability (channel space shared with Comedy Central)Streaming mediaYelo TVWatch LiveTV OveralWatch Live TM...

Species of moth Gazoryctra mathewi Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Arthropoda Class: Insecta Order: Lepidoptera Family: Hepialidae Genus: Gazoryctra Species: G. mathewi Binomial name Gazoryctra mathewi(W.H. Edwards, 1874)[1] Synonyms Epialus mathewi W.H. Edwards, 1874 Gazoryctra matthewi Gazoryctra mathewi, or Matthew's ghost moth, is a moth of the family Hepialidae. It is known from western North America, including British Columbia, Washingt...

Roman Catholic diocese in the Philippines Diocese of San PabloDioecesis Sancti Pauli in Insulis PhilippinisDiyosesis ng San Pablo Diócesis de San PabloCatholic San Pablo CathedralCoat of armsLocationCountryPhilippinesTerritoryLagunaEcclesiastical provinceManilaMetropolitanManilaStatisticsArea1,918 km2 (741 sq mi)Population- Total- Catholics(as of 2021)3,748,0003,036,000[1] (81%)Parishes92Schools37InformationDenominationCatholic ChurchSui iuris churchLati...

1966 greatest hits album by Martha and the VandellasGreatest HitsGreatest hits album by Martha and the VandellasReleasedMay 4, 1966Recorded1963 – 1966GenreSoulLength33:29LabelGordyProducerWilliam Mickey StevensonHolland–Dozier–HollandMartha and the Vandellas chronology Dance Party(1965) Greatest Hits(1966) Watchout!(1966) Singles from Greatest Hits Quicksand / Darling, I Hum Our SongReleased: November 4, 1963 Live Wire / Old Love (Let's Try Again)Released: January 17, 1964 In My...

Map of Romania This is a list of municipalities in Romania which have standing links to local communities in other countries known as town twinning (usually in Europe) or sister cities (usually in the rest of the world). A Aiud[1] Cherepovets, Russia Cusset, France Dingelstädt, Germany Gyomaendrőd, Hungary Megara, Greece Ponte de Sor, Portugal Siklós, Hungary Soltvadkert, Hungary Alba Iulia[2] Aigio, Greece Alcalá de Henares, Spain Alessandria, Italy Arnsberg, Germany Biog...

Indian politician Ram Ratan RamRam speaking at the Kremlin, Russia at 70th anniversary celebrations of the October Revolution in 1987Member of Parliament, Lok SabhaIn office1984–1989Preceded byRam Vilas PaswanSucceeded byRam Vilas PaswanConstituencyHajipur, Bihar Personal detailsBorn(1921-03-24)24 March 1921Ranchi, Bihar, British India (now Jharkhand, India)Died20 August 2002(2002-08-20) (aged 81)New DelhiPolitical partyIndian National CongressSpouseBina DeviSource: [1] Ram Ratan Ram (...

1993 studio album by Dragana MirkovićNo. 10Studio album by Dragana MirkovićReleased1993GenreFolk, EuropopLabelZaMDragana Mirković chronology Dolaze nam bolji dani(1992) No. 10(1993) Nije tebi do mene(1994) No. 10 is the tenth studio album by Serbian singer Dragana Mirković. It was released in 1993.[1] Track listing Do poslednjeg daha (To the last breath) Pitam svoje srce (I ask my heart) Baš tebe volim ja (You're the one I love) Mnogo sam te poželela (I've missed you so ...

東京臨海副都心 > 青海 (江東区) > 水の広場公園 東京臨海副都心 > 有明 (江東区) > 水の広場公園 水の広場公園Mizu-no-hiroba Park[1] 水の広場公園(海沿いの遊歩道)分類 ふ頭公園所在地 日本東京都江東区青海一丁目、二丁目 東京都江東区有明三丁目面積 78,387.11m2開園 1996年4月1日運営者 東京臨海副都心グループアクセス 青海駅より徒歩1分 東京�...