自己組織化探索


関数名
selfSearch  自己組織化探索
形式
LIST *selfSearch(LIST *list, int target);
引数
typedef struct _list {
    int key;             /* 比較のキーとなるフィールド */
    int info;            /* その他のフィールド */
    struct _list *next;  /* つぎの要素 */
} LIST;

list    (入力)リストのヘッダ
target  (入力)探索目標とするキーの値
関数値
見つかった場合はその要素へのポインタ。見つからなかった
場合は NULL。
注意事項
リストが正しく作成されていることが前提となる。細かいことについては つぎの用例プログラムを参照すること。

用例(selfSearch-test.c

プログラム(selfSearch.c
LIST *selfSearch(LIST *list, int target)
{
    LIST *head, *prev;

    if (list == NULL) return NULL;

    for (prev = head = list; (list = prev->next) != NULL; prev = list)
        if (list->key == target) {
            prev->next = list->next;
            list->next = head->next;
            head->next = list;
            return list;
        }
    return NULL;
}
説明
線形探索では先頭から要素を 一つ一つ調べるので、後ろにある要素ほど探索時間がかかる。そこで、探索 のたびに、見つかった要素を先頭に移動すれば、頻繁に検索されるものほど 先頭に集まり、平均探索時間が短くなることが期待できる。このような方法 を自己組織化探索という。

しかし、移動は配列にとっては大変時間のかかり作業であり、一方リストな らばポインタの付け替えだけですむ。したがって、自己組織化探索では、デ ータはリストにより保持される。

関連関数
線形探索2分探索2分探索木AVL木B木