JavaScriptを使ったやや高速なDiff概要

多分もっとちゃんとしたアルゴリズムがあるんだろうけど
適当に思いついたので書いてみる。

配列new_lineとold_lineの比較。
まず、先頭キャラ1文字をキーにした連想配列を作っておく。
例えばAで始まる行の行番号が2,4,6だったとすると。
AのcharCodeが65なので。

old_first_char[65][0] = 2
old_first_char[65][1] = 4
old_first_char[65][2] = 6

こんな具合の配列ができる。
同様に、新しい配列のAで始まる行も調べておく。
互いの「A」で始まる行のうち0~3番目の行番号の内容を比較する。

old_line[old_first_char[65][0]] と new_line[new_first_char[65][0]] を比較する。
old_line[old_first_char[65][1]] と new_line[new_first_char[65][1]] を比較する。

new_first_char[65] = [2, 4, 6]だったとしたら、たった3回の比較で終了する。
文書が殆ど変更されていない場合は、n回のループで比較が終了することになる。

典型的な富豪的スクリプターなのでオーダーlogだのnmだのn^2だのとか
良くわかってないが、多分こんな感じ。
単純にループさせると9行の場合はループ回数9*9で81回。
先頭文字がAAABBBCCCなら最大(3*3)*3で27回ですむ。

短い文章の場合はonkeyupで処理しても負担は少ない。インクリメンタルDiffだ。
テキストエリアの編集の場合、エンター押すたびDiff取るのが良いかもしれない。
ただ、JavaScriptは大きな配列を扱おうとすると、とたんに遅くなるのが困り所。

まだアップしてないネタがたまってきた。
アップするのが面倒くさい。


WriteBacks

連想配列とArrayクラス

  前回の記事で説明したJavaScriptの配列の補足説明として、今回は、連想配列と、何度か出てきた「Arrayクラス」について説明します。
前回の記事で説明したように、通常の配列では添え字に要素番号を表す数字を使用します。
それに対して連想配列とは、添字にnameといった文字列を使用できるので要素の意味を明確にする事ができます。
数字のみで区別していた配列に対して、連想配列では、一つ一つの要素にわかりやすい名前をつけて処理することができます。
ですから、連想配列を使用すると、データベースとして扱うときでも、わかりやすくなります。
JavaScriptの「Arrayクラス」には上で述べた添字に整数を使用する通常の配列以外に、添字に文字列を使用する連想配列の機能が提供されています。
特別なメソッドなどは必要なく、単純に添え字の部分に文字列を指定するだけです。
  それでは実際に、連想配列を使用してみましょう。

Posted by ネットビジネス用CGI Perl HTML Javascriptの情報サイト at 2006/03/16 (Thu) 18:19:12
TrackBack ping me at
http://la.ma.la/blog/diary_200412131612.trackback
Post a comment

writeback message: Ready to post a comment.







spam yoke. nanimo ireruna.