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

ラボ

LRU

データ構造

LRUとはLeast Recently Used(一番最後に使った)という意味でもっともアクセス頻度の低いデータをリストの先頭に配置し、アクセス頻度の少ないものへのアクセスを早まらせようというデータ構造。
LRUの対となるデータ構造にMRUがあります。

実装例1(片方向リンクリスト)

fileSLinkedListLRU[sp].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
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
|
!
-
|
!
 
 
-
|
|
!
-
|
!
 
 
 
 
 
/*
################################################################################
#                                                                              #
#         データ構造:MRU(Least Recently Used)                                 #
#         リスト構造の一種でアクセス頻度の最も少ない要素へのアクセスを         #
#         素早くできるようにしたデータ構造。                                   #
#                                                                              #
################################################################################
*/
 
#module "SLinkedListLRU"
    /*--------------------------------------------------------------------*
     *                     片方向リンクリストの初期化                     *
     *--------------------------------------------------------------------*/
    #deffunc SLink_init int i
        mref res , 64
        if i < 1 : res = -1 : goto *@f
 
        n = i
 
        dim _value  , n+2
        dim _next   , n+2
 
        repeat n+1
            _next(cnt) = cnt+1
        loop
        _next(n+1)  = -1
 
        head        = 0
        tail        = head
        new         = _next(tail)
 
        res         = n
*@
        return
 
    /*--------------------------------------------------------------------*
     *                    リンクリストに要素を挿入する                    *
     *--------------------------------------------------------------------*/
    #deffunc SLink_addlru int i
 
        if n = 0 : res = -1 : goto *@f
 
        ; 挿入位置を求める
        q = head
        p = _next(head)
 
        repeat
            if (p = new) | (i = _value(p)) : break
            q = p
            p = _next(p)
        loop
 
        ; リストがいっぱい、もしくは無効なリスト
        if _next(p) = -1 : res = -1 : goto *@f
 
        _value(p)   = i     ; ダミー
        if p = new : tail = _next(tail)
 
        if p ! tail{
            _next(q)    = _next(p)
            _next(p)    = _next(tail)
            _next(tail) = p
        }
 
        tail    = p
        new     = _next(tail)
 
        ; 挿入した直前の要素のインデックス(無意味)
        res = q
*@
        return
 
    /*--------------------------------------------------------------------*
     *                    リンクリストの要素を削除する                    *
     *--------------------------------------------------------------------*/
    #deffunc SLink_del int i
        ; 空のリスト
        if head = tail : res = -1 : goto *@f
 
        ; 削除位置を求める
        q = head
        p = _next(head)
 
        repeat
            if (p = new) | (_value(p) = i) : break
            q = p
            p = _next(p)
        loop
 
        if p = new : res = -1 : goto *@f
 
        ; 末尾処理
        if p = tail{
            tail    = q
            new     = p
        }
        else{
            _next(q)    = _next(p)
            _next(p)    = _next(tail)
            _next(tail) = p
            new         = _next(tail)
        }
 
        ; 削除した要素のインデックス(無意味)
        res = p
*@
        return
 
    /*--------------------------------------------------------------------*
     *                    リンクリストの要素を表示する                    *
     *--------------------------------------------------------------------*/
    #deffunc SLink_disp
 
        p = _next(head)
        s = "[ "
        repeat
            if p = new : res = cnt : break
            s += "" + _value(p) + " "
            p = _next(p)
        loop
        s += "]" + ":" + res + "/" + n
        mes s
        return 
#global
 
/******************************************************************************
 *                           S A M P L E                           *
 ******************************************************************************/
 
#define LISTSIZE    6
    font "MS ゴシック",12
    randomize
    cmd = ""
    input cmd,,,3
    SLink_init LISTSIZE
    if stat = -1{
        dialog "リストの初期化に失敗しました.",1,"終了確認" : end
    }
 
    onkey gosub *enter
    stop
 
*enter
    if iparam ! 13 : goto *@f
 
    ; 入力ボックスチェック
    getstr num,cmd,1
    if num = ""{
        cmd = "" : objprm 0,cmd
        goto *@f
    }
 
    num = int(num)
 
    c = peek(cmd,0)
 
    switch c
        case '+' :  SLink_addlru num
                    if stat ! -1{
                        title " "+num+" を挿入しました."
                        SLink_disp
                    }
                    else{
                        title "リストがいっぱいです."
                    }
                    swbreak
        case '-' :  SLink_del num
                    if stat ! -1{
                        title " "+num+" を削除しました."
                        SLink_disp
                    }
                    else{
                        title "リストが空です."
                    }
                    swbreak
    swend
    cmd = "" : objprm 0,cmd
*@
    return

コメント

  • MRUだと使用頻度が比較的低いデータが先頭付近にきてしまうことがあるけど、LRUならそいうのがない…という感じ?
    まったくアクセスしないというようなデータの数が少ない場合に使う感じなのかな? - GENKI
  • えっとデータ構造の説明がMRUでした; -- kz3 2005-08-25 05:09:47 (木)
  • ん、いやいや、MRUは使用頻度の低いデータがリストの後ろの方にくるんですね、MRUでは先頭が一番頻度の高い要素です。(実装次第か。)
    LRUの実装例自体目にしたことがないのですが、多分こんな感じに使えないでしょうか?
    ここに長さ12cmのレンタル鉛筆が1ダースあります。
    1時間に1本鉛筆を選んで1cm削ります。
    翌日、借りた鉛筆を返さないといけませんが、返すのは長さの長い順に5本返せばOKです。
    鉛筆を削る=アクセス としてまったく削らない鉛筆が手前から順に並ぶわけです。
    削った鉛筆はその都度一番奥に置きます。
    回収日には手前から順に5本選んでそれを返却窓口にコピー。
    ここでのポイントはこのLRUは"削るための鉛筆"を素早く選ぶことを目的としたデータ構造ではなくて、返却するためのより"真新しい鉛筆"を素早く選ぶためのデータ構造・・・かと
    かなり例えが悪い。-- kz3 2005-08-25 04:58:17 (木)
  • 双方向リンクリストで実装すれば逆順にポインタをたどれるのでMRUもLRUもどっちも表現できると思います。 -- kz3 2005-08-25 05:13:57 (木)
  • とりあえずタブスペコンバーター一段落ついた(?)のでリンクリストを更新しようかな^^ -- kz3 2005-08-25 05:14:48 (木)
  • 削る鉛筆をランダムに選んだとします。(この時点で違う?^ ^;)一番最後に削った鉛筆が使っていない鉛筆だったらどうでしょう。あるいは最後のほうになって長いものを使うようになったら…。 -- GENKI? 2005-08-25 20:27:37 (木)
  • "使用頻度"の評価方法が問題なのかな…ごめん、よく分からないのに書き込んじゃったので読んでる人に混乱与えたえてるかも [worried2]というか私自身も混乱…ちょっち出直してきます。 -- GENKI? 2005-08-25 20:28:00 (木)
  • まぁ例を示せれば一番早いのですが、今hsp30でリンクリストをやってるんですが実装以前に新しい書き方でつまづいてます^^; -- kz3 2005-08-26 04:02:16 (金)
  • MRUの逆です。新規要素は末尾に挿入され、既存要素は末尾に移動されます。よってリスト先頭が最もアクセス頻度が低くなります。 -- kz3 2005-09-06 09:53:28 (火)
  • LRUのデータ構造の説明ですが、調べるうちに違った概念のLRUもあることが分かりました。
    そのデータ構造とは、ここで説明している
    最低アクセス頻度の要素へアクセスするためのデータ構造
    最多アクセス頻度の要素へアクセスするためのデータ構造において、
    新しい要素を追加しようとするときに最低アクセス頻度の要素から削除して新しい要素を追加する
    という優先順位付き待ち行列、あるいは辞書と呼ばれるデータ構造です。
    後者はMRUに優先順位をつけたものともとれます。つまりリストがいっぱいの時に新しい要素を追加しようとすると、リストの末尾要素(最低アクセス要素)を削除してリスト先頭(最多アクセス要素位置)に追加するというもの。
    どちらも正しいと思います。むしろ機能的なデータ構造は1つのデータ構造から成るのではなく、いくつかの基本的なデータ構造の組み合わさったものから成っている(と思う)ので。 -- kz3 2005-09-27 10:37:02 (火)
  • スクリプトにバグがありました。要素を削除するとリストのサイズが小さくなったかのように最大要素数まで挿入できません・・・ -- kz3 2005-09-27 11:47:16 (火)
  • 削除時のリンク付けの漏れだと思われます。修正に取り掛かります! -- kz3 2005-09-27 11:47:47 (火)
  • いや勘違いです。既存のキーと重複していたため、挿入ではなく要素の並び替えだけなので要素数は変わらずでした。
    自分で作っておいてもう動作を忘れている・・・。 -- kz3 2005-09-27 13:33:33 (火)

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

実装例2(双方向リンクリスト)

レンタル鉛筆の返却問題



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