• 検索結果がありません。

「アルゴリズムとデータ構造」資料

N/A
N/A
Protected

Academic year: 2021

シェア "「アルゴリズムとデータ構造」資料"

Copied!
13
0
0

読み込み中.... (全文を見る)

全文

(1)

「アルゴリズムとデータ構造」資料 12 ハッシュ表

奈良女子大学 鴨浩靖

2012年1月17日 初版 2020年12月24日第二版

1 / 13

(2)

基本的な考え方

長さ

N

の配列

a[]

と、

N

未満の非負整数を返す関数

h

を、用意し ておく。

h(x)

x

のハッシュ値と呼ぶ。

データ

x

a[h(x)]

に格納する。

h(x)

x

(3)

良いハッシュ関数の条件

よく散らばること

▶ 速く計算できること

3 / 13

(4)

ハッシュ関数の実例

inline size_t

__stl_hash_string(const char* __s) {

unsigned long __h = 0;

for ( ; *__s; ++__s) __h = 5 * __h + *__s;

return (size_t)__h;

}

GNU ISO C++ LibraryのものをCに書き換え。

実際には、この関数の返値を配列の大きさで割った余りをハッ シュ値として使う。

(5)

衝突とその回避

実際には、

x

,

x

なのに

h(x)

=

h(x

)

となることもある。

これをハッシュ値の衝突という。

対策が必要。

分離連鎖法

▶ 開番地法

5 / 13

(6)

分離連鎖法

データの配列ではなく、データの線形リストの配列を使う。

h(x)

z

y

x

(7)

開番地法 — 線形探査法

a[h(x)]

が使用済みならばその次を試す。次も使用済みなら、さ

らにその次を試す。これを、空きが見つかるまで繰り返す。

ただし、配列の末尾の次は先頭とする。

h(x)

+

2

h(x)

+

1 h(x)

z y x

7 / 13

(8)

開番地法 — 線形探査法の変種

N

と互いに素な整数

P

を決めておく。

a[h(x)]

が使用済みならば

a[(h(x)

+

P) mod N]

を試す。

a[(h(x)

+

P) mod N]

も使用済みならば

a[(h(x)

+

2P) mod N]

を試 す。これを、空きが見つかるまで繰り返す。

h(x)

+

2P

h(x)

+

P h(x)

z y x

(9)

開番地法 — 二次ハッシュ法

もうひとつの関数

h

1を用意しておく。

h

1

(x)

は常に配列の大きさ

N

と互いに素な整数値を取るものである必要がある。

a[h(x)]

が使用済みならば

a[(h(x)

+

h

1

(x)) mod N]

を試す。

a[(h(x)

+

h

1

(x)) mod N]

も使用済みならば

a[(h(x)

+

2h

1

(x)) mod N]

を試す。これを、空きが見つかるまで繰 り返す。

9 / 13

(10)

計算量

ハッシュ表の操作の時間計算量は、通常は以下の通り。

平均 最悪 探索

O(1) O(n)

追加

O(1) O(n)

削除

O(1) O(n)

ただし、配列が小さすぎたり、ハッシュ関数として非効率なもの を選んだりすると、この限りでない。

(11)

削除について

分離連鎖法 ハッシュ表からの削除は線形リストからの削除で実 現できるので、特に困難はない。

開番地法 削除した後を整合的に埋めるのは、著しく困難。

配列の各要素に、未使用/使用中/削除済み の三状態 のマークをつけるのが簡単。

削除が多いと、「削除済み」が増えてメモリ効率が 悪化する。さらに、探索時間も長くなる。

11 / 13

(12)

ハッシュ表の長所と短所

長所 早い。

▶ 探索・挿入・削除ともに、平均的には定数時間 で処理できる。

短所 項目の個数に応じて、表の大きさを適切に設定しな いと、不都合が生じる。

▶ 表が小さすぎると、ハッシュ値の衝突の頻度が 上がり、極端に遅くなる。

▶ 表が大きすぎると、メモリの浪費となる。

(13)

まとめ

▶ ハッシュ法

▶ 分離連鎖法

▶ 開番地法

13 / 13

参照

関連したドキュメント

しかしながら,式 (8) の Courant 条件による時間増分

の発足時から,同事業完了までとする.街路空間整備に 対する地元組織の意識の形成過程については,会発足の

1.はじめに

などから, 従来から用いられてきた診断基準 (表 3) にて診断は容易である.一方,非典型例の臨 床像は多様である(表 2)

厳密にいえば博物館法に定められた博物館ですらな

 中国では漢方の流布とは別に,古くから各地域でそれぞれ固有の生薬を開発し利用してきた.なかでも現在の四川

• ネット:0個以上のセルのポートをワイヤーを使って結んだも

実際, クラス C の多様体については, ここでは 詳細には述べないが, 代数 reduction をはじめ類似のいくつかの方法を 組み合わせてその構造を組織的に研究することができる