正規表現パート2 NFAエンジンの場合は、 正規表現の磨き上げが必要?.

Slides:



Advertisements
Similar presentations
UGUI を 使ってみよう ( 導入・紹介?編 ) 1. uGUI とは O Unity 4.6 から使えるようになった UI (ユー ザーインターフェース)システム O 8 月: Unity4.6 β uGUI 試用版公開 O 11 月: Unity4.6 uGUI 正式版公開 正式版公開で、 機能紹介ブロ.
Advertisements

プログラミング論 第八回数字の計算,整数の入出力. 本日の内容 前回の課題(続き) 前回の課題(続き) 数字の計算をする 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメン ト演算子.
1 通信教育学部 コンピュータ演習 Excel の書式設定と関数 授業ページ「コンピュータ演習(通信教育学 部)」を 開いてください。提出課題の一覧が掲載されてい ます。
【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”.
到着時刻と燃料消費量を同時に最適化する船速・航路計画
Windows HPC Server を使ってみる
本日のスケジュール 14:45~15:30 テキストの講義 15:30~16:15 設計レビュー 16:15~16:30 休憩
第11章 プレゼンテーションの基本スキル 1 プレゼンテーションとは 2 プレゼンテーションの種類と特徴 3 プレゼンテーションツール
数当てゲーム (「誤り訂正符号」に関連した話題)
Regex takatosi.
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
JavaScript プログラミング入門 2006/11/10 神津.
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
Ⅰ.電卓キーの基本的機能 00 0 1 2 3 6 ⑤ 4 9 8 7 M- MR MC + × % M+ - = ÷ C √ +/- GT
コンパイラ 2011年10月17日
オブジェクト指向プログラミング(4) 静的分析(2)
Shimatterシステムの 初期モデルの正規化
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
フィードバック型復習 理数系科目の成績を大きく伸ばす方法 東大理数学院 塾長 西村 太一.
Chapter5 ステートチャート図 FM 于 聡.
JavaによるCAI学習ソフトウェアの開発
Lightweight Language Weekend ls-lRシェル
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
5.ブログの有効活用 プレゼンテーション資料 「ネット社会の歩き方」レッスンキット プレゼンテーション資料集
計算の理論 I ー DFAとNFAの等価性 ー 月曜3校時 大月 美佳.
クイズ 「インターネットを使う前に」 ネチケット(情報モラル)について学ぼう.
記 憶 管 理(2) オペレーティングシステム 第10回.
RAD Studio 14/09/27 TEffectを使った綺麗なForm
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
第6章 2重ループ&配列 2重ループと配列をやります.
9.NP完全問題とNP困難問題.
平成22年度に実施を予定するインターネットを 用いた研修システムによる研修 ライブ配信受講手順書
Powerpoint でプレゼンテーション
コンパイラ 2012年10月15日
第20章 Flyweight ~同じものを共有して無駄をなくす~
情報 第2回:状態遷移 その2.
形式言語とオートマトン Formal Languages and Automata 第4日目
形式言語とオートマトン Formal Languages and Automata 第4日目
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
Xenによる ゲストOSの監視に基づく パケットフィルタリング
プログラミング 平成23年12月21日 森田 彦.
形式言語とオートマトン Formal Languages and Automata 第4日目
伺かのための三角関数講座  うかべん大阪# /05/03
第6回:ラケットを動かそう! (キーボードによる物体の操作)
Excelを便利にする250以上の機能を体系化したアドインはこちらです。
次ページボタン ではなく、 画面をクリックする 「PPT アニメーション機能」で ご覧下さい。
・タイプ別のフレームワーク ・デジタルTips(小技テクニック情報)
正多角形の作図 プログラミングで多角形を描く方法を考えよう 1時間目.
数独の解生成と 解に対する番号付け 理学部 情報科学科 渡辺研究室 戸神星也.
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
からだをまもる免疫のふしぎ (日本免疫学会:羊土社).
長さの制限付きギャップと 文字クラスを含むパタンに対する 照合アルゴリズムの改善
平成26年4月22日(火) 東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I 決定性有限オートマトン(DFA) と 非決定性有限オートマトン(NFA)
第16章 動的計画法 アルゴリズムイントロダクション.
プログラミング入門 電卓を作ろう・パートI!!.
計算の理論 I ー正則表現とFAの等価性ー 月曜3校時 大月 美佳.
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
問題 あなたはポケモンGOをやっています. これから5か所のポケモンの巣(ポケモンがよく出る場所)を回って レアポケモンを捕まえに行こうと思っています. しかし,持ち物を見たらハイパーボール1つしかありませんでした. なるべくCPが高い(強い)レアポケモンを 捕まえたいのですが, 何か所目で捕まえれば.
第6回:得点を表示しよう! (文字の表示、乱数)
情報処理Ⅱ 2006年11月24日(金).
4.プッシュダウンオートマトンと 文脈自由文法の等価性
データベース第3回目 意味ごとにテーブルを分ける
わかりやすいパターン認識 第6章 特徴空間の変換 6.5 KL展開の適用法 〔1〕 KL展開と線形判別法 〔2〕 KL展開と学習パターン数
ネットワークプログラミング 05A1302 円田 優輝.
テクニカル・ライティング 第4回 ~文章の設計法「KJ法」について~.
※別途 メリットカード&デメリットカードを印刷して準備してください。
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

正規表現パート2 NFAエンジンの場合は、 正規表現の磨き上げが必要?

覚えていないと思うので・・・おさらい まずは、 DFA(テキスト主導型)エンジン バックトラックが持つ効率の悪さを回避する為に 全ての可能性のあるマッチを同時に管理することによって、高速処理を実現するエンジン 管理用のマップを作るため、場合により時間がかかり、メモリが必要になる

語ると長いのでざっくりNFA NFA(正規表現主導型)エンジン バックトラックを根幹にもつエンジン *POSIX NFA 最長のマッチを返さなくてはならない *従来型NFA   正規表現主導型の性質を利用して、どのようなマッチを望むか性格に指定できる ※ 覚える必要はないですが・・・ 記憶のない人は、前回の資料を見て下さい。

バックトラックと効率化 バックトラック機能のあるNFAエンジンの場合 選択肢が発生した場合、その位置に戻れるよう ぱんくずのように戻り位置を記録していく方法を採用している 分かりにくいので例を次に示します。

もしかして・・・バックトラック減らしたら効率化? つまり 斜めの線の→が入っている箇所が 選択によるバックトラックが発生する位置 バックトラックが多いですね。 もしかして・・・バックトラック減らしたら効率化?

こうしたら、バックトラック減らせる? 減らせそうですが・・・どうでしょう?

考えるべきこと 変更によってメリットがあるか否かは 以下を考える必要があります。 エンジンの違いによって得られる効果は同じか この変更が効果をはっきするのは、どんなときか

エンジンタイプによる効果のちがい POSIX NFAエンジンタイプ この変更による効果はほとんどありません。理由は、正規表現が方言できる全ての順列が試されるので、選択肢の順序をどの順番で為そうと関係がない為です。 従来型NFA すぐにマッチに結びつくような選択肢の並べ方をすれば、最初のマッチが見つかったところでエンジンが停止するので効果があります。

マッチ結果による効果の違い この変更によって処理がはやくなるのは、マッチが有る時だけに限られます。従来型NFAがマッチ不成功を報告するのは、正規表現が表現できる全ての順列を試してからです。 よって、最終的にマッチ不成功になったからには、全ての順列を試し済みなので、順番を変えても意味がありません。

まとめ NFAエンジンの場合 マッチするパターンにおいて、バックスラッシュの回数を減らすことはパフォーマンス向上につながる

さらに良い方法とは 文字のひとつひとつを反復処理(循環処理)しなければならない。ここにオーバーヘッドがかかる。 この部分を削減できれば、効率手的な正規表現となる。 ではどうするか・・・

さらに、もっと良い方法 元々(上段)を下段のように変更するとバックスラッシュを抑えることができる 「[^\\”]」は、通常の文字列にマッチするので 「[^\\”]+」を使えば、(...)*の1回分で1度に読める通常の文字をまるまる読み込める →バックトラックを削減し、スターによる反復処理も最小限!

話は飛びますが・・・ 正規表現にはいろいろな書き方があるお話は前回しました。 例えば a, b, c, d, e, f, g のどれかに一致する文字は、 [a-g] という文字クラスを使う方法のほか a|b|c|d|e|f|gという書き方もできますね。 さて・・・どっちが早いのでしょう?

そうだ、ベンチマークテストをやってみよう!

正規表現のベンチマークテスト方法 そもそもベンチマークテストとは? → ある仕事を行うのにどれくらい時間がかかるかを単純に計測すること 時間計測のためにすることは? システム時間を取得し、問題の処理を実行し、再度システムの時間を取得する この最初に取得したシステム時間と、次に取得したシステム時間のさが処理に要した時間となる

計測時の注意点 計測したい仕事の時間だけを計測する 十分な仕事を実行する (コンピュータが優秀すぎると比較できない) 正しい仕事を実行させる (オーバーヘッドを増やさない)

ベンチマークに使うコード(PHP版) $TimesToDo = 1000; // テスト文字列の準備 $TestString = ""; for ($i = 0; $i < 1000; $i++) { $TestString .= "abababdedfg"; } // 最初のテストの実行 $start = gettimeofday(); for ($i = 0; $i < $TimesToDo; $i++) preg_match('/^(a|b|c|d|e|f|g)+$/, $TestString); $final = gettimeofday(); $sec = ($final['sec'] + $final['usec']/1000000) - ($start['sec'] + $start['usec']/1000000); print("Alternation takes %.3f seconds\n", $sec); // 第二のテストの実行 preg_match('/^[a-g]+$/, $TestString); print("Character class takes %.3f seconds\n", $sec);

実際、自分では計測していませんが 環境にもよりますが 以下のような結果がでたそうです。 Alternation takes 27.404 seconds Character class takes 0.288 seconds ずいぶん違いますね。

なぜ? 「a|b|c|d|e|f|g」は、1つの開始位置で必ず7文字分のバックトラックが必要となり、マッチに達するまでに大量のバックトラックが必要になる 「[a-g]」は、次の位置でマッチするまで、1文字分前進のバックトラックしか発生させない為 正規表現の処理の高速化には、他にも色々ありますが、選択はNFAエンジンの場合、必ずバックトラックが増えるので注意が必要です。

皆さん、用法用量を正しく守って使いましょう。 Fin 皆さん、用法用量を正しく守って使いましょう。