SlideShare ist ein Scribd-Unternehmen logo
1 von 47
diff template library ,[object Object],[object Object]
自己紹介 ・名前 : 久保 達彦 ・ HatenaID:cubicdaiya ・ twitter:@cubicdaiya ・ HP:http://cccis.jp ・職業 : プログラマ,時々サーバ管理者
diff template library とは ,[object Object],[object Object],[object Object]
dtl-cpp ,[object Object],dtl という名前は既に使われていたので、 この名前に (_ _) プロジェクトページ
今日の朝、最新版 (1.08) をリリースしました。
dtlの特徴(1) ,[object Object],[object Object],[object Object],[object Object]
dtlの特徴(2) ,[object Object],[object Object],[object Object],[object Object],[object Object]
とりあえず 使ってみよう
二つの文字列の差分を取る
二つの int 型配列の差分を取る
template によって要素と要素列という形で抽象化されるので、 いろんな場面で活用できる ・文字列 ( 文字の列 ) ・ int 型の配列 ( 数値の列 ) ・テキストファイル ( 文字列から成る行の列 ) ・ etc
三つの文字列をマージする
変更箇所が衝突した場合
patch
dtlの内部構造
そもそもDiffとは? ,[object Object],[object Object]
Diff を取るというのは、 ,[object Object],[object Object],[object Object],↑ の 3 つを求めることと同義
A から B への変換を実現するための 要素の追加と削除の合計回数 2 つの要素列を A と B とする C: 共通 , D: 削除 , A: 追加  Levenstein Distance = A(n) + D(n) = 4 A(n) = 2, D(n) =2 Levenstein Distance abcdef -> acbedf C a D b C c D d A b C e A d C f
2 つの要素列を A と B とする C: 共通 , D: 削除 , A: 追加  LCS = (C a) + (C c) + (C e) + (C f) = acef LCS A と B の最長共通部分列 abcdef -> acbedf C a D b C c D d A b C e A d C f
2 つの要素列を A と B とする C: 共通 , D: 削除 , A: 追加  SES これ A から B への変換を 最小の編集回数で行うための手順 abcdef -> acbedf C a D b C c D d A b C e A d C f
エディットグラフ
エディットグラフ a b c d e f d a c f e a (0, 0) (M, N) x 軸 y 軸
[object Object],[object Object],[object Object],[object Object]
Diffとは
エディットグラフ上の点 (0, 0) から点 (M, N) (M=6, N=6) までの最短経路を求める問題 a b c d e f d a c f e a (0, 0) (M, N) x 軸 y 軸 コスト  =  編集距離
色んな Diff アルゴリズム ,[object Object],[object Object],[object Object],[object Object]
差分の計算はかなり重い処理なので効率的なアルゴリズムが必要
dtlにおける 差分の求め方
Wu のアルゴリズムを活用 ,[object Object],[object Object],[object Object],[object Object]
D = Δ + 2P ,[object Object],[object Object],[object Object],[object Object]
Δ = D a b c a b c d e f (3, 6) a (0, 0) Δ = 3
Δ ≠ D a b c d q q a b e f (0, 0) (4, 6) D=Δ の対角線からはみ出たらはみ出た分だけ戻ってこないといけない P Δ P
D=Δ+2P により、 探索範囲は以下のようになる (0, 0) (M, N) P Δ P ここまでが探索範囲
探索の仕方
 
[object Object],[object Object],[object Object],[object Object]
対角線k = y - x p (p, 0) k = -p p Δ k= Δ k= Δ+p (0, 0) (M, N) x y
Wu のアルゴリズムの実装例 ,[object Object]
その他の機能の実装 について ちょこっと紹介
diff3の実装
dtlのマージ手順 1.  要素列 B と A の差分を取る (SES を SES_BA とする )2.  要素列 B と C の差分を取る (SES を SES_BC とする )3. SES_BA と SES_BC を先頭から比較していき、 A と C の変更点が組み合わされた要素列 S を生成する
patch の実装
patch は SES を使えば簡単 擬似コードです
[object Object],[object Object],その他の diff ライブラリ
参考文献 ,[object Object]
最後に もし C++ で diff したくなったり、 必要になったら是非使ってみてください。 バグレポートやパッチも大歓迎↓ http://code.google.com/p/dtl-cpp [email_address]
ご静聴ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

円形アレイを用いた水平面3次元音場の収録と再現
円形アレイを用いた水平面3次元音場の収録と再現円形アレイを用いた水平面3次元音場の収録と再現
円形アレイを用いた水平面3次元音場の収録と再現Takuma_OKAMOTO
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へHiro H.
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」Hiro H.
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
Sort
SortSort
Sortoupc
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
OpenALの紹介
OpenALの紹介OpenALの紹介
OpenALの紹介K Moneto
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介mozk_
 
圏論 3分(?) クッキング
圏論 3分(?) クッキング圏論 3分(?) クッキング
圏論 3分(?) クッキングaiya000
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたKazuyuki TAKASE
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてってSusisu
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようHiro H.
 

Was ist angesagt? (20)

円形アレイを用いた水平面3次元音場の収録と再現
円形アレイを用いた水平面3次元音場の収録と再現円形アレイを用いた水平面3次元音場の収録と再現
円形アレイを用いた水平面3次元音場の収録と再現
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
表現行列の問題
表現行列の問題表現行列の問題
表現行列の問題
 
表現行列問題
表現行列問題表現行列問題
表現行列問題
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
 
python-geohex
python-geohexpython-geohex
python-geohex
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
Sort
SortSort
Sort
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
5 Info Theory
5 Info Theory5 Info Theory
5 Info Theory
 
OpenALの紹介
OpenALの紹介OpenALの紹介
OpenALの紹介
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
 
Ppt kasawaki
Ppt kasawakiPpt kasawaki
Ppt kasawaki
 
圏論 3分(?) クッキング
圏論 3分(?) クッキング圏論 3分(?) クッキング
圏論 3分(?) クッキング
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
minagawa m
minagawa mminagawa m
minagawa m
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみよう
 

Andere mochten auch

KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話shinnosuke kugimiya
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたShigeki Yamato
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くTakao Sumitomo
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)将之 小野
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するTomoki Hasegawa
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜Shuichi Tsutsumi
 
チームとプロダクトをぶっ壊した話
チームとプロダクトをぶっ壊した話チームとプロダクトをぶっ壊した話
チームとプロダクトをぶっ壊した話Taichi Watanabe
 

Andere mochten auch (7)

KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみた
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗く
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
 
チームとプロダクトをぶっ壊した話
チームとプロダクトをぶっ壊した話チームとプロダクトをぶっ壊した話
チームとプロダクトをぶっ壊した話
 

Ähnlich wie diff template library

diffの真髄
diffの真髄diffの真髄
diffの真髄fuku68
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
Introduction to Categorical Programming
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical ProgrammingMasahiro Sakai
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Masahiro Sakai
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 
topology of musical data
topology of musical datatopology of musical data
topology of musical dataTatsuki SHIMIZU
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装するShuhei Iitsuka
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
R言語勉強会#4.pdf
R言語勉強会#4.pdfR言語勉強会#4.pdf
R言語勉強会#4.pdfTakuya Kubo
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜Tomoki Yoshida
 

Ähnlich wie diff template library (20)

diffの真髄
diffの真髄diffの真髄
diffの真髄
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Introduction to Categorical Programming
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical Programming
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
Pythonintro
PythonintroPythonintro
Pythonintro
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
Slide
SlideSlide
Slide
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
Hupc 1
Hupc 1Hupc 1
Hupc 1
 
R言語勉強会#4.pdf
R言語勉強会#4.pdfR言語勉強会#4.pdf
R言語勉強会#4.pdf
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
R intro
R introR intro
R intro
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 

Mehr von Daisuke Nikura

マルチプラットフォーム開発導入
マルチプラットフォーム開発導入マルチプラットフォーム開発導入
マルチプラットフォーム開発導入Daisuke Nikura
 
Androidやりませんか
AndroidやりませんかAndroidやりませんか
AndroidやりませんかDaisuke Nikura
 
DXライブラリのすゝめ
DXライブラリのすゝめDXライブラリのすゝめ
DXライブラリのすゝめDaisuke Nikura
 
Roombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたRoombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたDaisuke Nikura
 
TwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますTwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますDaisuke Nikura
 
今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?Daisuke Nikura
 

Mehr von Daisuke Nikura (10)

マルチプラットフォーム開発導入
マルチプラットフォーム開発導入マルチプラットフォーム開発導入
マルチプラットフォーム開発導入
 
Androidやりませんか
AndroidやりませんかAndroidやりませんか
Androidやりませんか
 
DXライブラリのすゝめ
DXライブラリのすゝめDXライブラリのすゝめ
DXライブラリのすゝめ
 
Unique ptr の紹介
Unique ptr の紹介Unique ptr の紹介
Unique ptr の紹介
 
Roombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたRoombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみた
 
勉強会を開こう
勉強会を開こう勉強会を開こう
勉強会を開こう
 
Midiやろうよ
MidiやろうよMidiやろうよ
Midiやろうよ
 
TwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますTwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わります
 
Big america
Big americaBig america
Big america
 
今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?
 

diff template library