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

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Último (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

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