>> ROBボーデン：こんにちは。
私はロブだし、レッツハッシュ このソリューションが不足しています。
そこでここでは、実装するつもりだ 一般的なハッシュテーブル。
私たちは、ハッシュの構造ノードが分かり テーブルは次のようにしようとしている。
だから、char型の言葉を持っているために起こっている サイズ長さプラス1の配列。
最大以来1を忘れてはいけない 辞書内の単語は45です
文字、その後、我々はするつもりだ のための1余分な文字を必要とする
バックスラッシュ0。
>> して、それぞれに私たちのハッシュテーブル バケットは、保存しようとしている
ノードのリンクリスト。
ここでは、プロービング線形をしていない。
だから次のリンクするために バケット内の要素、私たちが必要とする
次の構造体ノード*。
だから、ノードは次のようになります。
今、ここに宣言です 当社のハッシュテーブルの。
これは、16,384バケツを持っているつもりが、だ その数は本当に重要ではありません。
そして最後に、我々は持っているつもりです グローバル変数hashtable_size、その
0としてオフを開始する予定、それはださ どのように多くの単語を追跡しようとして
私たちの辞書にあった。
わかりました。
>> それでは、負荷を見てみましょう。
だから負荷に気づく、 それはBOOLを返します。
それが成功した場合はtrueを返す それ以外の場合はロードされ、falseを返します。
そして、それはcon​​stのchar *のスターを取る 辞書で辞書、
我々はオープンしたいという。
だから、最初のことだ 私たちは、やろうとしている。
私たちは辞書をfopenのつもりだ 読んで、私たちは持っているつもりです
それがそうであれば成功したことを確認します それはnullを返し、その後、我々はしませんでした
成功した辞書を開く そして我々はfalseを返す必要があります。
>> しかし、それは成功しなかったと仮定して オープン、その後、我々は読んでもらいたい
辞書。
我々はいくつかを見つけるまでそのループを保つ このから抜け出すべき理由
私達が表示されますループ。
そうルーピング保ち、そして今、我々は行っている 単一のノードをのmallocする。
そしてもちろん、我々はチェックをエラーする必要があります 再びmallocingは成功しませんでしたので、もし
そして我々は、我々のいずれかのノードをアンロードする 前のmallocに起こった、閉じ
辞書とfalseを返します。
>> しかし、我々が想定していることを無視し 成功し、その後、我々は関数fscanf利用したい
から単一の単語を読むために私たちの 私たちのノード辞書。
だから、エントリ - >単語が文字であることを忘れないでください ワードサイズの長さの緩衝液+
我々はするつもりだ1 インチの単語を保存
だから、関数fscanfは限り1を返すために起こっている それが成功して読み取ることができたとして
ファイルから単語。
>> エラーのいずれかが起こるか、我々が到達した場合 ファイルの最後には、それはないでしょう
そうでない場合は、ケース内の1を返す 1を返す、我々は最終的に破るつもりだ
このwhileループの外。
だから我々は、かつて我々が成功していることがわかります に単語を読む
エントリー>言葉は、我々は、ハッシュするつもりだ 我々のハッシュ関数を用いてその単語。
それでは見てみましょう ハッシュ関数。
>> だから、本当に必要はありません。 これを理解する。
そして実際に、私たちは、これを引っ張っ インターネットから関数をハッシュ。
あなたが認識する必要がある唯一のものです これはcon​​stのchar *文字の単語を取ることを、
そのためには、入力として文字列を取っているし、 出力として符号なし整数を返す。
だから、すべてのハッシュ関数ですそれは、そうです 入力を取り込み、それはあなたに与えます
ハッシュテーブルへのインデックス。
我々はNUM_BUCKETSで改造していることに注意してください そのハッシュ値を返す
実際にハッシュテーブルへのインデックスです 以降もインデックスされない
配列の境界。
>> だから、ハッシュ関数、我々が行っていることを考えると 我々は読んで単語をハッシュする
辞書から、その後、我々は行っている それを使用するためには、挿入する必要が
ハッシュテーブルにエントリ。
今、ハッシュテーブルハッシュは、現在ある ハッシュテーブルにリストを連結し、かつ
それだけでnullであることは非常に可能性があります。
我々は、我々のエントリを挿入したい このリンクリストの先頭、など
我々は我々の現在のエントリを持っているつもりです 現在、どのようなハッシュテーブルを指す
ポイントにして、私たちは保存するつもりだ ハッシュのハッシュ·テーブル内の
現在のエントリ。
>> だから、この2行は正常に挿入 の先頭にエントリー
そのインデックスのリンクリスト ハッシュテーブルに。
我々はそれに終わったら、知っている 我々は、別の単語を見つけた
辞書と我々は再び増加します。
だから我々はやり続けることはfscanfまで、 最終的に非何か1を返します。
その時点では、我々がする必要があることを覚えておいて 入場無料なので、ここまで、我々はmallocさ
エントリーと我々は何かを読み取ろうとしました 辞書から。
そして、我々は正常に読み込まれませんでした 辞書から何か
我々は我々のエントリを解放する必要がある場合 実際にハッシュテーブルに入れたことがない
そして最終的に分割します。
>> 我々は抜け出すと、我々は、よく、見る必要がある 我々は、理由があっ抜け出すんでした
ファイルからの読み取りエラーが発生したか、 我々は達したので、私たちは抜け出すんでした
ファイルの終わり？
エラーがあったなら、私たちがしたい 負荷がなかったため、falseを返す
成功し、その過程で、私たちがしたい 我々は読んですべての単語をアンロード
と辞書ファイルを閉じます。
我々は成功しなかったと仮定すると、我々だけで それでも辞書を閉じる必要が
ファイル、そして最後には、以来、trueを返す 我々は正常にロードされました
辞書。
そして、それは、負荷のためにそれだ。
>> だから今、ロードされたハッシュテーブル与えられ、確認してください、 このように起こっている。
そう、それはBOOLを返す、チェックしている かどうかを示すために起こっている
渡されたchar *文字の単語、かどうか 渡された文字列は、私たちの辞書にある。
だからである場合には、辞書にある場合 当社のハッシュテーブルに、我々は戻ります
真、そうでないなら、 我々はfalseを返します。
これは、渡された単語を考えると、我々はしている 単語をハッシュする予定。
>> 今、認識することが重要なことは ロードでは、我々は知っていたことをすべてのこと
言葉は小文字であることを行った、 しかしここでは、そのようにわからない。
我々はハッシュ関数を見てみると、 実際に私たちのハッシュ関数
各文字を小文字化されている 言葉の。
だから関係なく、総額 言葉、私たちのハッシュ関数は、しようとしている
何のために同じインデックスを返す 時価総額は、それがなければならないようです。
完全に小文字に返さ Wordのバージョン。
わかりました。
>> だから、Googleのインデックスです。
それは、この単語のためのハッシュテーブルです。
今、forループはこれが起こっている リンクリストの上へ
つまり、そのインデックスにあった。
だから我々は、エントリを初期化しているに気づく そのインデックスを指すように設定します。
私たちは、エントリがない間継続するつもりだ 等しくないNULL、と覚えている
私たちのリンクリストポインタを更新 エントリは次のエントリ->に等しいので、持っている
に私たちの現在のエントリ·ポイント リンクリストの次のアイテム。
わかりました。
>> だから、リンクリスト内のエントリごとに、 私たちは、strcasecmpを使用するつもりだ。
それははstrcmpはないので、再び、我々 区別せず物事のケースをやってみたい。
だから我々は言葉を比較するためにstrcasecmpを使用 それは、この関数に渡されました
単語に対して、その このエントリにあります。
それが0を返した場合、それがあったことを意味 我々がしたい、その場合に一致すると、
trueを返します。
我々が正常に見つかった 当社のハッシュテーブル内の単語。
>> 一致するものがなかった場合、我々はしている 再びループに行くと見て
次のエントリー。
そして、我々はしばらくの間そこにループし続けます このリンクリスト内のエントリです。
私たちは壊れた場合はどうなります forループこれのうち？
それは我々がそのエントリを見つけられませんでした意味 その場合には、この言葉を一致
私たちは、それを示すためにfalseを返す ハッシュテーブルには、この単語が含まれていませんでした。
そして、それはチェックのためにそれだ。
わかりました。
>> それでは、サイズを見てみましょう。
今、サイズが非常に簡単になるだろう 以来、単語ごとに、負荷に覚えている
我々はグローバルに増分発見 変数hashtable_size。
だから、size関数はただです そのグローバルを返しに行く
変数で、それはそれだ。
>> ついに、我々はアンロードする必要があります 辞書すべてが済んだら。
では、どのようにそれをするつもりですか？
右ここでは、すべての上にループしています 当社のハッシュテーブルのバケット。
そうNUM_BUCKETSバケットがあります。
そして、我々のハッシュ内の各リンクリストのための テーブル、我々をループするつもりだ
リンクリストの全体 各要素を解放する。
今、我々は注意する必要があるので、ここでは の一時変数を持っている
次のポインタを格納 リンクされたリスト内の要素。
そして、我々は自由になるだろう 現在の要素。
>> 我々は、我々以来、これを行うことを確認する必要があり ただ、現在の要素を解放することはできません
して、次のポインタにアクセスしよう 以来、一度我々はそれを解放
メモリは無効になります。
だから我々は体へのポインタの周りに維持する必要があります 次の要素は、その後、我々は解放することができます
現在の要素、そして、我々は更新することができます を指すように私たちの現在の要素
次の要素。
>> 要素が存在している間、我々はよループ このリンクリスト内。
我々は、すべてのリンクされたリストのことをやる ハッシュテーブル、そして我々が終わっ回
それにより、我々は完全にアンロードされました ハッシュテーブル、そして我々は完了です。
だから、アンロードするために、これまでは不可能だ falseを返し、そして我々が完了したら、我々は
ただtrueを返す。