1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

部分的行テーブル更新法の注意点

Last updated at Posted at 2015-07-07

viviエディターの作者がスライドで行テーブルの更新を部分的に行う方法だと早いと言っていたので実装してみた。
http://slides.com/nobuhidetsuda/texteditorimpl#/

##気づいたこと
・LinkedListかGappedVectorじゃないとテーブル操作でO(N)かかるので複数行の編集操作が行われるケースではあまり意味はない
・stepRowをまたいだ削除を行うと落ちる
・複数行の挿入を行うと落ちる
スライドを隅から隅までみたが、こういうケースについては言及していなかった。なので、自分なりに場合分けしてみた

##1文字挿入(削除)した場合
スライドで書かれている通りに行えば問題なし

##行をまたいだ削除が発生した場合
1.行テーブルから削除する範囲を割り出す
2.行テーブルから削除する
3.stepRowを削除した1で計算した範囲のひとつ前に設定する
4.stepIndexを更新する

##複数行の置き換えがある場合
1.対応する行テーブルを作成する
2.1で作成したデータの先頭行以外のインデックスからstepIndex分だけ引く
3.もともとある行テーブルに2で処理した行テーブルを挿入する
4.stepRowを挿入した位置に設定する

##ベンチマーク
「XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。」が10万行あるテキストを「XYZ」から「ABCDE」に置き換えた場合、従来の方法だと4秒近くかかっていたものが0.5秒程度で済むので、効果はあるもよう
ただ、0.5秒で済ませる実装だとDirect2DのDWriteTextLayoutで1行に65535文字あるケースで落ちてしまうので、それを考慮した実装にすると1秒程度にまで落ちてしまう

※core i5 2550、メモリー8GB、RADEON HD5770、Win8.1 x64

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?