SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
多バイト文字列の
             検索アルゴリズム

           (株)サイクル・オブ・フィフス
                石田朗雄




10/01/30
その前に、、、
 ●   http://www.local.or.jp/?LDD/LDD10Winter
 ●   LOCAL DEVELOPER DAY '10 /Winter
 ●   2010/2/13(土) 12:45~18:35
 ●   札幌市産業振興センター セミナールームA




10/01/30
文字列検索
 ●   PostgreSQLでは
      ●    SELECT strpos('high', 'ig') => 2
      ●    SELECT strpos('high', 'X') => 0
      ●    replace(), split_part(), string_to_array()
 ●   Rubyでは
      ●    "high".index("ig") #=> 1
      ●    "high".index("X") #=> nil
      ●    String#partition, String#include




10/01/30
文字列検索アルゴリズム
 ●   Boyer-Mooreとその仲間
      ●    Boyer-Moore
           –   二種類のskiptable使ったアルゴリズム
      ●    Boyer-Moore-Horspool
           –   片一方だけでもそこそこ速いんじゃね?
           –   PostgreSQLはコレ
      ●    Sunday Quick Search
           –   片一方しか使わないんだったら1Byte先を見てもよく
               ね?
           –   Rubyはコレ


10/01/30
●   詳しくはWebで!!
      ●    http://www-igm.univ-mlv.fr/~lecroq/string/index.html




10/01/30
skiptableの作り方

           'A'   'B'   'C'   'A'   'B'
            41    42    43    41    42
   s[41] =   5                 2         = 2
   s[42] =         4                 1   = 1
   s[43] =               3               = 3




10/01/30
ポイント
 ●   不一致だった場合に何文字skipできるかは、patternの
     末尾の比較対象(+1?)の文字によって決まる
 ●   簡易実装では、256個の配列でskiptableを持っている
 ●   日本語どうすんの?
 ●   widecharをつかうとskiptable大きすぎ
      ●    ハッシュではコストが高すぎ
 ●   multibyteのままだと泣き別れが発生する




10/01/30
multibyte/widechar
 ●   マルチバイト
      ●    可変長
      ●    ASCII互換
      ●    EUC-JP、UTF-8
 ●   ワイド文字
      ●    固定長(16bit/32bit)
      ●    ASCII非互換
      ●    UTF-16(?)、UTF-32
      ●    別にUNICODEじゃなくてもいいけどね


10/01/30
PostgreSQLの場合
 ●   src/backend/utils/adt/varlena.c
 ●   widecharに変換
 ●   そもそもASCIIでも256個もskiptableいらないんじゃ
     ね?
 ●   "ABCDEFG"をmod 4して"12301230"と考えても、ス
     キップする量は減るが成立する
 ●   文字列の長さでskiptableのサイズを決めている
 ●   http://archives.free.net.ph/message/20080830.232111.faf51
 ●   http://github.com/postgres/postgres/commit/285966b76c1a


10/01/30
'あ'    'い'    'う'    'え'
              3042   3044   3046   3048
   s[3042]   =   4                      =   4
   s[3044]   =          3               =   3
   s[3046]   =                 2        =   2
   s[3048]   =                        1 =   1
                 2     0       2      0
   s[0]      =   4             2        =   2
   s[1]      =                          =   5
   s[2]      =          3             1 =   1
   s[3]      =                          =   5


10/01/30
Rubyの場合
 ●   string.c:rb_str_index() ? re.c:rb_memsearch()
 ●   マルチバイトのまま検索
 ●   短かい文字列/UTF-8の場合/それ以外の場合でアルゴ
     リズムを分けている
      ●    rb_memsearch_ss:たぶんrabin-karp
      ●    rb_memsearch_qs_utf8
      ●    rb_memsearch_qs
 ●   泣き別れたらやりなおせばいいじゃない
 ●   http://article.gmane.org/gmane.comp.lang.ruby.devel/8100
 ●   http://github.com/shyouhei/ruby/commit/e58adeae0f384a5
10/01/30
rb_memsearch_qs_utf8(1)
 ●   UTF-8では0xe3がやたらとでてくる




               'あ'      'い'      'う'
               e3 81 82 e3 81 84 e3 81 86
     s[81]   =     8        5        2      =   2
     s[82]   =        7                     =   7
     s[84]   =                 4            =   4
     s[86]   =                          1   =   1
     s[e3]   = 9         6        3         =   3
10/01/30
rb_memsearch_qs_utf8(2)
 ●   先頭byteの時は、文字全体からハッシュを計算する


                'あ'      'い'      'う'
                e3 81 82 e3 81 84 e3 81 86
                46       48       4a
     s[46]    = 9                            =   9
     s[48]    =           6                  =   6
     s[4a]    =                    3         =   3
     s[181]   =     8        5        2      =   2
     s[182]   =        7                     =   7
     s[184]   =                 4            =   4
     s[186]   =                          1   =   1
10/01/30
Pythonの場合
 ●   Objects/stringlib/fastsearch.h
 ●   http://effbot.org/zone/stringlib.htm
 ●   Boyer-MooreとBloom Filterの合わせわざらしい
 ●   イニシャルコストとメモリ効率はよさそう
 ●   長い文字列はどうか
 ●   但し内部コードはUTF-16(or32)に限る




10/01/30

Más contenido relacionado

La actualidad más candente

Interactive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGenInteractive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGenAtsushi Tadokoro
 
Lets enjoy-terminal-life - たのしいたーみなる
Lets enjoy-terminal-life - たのしいたーみなるLets enjoy-terminal-life - たのしいたーみなる
Lets enjoy-terminal-life - たのしいたーみなるtotzyuta
 
Programming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsProgramming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsJoongjin Bae
 
Rubyにメソッドを追加して遊ぶ話
Rubyにメソッドを追加して遊ぶ話Rubyにメソッドを追加して遊ぶ話
Rubyにメソッドを追加して遊ぶ話Masaya Konishi
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方 Nagi Teramo
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413博文 斉藤
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Kazuya Wada
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
kpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkoki_h
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 

La actualidad más candente (14)

Interactive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGenInteractive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGen
 
Lets enjoy-terminal-life - たのしいたーみなる
Lets enjoy-terminal-life - たのしいたーみなるLets enjoy-terminal-life - たのしいたーみなる
Lets enjoy-terminal-life - たのしいたーみなる
 
Programming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsProgramming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 Collections
 
Rubyにメソッドを追加して遊ぶ話
Rubyにメソッドを追加して遊ぶ話Rubyにメソッドを追加して遊ぶ話
Rubyにメソッドを追加して遊ぶ話
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
kpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたい
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 

Destacado

よりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてよりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてAkio Ishida
 
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Akio Ishida
 
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~Yuta Sakurai
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2Akio Ishida
 
PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約Akio Ishida
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.jsAkio Ishida
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio Ishida
 
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムPostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムAkio Ishida
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみようAkio Ishida
 
使いこなそうGUC
使いこなそうGUC使いこなそうGUC
使いこなそうGUCAkio Ishida
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDAkio Ishida
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索Akio Ishida
 
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems Manager
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems ManagerAWS Black Belt Online Seminar 2017 Amazon EC2 Systems Manager
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems ManagerAmazon Web Services Japan
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 

Destacado (15)

よりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてよりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めて
 
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト
 
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.js
 
Ruby Postgres
Ruby PostgresRuby Postgres
Ruby Postgres
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムPostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
 
使いこなそうGUC
使いこなそうGUC使いこなそうGUC
使いこなそうGUC
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDD
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems Manager
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems ManagerAWS Black Belt Online Seminar 2017 Amazon EC2 Systems Manager
AWS Black Belt Online Seminar 2017 Amazon EC2 Systems Manager
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 

Similar a Rubysapporo Stringsearch

Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7kingtomo
 
NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010Masahiro Tanaka
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiTakashi Hoshino
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Yusaku Kawaguchi
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2Nishida Kansuke
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)Satoshi Yamada
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画mametter
 
Evolution Of Enumerator
Evolution Of EnumeratorEvolution Of Enumerator
Evolution Of EnumeratorAkinori Musha
 

Similar a Rubysapporo Stringsearch (20)

HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7
 
NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Tokyo r47 beginner_2
Tokyo r47 beginner_2Tokyo r47 beginner_2
Tokyo r47 beginner_2
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86opti
 
Tokyo r45 beginner_2
Tokyo r45 beginner_2Tokyo r45 beginner_2
Tokyo r45 beginner_2
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
ggplot2 110129
ggplot2 110129ggplot2 110129
ggplot2 110129
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
Evolution Of Enumerator
Evolution Of EnumeratorEvolution Of Enumerator
Evolution Of Enumerator
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Último (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

Rubysapporo Stringsearch

  • 1. 多バイト文字列の 検索アルゴリズム (株)サイクル・オブ・フィフス 石田朗雄 10/01/30
  • 2. その前に、、、 ● http://www.local.or.jp/?LDD/LDD10Winter ● LOCAL DEVELOPER DAY '10 /Winter ● 2010/2/13(土) 12:45~18:35 ● 札幌市産業振興センター セミナールームA 10/01/30
  • 3. 文字列検索 ● PostgreSQLでは ● SELECT strpos('high', 'ig') => 2 ● SELECT strpos('high', 'X') => 0 ● replace(), split_part(), string_to_array() ● Rubyでは ● "high".index("ig") #=> 1 ● "high".index("X") #=> nil ● String#partition, String#include 10/01/30
  • 4. 文字列検索アルゴリズム ● Boyer-Mooreとその仲間 ● Boyer-Moore – 二種類のskiptable使ったアルゴリズム ● Boyer-Moore-Horspool – 片一方だけでもそこそこ速いんじゃね? – PostgreSQLはコレ ● Sunday Quick Search – 片一方しか使わないんだったら1Byte先を見てもよく ね? – Rubyはコレ 10/01/30
  • 5. 詳しくはWebで!! ● http://www-igm.univ-mlv.fr/~lecroq/string/index.html 10/01/30
  • 6. skiptableの作り方 'A' 'B' 'C' 'A' 'B' 41 42 43 41 42 s[41] = 5 2 = 2 s[42] = 4 1 = 1 s[43] = 3 = 3 10/01/30
  • 7. ポイント ● 不一致だった場合に何文字skipできるかは、patternの 末尾の比較対象(+1?)の文字によって決まる ● 簡易実装では、256個の配列でskiptableを持っている ● 日本語どうすんの? ● widecharをつかうとskiptable大きすぎ ● ハッシュではコストが高すぎ ● multibyteのままだと泣き別れが発生する 10/01/30
  • 8. multibyte/widechar ● マルチバイト ● 可変長 ● ASCII互換 ● EUC-JP、UTF-8 ● ワイド文字 ● 固定長(16bit/32bit) ● ASCII非互換 ● UTF-16(?)、UTF-32 ● 別にUNICODEじゃなくてもいいけどね 10/01/30
  • 9. PostgreSQLの場合 ● src/backend/utils/adt/varlena.c ● widecharに変換 ● そもそもASCIIでも256個もskiptableいらないんじゃ ね? ● "ABCDEFG"をmod 4して"12301230"と考えても、ス キップする量は減るが成立する ● 文字列の長さでskiptableのサイズを決めている ● http://archives.free.net.ph/message/20080830.232111.faf51 ● http://github.com/postgres/postgres/commit/285966b76c1a 10/01/30
  • 10. 'あ' 'い' 'う' 'え' 3042 3044 3046 3048 s[3042] = 4 = 4 s[3044] = 3 = 3 s[3046] = 2 = 2 s[3048] = 1 = 1 2 0 2 0 s[0] = 4 2 = 2 s[1] = = 5 s[2] = 3 1 = 1 s[3] = = 5 10/01/30
  • 11. Rubyの場合 ● string.c:rb_str_index() ? re.c:rb_memsearch() ● マルチバイトのまま検索 ● 短かい文字列/UTF-8の場合/それ以外の場合でアルゴ リズムを分けている ● rb_memsearch_ss:たぶんrabin-karp ● rb_memsearch_qs_utf8 ● rb_memsearch_qs ● 泣き別れたらやりなおせばいいじゃない ● http://article.gmane.org/gmane.comp.lang.ruby.devel/8100 ● http://github.com/shyouhei/ruby/commit/e58adeae0f384a5 10/01/30
  • 12. rb_memsearch_qs_utf8(1) ● UTF-8では0xe3がやたらとでてくる 'あ' 'い' 'う' e3 81 82 e3 81 84 e3 81 86 s[81] = 8 5 2 = 2 s[82] = 7 = 7 s[84] = 4 = 4 s[86] = 1 = 1 s[e3] = 9 6 3 = 3 10/01/30
  • 13. rb_memsearch_qs_utf8(2) ● 先頭byteの時は、文字全体からハッシュを計算する 'あ' 'い' 'う' e3 81 82 e3 81 84 e3 81 86 46 48 4a s[46] = 9 = 9 s[48] = 6 = 6 s[4a] = 3 = 3 s[181] = 8 5 2 = 2 s[182] = 7 = 7 s[184] = 4 = 4 s[186] = 1 = 1 10/01/30
  • 14. Pythonの場合 ● Objects/stringlib/fastsearch.h ● http://effbot.org/zone/stringlib.htm ● Boyer-MooreとBloom Filterの合わせわざらしい ● イニシャルコストとメモリ効率はよさそう ● 長い文字列はどうか ● 但し内部コードはUTF-16(or32)に限る 10/01/30