hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
文字列検索/src - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

アルゴリズム

 HSP3.0a 

文字列検索の実装例

力ずく法の実装例

filev3_025_forcesearch.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
-
|
|
|
!
 
 
-
|
!
-
|
!
 
 
;===========================================================
;   文字列検索(力ずく法の実装例)
;                                               for HSP 3.0a
;   2005/11/23                                written by kz3
;===========================================================
 
    text = "hsp2.61HSP3.0a"
    ptn  = "HSP"
 
    ; 小ワザ
    mes "テキスト:"+strf(text+"%n",varptr(len_text))
    mes "パターン:"+strf(ptn+"%n",varptr(len_ptn))
 
    start  = 0
    t_text = start
    t_ptn  = 0
 
    repeat
        if (t_text=len_text) | (t_ptn=len_ptn): break
        if peek(text,t_text) = peek(ptn,t_ptn){
            t_text++
            t_ptn++
        }
        else{
            start++
            t_text = start
            t_ptn  = 0
        }
    loop
 
    if t_ptn=len_ptn{
        mes "見つかった位置は"+start+"です"
    }
    else{
        mes "見つかりませんでした"
    }
 
    stop

KMP法による検索モジュール

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
-
|
!
 
 
 
 
 
 
 
 
 
 
#module
#ifdef __hspdef__    ; 拡張マクロを使用しない場合
#define global while(%1=1) %tcontinue %i0 %twhile *%i :%tbreak if %1=0 { goto *%i }
#define global wend %tcontinue *%o : %twhile goto *%o: %tbreak *%o
#endif
#defcfunc KMPsearch str p1, int p2, str p3
    s = p1 : w = p3
    dim num, 2
    num = strlen(p1), strlen(p3)
    dim t, num(1)
    ; テーブル作成。
    t = -1, 0     : i = 2 ; 初期値
    while i < num(1)
        if strmid(w, i-1, 1) == strmid(w, j, 1) {
            t(i) = j +1
            i ++ : j ++
        } else : if j > 0 {
            j = t(j)
        } else {
            t(i) = 0 : i ++
        }
    wend
    ; 検索開始
    m = p2 : i = 0
    while (m + i) < num(0)
        if strmid(w, i, 1) == strmid(s, m +i, 1) { i ++ } else { m += i -t(i) : if i > 0 { i = t(i) } }    
        if i == num(1) : return m
        await 0
    wend
    return -1     ; 見つからなかった場合
#global

wikipedia の記事をそのままソースに直しただけなので、 動作速度は instr() 関数にぼろ負けです。

コメント

  • 力ずく法掲載。箇条書きを素直にコーディングしただけですね。startを使わない事も出来ます。あとただ載せただけでは何も得られないので非公認のワザを入れてみました。 -- kz3 2005-11-23 (水) 16:34:48
  • 非公式・未公開・非公認・・・言い方が微妙ですが要はマニュアルには載ってない使い方ということです。その他にもありますが(printf()を知る人なら知ってる)printf()は可変長引数なのでそれを実装するには・・・うーん。 -- kz3 2005-11-23 (水) 17:27:15
  • 1つの方法としてはllmodのdllprocのように引数を個数と引数リストで渡すという方法が考えられる。 -- kz3 2005-11-23 (水) 17:50:48
  • しょぼしょぼなKMPのモジュールを勝手ながら追加しておきました。 -- 上大? 2008-01-01 (火) 22:59:21

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filev3_025_forcesearch.hsp
491件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2008-01-01 (火) 22:59:21 (2167d)