Share
Embed
Transcript
123 slides
-
Copyright © 2015 every, Inc. All rights reserved. 2 目次
• Linux • コマンド • Gitとは? • 木構造 • 配列とリスト • ハッシュ • ソート • 探索 -
Copyright © 2015 every, Inc. All rights reserved. 4 Linuxの全体像
• Linux ◦ 正確には”Linux Kernel”というOSの中核部分を指す ◦ Kernelを中心にProcess管理・FileSystem・Network・Securityを統合する ◦ 周辺ソフト群と結合してディストリビューション(配布用)を形成 ▪ Ubuntu ▪ CentOS ◦ 研究・開発・サーバ運用の基盤として広く用いられる User space Kernel space Hardware Process Management File System Network Stack Device Driver Shell App Server -
Copyright © 2015 every, Inc. All rights reserved. 5 Kernel構造と拡張性
• Monolithic Kernel ◦ すべての主要機能を単一空間に統合し、高速性を実現 • Micro Kernel ◦ 最小限の要素を残して残余機能をユーザ空間へ分離 → 柔軟性と安全性を高める • Linuxの特徴 ◦ Monolithicを採りつつ、Kernelモジュールにより動的拡張性を確保 → 一体型の高速性と、必要機能だけを動的に追加できる柔軟性を併せ持つ Monolithic Micro Kernel Process Management File System Network Stack Device Driver Kernel User space File System Network Stack Load / unload on demand 最小限の要素 -
Copyright © 2015 every, Inc. All rights reserved. 6 •
Process ◦ 独立した実行単位 ◦ スケジューラがCPU時間を公平に割り当てる ◦ fork(): 親Processを複製 ◦ exec(): 新しいプログラムで置換 • Thread ◦ Process内でメモリを共有 ◦ 軽量かつ高速な並行実行を実現 ProcessとThread管理 親process 子process (親processのコピー) 新しいプログラム Process FD PID Thread 1 Memory Space Thread 2 private stack private stack Shared Heap/Code fork() exec() -
Copyright © 2015 every, Inc. All rights reserved. 7 •
Processが物理メモリを意識しなくてよい環境 ◦ 各Processに独立した仮想アドレス空間を与える ◦ 物理メモリの存在を隠蔽して抽象化 • 仮想・物理アドレス管理 ◦ ページテーブルで仮想アドレスと物理アドレスが対応 ◦ Translation Lookaside Bufferが対応関係をキャッシュ → 高速化 • 効率化 ◦ デマンドページング ▪ アクセス時に実体を確保 → 使用される領域のみ物理メモリ上に展開 → 無駄がない ◦ COW (Copy on Write) ▪ fork直後は共有 ▪ 書き込み時に初めてコピー • メモリ圧迫時の対応(右図) メモリ管理 メモリ圧迫 ページキャッシュ 開放 不足? 匿名ページを スワップへ退避 不足? OOM Killer (プロセス終了) 回避・終了 yes no no yes -
Copyright © 2015 every, Inc. All rights reserved. 8 •
VFS ◦ 異なるFileSystemを抽象化し、共通インターフェースを提供 • inode ◦ メタデータ(UID, GID, パーミッション, サイズ等)とデータブロック参照を保持 • ext4 ◦ ジャーナリングにより信頼性を確保し、遅延アロケーションで効率を高める ◦ 実運用において広く利用される堅牢な FS inode構造の例 • inode number: 12345 • UID/GID: 1000/1000 • Permissions: rw-r--r-- • Size: 4 KB • Data blocks -> [ptr] FileSystemの仕組み VFS API (open/read) NFS ext4 XFS -
Copyright © 2015 every, Inc. All rights reserved. 9 •
DAC (Discretionary Access Control) ◦ Owner/Group/Othersにr (Read) / w (Write) / x (Execute)を割り当て ◦ ユーザーやグループのファイルやディレクトリに対する基本的なアクセス制御 ◦ 特殊bit (SUID/SGID/Sticky) ▪ DACに追加の権限を付与 ▪ 例:所有者の権限で動作 ◦ ACL (Access Control List) ▪ ユーザ単位で細かいアクセス権を設定可能 ▪ 柔軟性を担保 • SELinux ◦ MACによりポリシー違反の操作を強制的に拒否 ◦ MAC (Mandatory Access Control) ▪ rootに対してもアクセス制御可能 権限とセキュリティ -
Copyright © 2015 every, Inc. All rights reserved. 10 シェルと入出力制御
• シェル ◦ コマンドインタプリタとして動作 ◦ fork/execで外部プログラムを起動 • 標準入出力 ◦ stdin(0) / stdout(1) / stderr(2) • 環境変数(PATH, HOME, LANGなど) ◦ 子Processに継承される動作設定 • リダイレクト “>”, “2>” ◦ I/O をファイルに向ける • パイプ “|” ◦ 左の stdout を右の stdin へ渡す -
12 Copyright © 2015 every, Inc. All rights reserved. コマンド
• コマンドはシェルと呼ばれるプログラムによって起動/制御され 、カーネルによって実行/管理される • シェルは、端末(ターミナル)と呼ばれるプログラム内で動作する • ビルトインコマンドと外部コマンドの 2種類がある • 外部コマンドはC言語などをコンパイルしたバイナリ やシェル、 Pythonスクリプト が/binなどに置かれる • バイナリは直接実行され、スクリプトはインタプリタが起動してコマンド実行される • シェルは、入力されたコマンドと同じ名前のプログラムを環境変数 PATH から探し出し起動する コマンドを入力 ユーザー コマンドを解釈 プロセスを生成 プロセスを実行 プロセスが完了 終了ステータス を受け取る シェル カーネル ユーザに 制御を戻す -
14 Copyright © 2015 every, Inc. All rights reserved. Terminal
• terminalは、ユーザーとコンピュータの間のインターフェース • コマンドラインインターフェース (CLI)を提供し、ユーザーがコマンドを入力してシステムを操作する際に用いるも の • terminalとshellは標準入力と標準出力を通じて情報のやり取りを行います • terminalを通じてshellを起動し、入力した情報を shellに渡し、shellが解釈してプログラムを起動 /実行する • terminalにて実行されたプログラムはプロセスとして実行されます。 https://www.cc.kyoto-su.ac.jp/~yasuda/proga/02/Command1.ht ml Finder Terminal zsh 起動 cd ls 起動 コマンド入力で起動 コマンド入力で起動 終了 終了 -
16 Copyright © 2015 every, Inc. All rights reserved. カーネル
シェル Terminal ユーザからのコマンド 標準出力がある場合は その文字列を返す カーネルがわかるように 解釈してコマンドを実行 カーネルの処理結果を 解釈する • 概要 • オペレーティングシステムとユーザーの間に立つインターフェース • コマンドを入力することで動作するプログラム • ユーザーがOSのカーネル(UNIX / Linux の中核)に直接アクセスすることなく、より安全に操作を行う ための「殻」のような役割を果たす ※カーネルは、OSの中核となるソフトウェアであり、 ハードウェア(メモリやCPUなど)とアプリケーションの間のインターフェースを提供する Shell -
18 Copyright © 2015 every, Inc. All rights reserved. 前提
Go言語で自作CLIコマンド「tsv2csv」を実装してビルドし、バイナリファイルを作成した。 tsvファイルのパスを指定することで、 csv形式に変換したファイルを生成できるツールだ。 このコマンドをGlobalに実行できるようにしたい。 生じた問題 CLI上でtsv2csvを実行しても「zsh: command not found: tsv2csv」と表示された。 Goのソースファイルは消してしまい、バイナリファイルの場所も忘れた。 バイナリファイルを探し出し、使えるようにするには どのコマンドをどの手順で実行する必要があるでしょうか? CLIだけで下記の操作を実現したい場合、どういうコマンドが必要ですか? -
19 Copyright © 2015 every, Inc. All rights reserved. やらないといけないこと
画面はこんな感じ 1. バイナリファイルを見つける a. カレントディレクトリを確認 b. ホームディレクトリに移動 c. ホームディレクトリに何があるのかを確認 d. バイナリファイルの場所を特定 2. コマンドを動かせるようにする a. ファイルをGlobalで動かせる場所に移動 b. コマンドに実行権限を付与 c. (検証用のファイルを作成) d. コマンドを実行 e. 結果を確認 -
20 Copyright © 2015 every, Inc. All rights reserved. やらないといけないこと(具体)
1. バイナリファイルを見つける a. カレントディレクトリを確認 b. ホームディレクトリに移動 c. ホームディレクトリに何があるのかを確認 d. バイナリファイルの場所を特定 2. コマンドを動かせるようにする a. ファイルをGlobalで動かせる場所に移動 b. コマンドに実行権限を付与 c. (検証用のファイルを作成) d. コマンドを実行 e. 結果を確認 画面はこんな感じ -
21 Copyright © 2015 every, Inc. All rights reserved. やらないといけないこと(具体)
1. バイナリファイルを見つける a. カレントディレクトリを確認 b. ホームディレクトリに移動 c. ホームディレクトリに何があるのかを確認 d. バイナリファイルの場所を特定 2. コマンドを動かせるようにする a. ファイルをGlobalで動かせる場所に移動 b. コマンドに実行権限を付与 c. (検証用のファイルを作成) d. コマンドを実行 e. 結果を確認 画面はこんな感じ -
22 Copyright © 2015 every, Inc. All rights reserved. pwdコマンドで/home/every/project/go/cli
がカレントディレクトリなことがわかる。 バイナリファイルを見つける|そもそも今どこのディレクトリにいるのかを確認する $ pwd (print working directory) カレントディレクトリを確認する パスを見れば大体見当がつくが、 現在ログインしているユーザも確認しておきたい。 whoamiコマンドで現在ログインしているユーザーの名前 を表示することができ、 everyであることがわかる。 自分でバイナリファイルを作成したので、 /home/every配下を探索すると良さそう。 -
23 Copyright © 2015 every, Inc. All rights reserved. 絶対パス:
rootから始まるパス。 特定のファイルやディレクトリの 絶対的な位置を示す 絶対パスと相対パス / /lib /usr /local … /lib /bin /share コンピュータのファイルシステムは階層的に管理されている パスによってユーザーやプログラムが必要なリソースにアクセスできる / (root):ファイルシステムの最上位に位置するディレクトリ。全てのファイルやディレクトリの親 /home/usr/local/bin ./bin Current /home/usr ../ /apt /home/lib/apt ../../lib/apt 相対パス: カレントディレクトリからの 相対的な位置を示す -
24 Copyright © 2015 every, Inc. All rights reserved. lsコマンドはオプションが豊富
(--help) -a, --all do not ignore entries starting with . -h, --human-readable with -l and -s, print sizes like 1K 234M 2G etc. -l use a long listing format -s, --size print the allocated size of each file, in blocks tips) オプションは組み合わせて-alhみたいな指定も可 lsコマンドでカレントディレクトリのファイルを一覧表示できる。 main.goしかなさそうなので /home/every/project/go/cli にtsv2csvはなさそう。 バイナリファイルを見つける| カレントディレクトリにバイナリがあるかどうかを確認 $ ls (list) ファイルを一覧表示する -
25 Copyright © 2015 every, Inc. All rights reserved. ファイルを探すために一旦ホームディレクトリへ戻る。
cd [PATH]が一般的だが、何も指定しないとホームディレクトリに移動する。 バイナリファイルを見つける| ホームディレクトリに移動 $ cd (change directory) カレントディレクトリを変更する [PATH]には絶対パスでも相対パスでも OK ~(チルダ)は、現在のユーザーのホームディレクトリを表 す記号なのでcd ~ でもcd と同じ意味になる。 $HOME でもホームディレクトリに移動できる -
26 Copyright © 2015 every, Inc. All rights reserved. lsしてもどのプロジェクトかわからない。ファイル名はわかってるので
findコマンドは使えそう。 ディレクトリも検索できるが今回はファイルを探したいので find -type f -name tsv2csv でOK バイナリファイルを見つける| ファイルを見つける $ find ファイル、ディレクトリを検索する オプション 説明 -name "pattern" ファイル名で検索。ワイルドカード(*.txt など)も可能 -iname "pattern" -nameの大文字小文字を区別しない版 -type f ファイルのみを検索 -type d ディレクトリのみを検索 -mtime n n日前に更新したファイル -atime n n日前にアクセスしたファイル -maxdepth n 検索するディレクトリ階層の深さをnに制限 -
27 Copyright © 2015 every, Inc. All rights reserved. 再掲)やらないといけないこと(具体)
1. バイナリファイルを見つける a. カレントディレクトリを確認 b. ホームディレクトリに移動 c. ホームディレクトリに何があるのかを確認 d. バイナリファイルの場所を特定 2. コマンドを動かせるようにする a. ファイルをGlobalで動かせる場所に移動 b. コマンドに実行権限を付与 c. (検証用のファイルを作成) d. コマンドを実行 e. 結果を確認 -
28 Copyright © 2015 every, Inc. All rights reserved. 1.
バイナリファイルを見つける a. カレントディレクトリを確認 b. ホームディレクトリに移動 c. ホームディレクトリに何があるのかを確認 d. バイナリファイルの場所を特定 2. コマンドを動かせるようにする a. ファイルをGlobalで動かせる場所に移動 b. コマンドに実行権限を付与 c. 検証用のファイルを作成 d. コマンドを実行 e. 結果を確認 再掲)やらないといけないこと(具体) -
29 Copyright © 2015 every, Inc. All rights reserved. コマンドをどこからでも実行できるようにしたいのでファイルを移動させる必要がある。今回は自作コマンドなので、
コマンドの探索PATH(※)に含まれているかつ、システムの影響を受けにくい /usr/local/bin に移動する。 コマンドを動かせるようにする |ファイルを移動する $ mv [SOURCE] [DIRECTORY] ファイル、ディレクトリを移動、名前変更 mv はrenameの役割としても使用される mv --helpにも下記のように記載されている。 Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. $mv <source_file_path> <renamed_file_path> ※)PATH:コマンドの実行ファイルがどこに位置しているかを示す環境変数。指定し たパスを順に探索する。 -
30 Copyright © 2015 every, Inc. All rights reserved. コマンドを移動させたので実行したが、
Permission deniedとなり実行できなかった。なぜだろう? ls -l で権限を確認したら実行権限がなさそうなので追加する必要がある。 コマンドを動かせるようにする |バイナリに実行権限を付与する Permission denied -
31 Copyright © 2015 every, Inc. All rights reserved. コマンドを動かせるようにする
|バイナリに実行権限を付与する パーミッション リンク数 所有者 所有グループ ファイルサイズ (byte) 最終更新日時 名前 $ ls -lの見方 フ ァ イ ル 種 別 所 有 者 グ ル | プ そ の 他 -rw-rw-r-- ファイル種別は下記の通り -:通常ファイル d:ディレクトリ l:シンボリックリンク -
32 Copyright © 2015 every, Inc. All rights reserved. コマンドを動かせるようにする
|バイナリに実行権限を付与する パーミッション 対象 • ユーザーやグループがファイルやディレクトリに対してどのような操作を行うことができるかを制御する仕組み • 通常、所有者、グループ、およびその他のユーザーに対して設定する 種類 操作 u: 所有者 (owner) g: グループ (group) o: その他 (others) r (4): 読み取り (read) w (2): 書き込み (write) x (1): 実行 (execute) +:追加 -:削除 =:指定したものに設定 a: 全て(all) つまり所有者の 実行権限(x)が足りない! フ ァ イ ル 種 別 所 有 者 グ ル | プ そ の 他 -rw-rw-r-x 4 2 1 4 2 1 4 2 1 6 6 5 -
33 Copyright © 2015 every, Inc. All rights reserved. 所有者に実行権限
(x)がないので追加する場合 # sudo chmod +x /usr/local/bin/tsv2csv # sudo chmod 764 /usr/local/bin/tsv2csv のどちらでも実行権限を付与できる。 whichコマンドでパスが通ってるか確認できます シンボリックモード(記号で指定) : u+x のように記号で直感的に指定する方法 オクタルモード(数値で指定) : 755 のように3桁の数字(8進数)で指定する方法 コマンドを動かせるようにする |バイナリに実行権限を付与する $ chmod [OPTION][MODE] FILE アクセス権(パーミッション)を変更する -
34 Copyright © 2015 every, Inc. All rights reserved. 複数のディレクトリを作成できたりもする。
-p, --parents 親ディレクトリが存在しない場合は、必要に応じて親ディレクトリを作成す る。 -v, --verbose 作成されたディレクトリごとにメッセージを表示する 検証用のファイルを作りたい。 ホームディレクトリには作りたくないので新しく project/script/test ディレクトリを作成する コマンドを動かせるようにする |検証用のファイルを作成 $ mkdir [OPTION] DIRECTORY DIRECTORY(ies)を作成する -
35 Copyright © 2015 every, Inc. All rights reserved. 検証用にtsvファイルを作成する。
• touch コマンドでファイル作成。 • echoコマンドで文字列を標準出力 • オプション -e でバックスラッシュエスケープを有効化 • リダイレクト > を使用して標準出力をファイルに上書き • リダイレクト >> を使用してファイルの末尾に追記 • cat コマンドで作成したファイルを確認。 • ファイル指定が 1つの場合はそのファイルの内容を参照 あとは tsv2csvコマンドを実行すれば OK コマンドを動かせるようにする |検証用のファイルを作成 $ touch [OPTION] FILE ファイルを作成する (またはタイムスタンプを更新する) $ echo [TEXT] 文字列を標準出力する $ cat [OPTION] [FILE] ファイルを結合して標準出力する -
37 Copyright © 2015 every, Inc. All rights reserved.
その他の便利なコマンド $ | (パイプ) 標準出力を次のコマンドの標準入力に渡す 標準出力を元に | grep [オプション ] 検索パターン で正規表現で文字列のパターン検索が可能。 アクセスログからエラー箇所を特定する、 ls結果から特定のファイルを見つけるなど、色々な場面で使え る -
38 Copyright © 2015 every, Inc. All rights reserved. URLで示されるネットワーク上のリソースに対して
様々なプロトコルでアクセスできる。 オプション : --version インストールされているバージョンを確認できる -X リクエストメソッドを指定できる(指定しない場合はGET) -H HTTPヘッダを指定できる -d リクエストボディに含めるデータを指定できる -v 通信の詳細を出力できる その他の便利なコマンド $ curl URLを使用してデータを送受信する HTTPやFTPなど、様々なプロトコルを用いてデータの送受信ができる -
41 Copyright © 2015 every, Inc. All rights reserved. Gitとは
OSSの分散型バージョン管理ツール • ソースコードなどのファイルの履歴を管理 • ブランチモデルを採用しており、完全に独立した複数のローカルブランチを持つことが可能 • 複数の変更を管理して 1つに統合可能 独立して開 発 変更管理 変更の統合 独立して開 発 変更管理 同期 文献)https://git-scm.com/ 独立して開 発 branch1 branch2 branch3 -
42 Copyright © 2015 every, Inc. All rights reserved. 利用目的
誰が、いつ、何を変更したかを追跡できる • どのアカウントが、どの時間に何を変更したかが全てログとして残る • 状態の分岐(ブランチ)を作成して、他に影響を出さずに複数の変更を並行して作業できる • リモートリポジトリ(GitHubなど)を利用することで、効率的なチーム開発が可能 Feature Releas e Topic ブランチ管理 リモートリポジトリ ローカルリポジトリ ローカルリポジトリ push pull push pull sync sync -
43 Copyright © 2015 every, Inc. All rights reserved. Git
のバージョン管理の仕組み Gitはデータをスナップショットとして保存している 差分を計算する必要がないので処理が高速 コミットを辿ることで過去の バージョンを復元 することが可能 A コミット 3 コミット 2 時系列 ファイルA ファイルB ファイルC ファイルA ファイルC ファイルB ファイルD ファイルE A A M M M A A コミット 1 -
45 Copyright © 2015 every, Inc. All rights reserved. ワークツリー
• git clone [REPOSITORY] ◦ リモートリポジトリのクローンを ローカルディレクトリに作成する • git init ◦ 空の Git リポジトリを作成する ◦ デフォルトで.git ディレクトリが作成される ◦ すでにあるものを上書きすることはない 初期化 ワークツリー clone .git/ -
46 Copyright © 2015 every, Inc. All rights reserved. 変更の追跡とコミット
• git add [FILE]... ◦ ワークツリー(作業している場所)から対象をインデックスに追加 ◦ コミットに含める対象として認識させる • git commit [OPTION] ◦ インデックスに追加されている変更履歴をリポジトリに永久的に保存 ◦ コミットメッセージ(commit message)で変更理由を説明する ファイルA ファイルB ファイルC リポジトリ ステージング ワークツリー ファイルA ファイルA ファイルB commit add -
Copyright © 2015 every, Inc. All rights reserved. 47 リモートリポジトリへの反映、同期
• git pull ◦ リモートリポジトリの変更をローカルに反映する ファイルA ファイルB リモートリポジトリ ローカルリポジトリ ファイルA ファイルB pull • git push ◦ ローカルの変更をリモートリポジトリに反映する ファイルA ファイルB リモートリポジトリ ローカルリポジトリ ファイルA ファイルB push -
Copyright © 2015 every, Inc. All rights reserved. 49 ブランチの一覧
$ git branch [OPTION] [BRANCH_NAME] • ブランチの一覧表示、作成、削除 • 引数がない場合、既存のローカルブランチがリストされる • git branch BRANCH_NAME で新しくブランチを作成できる • オプション ◦ -r :リモート追跡ブランチを一覧表示 ◦ -a :ローカルとリモートの両方のブランチを表示 ◦ -d :ブランチを削除 -
Copyright © 2015 every, Inc. All rights reserved. 50 $
git checkout [-b|-B] <branch> • ブランチの切り替えや作業ツリーファイルの復元を行う。 • -bオプションを指定すると、 git branchと同じように新しいブランチが作成される。 ブランチの切り替え $ git switch [<options>] (-c|-C) <new-branch> • ブランチを切り替える • -c オプションを指定すると新しいブランチを作成できる。 -
Copyright © 2015 every, Inc. All rights reserved. 51 差分表示
$ git diff • 特定のコミット・ブランチ間の差分を表示 • 引数なしでgit add していない差分を表示 • git diff HEAD でワークツリーと最新コミットの差分を 表示 • git diff [COMMIT1] [COMMIT2]でコミット間の差分を みることができる $ git status • リポジトリの現在の状態を確認 • 表示される情報 ◦ 現在いるブランチ名 ◦ リモートと同期しているかどうか ◦ ステージングされている変更 ◦ ステージングされていない変更 ◦ トラッキングされていないファイル -
Copyright © 2015 every, Inc. All rights reserved. 52 コミットを打ち消す
$ git revert [COMMIT_HASH] • 過去のコミットを打ち消すための 新しいコミットを作る • 特定のコミットの差分の逆を適用する -
Copyright © 2015 every, Inc. All rights reserved. 54 とは?
• Git をベースにしたバージョン管理リポジトリのホスティングサービス(リモートリポジトリ) • リポジトリ/ブランチ/コミットの管理の他、以下のような機能がある ◦ プルリクエスト(Pull Request, PR) ▪ あるブランチでの変更を他のブランチに統合する際のレビュー・承認プロセスの機能 ◦ イシュー(issue) ▪ プロジェクトに関するタスクや問題点を議論する場を提供する機能 ◦ アクション(Actions) ▪ GitHub Actions。自動化されたワークフローを作成できる ▪ 自動テストやCI/CDなどに利用される ファイルA ファイルB リモートリポジトリ ローカルリポジトリ ファイルA ファイルB pull push -
Copyright © 2015 every, Inc. All rights reserved. 58 各講義の課題でレビューが必要な場合はSettings
> Collaboratorsにレビュワーのアカウントを追加してください。 fork -
Copyright © 2015 every, Inc. All rights reserved. 60 二分探索木
• バイナリ木データ構造 ◦ 各ノードのキーが左サブツリーのすべてのキーより大きい ◦ 各ノードのキーが右サブツリーのすべてのキーより小さい • 要素数nとして平均的な検索時間O(log n)が実現 • 最悪の場合、木の不均衡により性能が O(n)まで悪化する 4 2 6 1 3 5 7 7 6 5 4 3 2 1 n log n -
Copyright © 2015 every, Inc. All rights reserved. 61 AVL木
• 自己平衡二分探索木 ◦ 「木の回転」と呼ばれるメカニズムを通じてバランスを維持する • 最悪の場合でもO(log n)の時間計算量を保証 2 1 3 4 5 2 1 4 5 3 log n -
Copyright © 2015 every, Inc. All rights reserved. 62 二分探索木とAVL木の弱点
• 木を1段下りるたびに1回I/Oが発生する • ディスク読み出しはメモリよりはるかに遅い →木が高い(段が多い)ほど遅くなる 2 1 4 5 3 木の深さの増大 →B+木により解決 -
Copyright © 2015 every, Inc. All rights reserved. 63 B木
• 多分岐木 • 各ノードは以下を含む ◦ ソートされた複数のキー ◦ 子への複数のポインタ • 葉ノードは同じ深さ ◦ バランスを保証し、木の高さを削減 →ディスクI/Oを最小化 1 2 4 5 6 3 7 8 葉ノード 内部ノード -
Copyright © 2015 every, Inc. All rights reserved. 64 B木(操作:検索
/ 挿入 / 削除) • 検索:1ノード内で複数キーをまとめて比較 →どの子へ降りるか決める • 挿入:挿入→オーバーフローしたら分割→真ん中を親へ押し上げ • 削除:削除 →バランスが崩れたら移動 10 20 30 25 10 20 25 30 挿入 1ノード3データ オーバーフロー 親 10 20 25 30 10 20 25 30 10 25 30 20 25 30 重複 10 25 25 30 親の削除 子の削除 20 25 30 消滅 10 25 30 消滅 -
Copyright © 2015 every, Inc. All rights reserved. 65 B木(弱点)
• ストレージ効率低下 ◦ 部分充填ノードによりページ(葉ノード)が断片化し、空き領域が増える ◦ 分割/マージ頻度を下げるためにfill factorを低めに設定すると、さらなる無駄が発生 • 書き込みオーバーヘッド ◦ 1レコード更新でも、木のバランスを保つ操作(分割や回転)が連鎖的に発生 • 順次アクセス / 範囲クエリが非効率 ◦ 内部ノードにもペイロードがあるため、葉ノードのみの連続的な走査ができない →ポインタの追跡が増加 ◦ キャッシュ局所性が悪化し、広範囲では木の大部分を走査することになる ポインタ追跡の増加・木の大部分の走査 →B+木により解決 各ページをどの程度詰めて格納するかを示す目標占有率 -
Copyright © 2015 every, Inc. All rights reserved. 66 B+木
• 葉ノード ◦ 実際のデータレコード(またはデータレコードへのポインタ)を格納 • 内部ノード ◦ 適切な葉ノードへの検索を導くポインタとして機能するキーのみが含まれる ◦ データレコードは含まれない • リンクされた葉ノード ◦ 葉ノード間はリンクされている ◦ 効率的な順次アクセスと範囲クエリが可能になる 1 2 3 4 5 3 6 6 7 8 葉ノード 内部ノード リンクされた葉ノード -
Copyright © 2015 every, Inc. All rights reserved. 67 •
検索:内部ノードで範囲を決めて葉まで降りる( B木と同様) ◦ 単一キー検索:葉でキーを見つけて値を返す(内部には値がないため) ◦ 範囲検索:開始キーがある葉へ行き、葉の連結を順にたどって連続的に取得 • 挿入:挿入→オーバーフローしたら分割 • 削除:削除→バランスが崩れたら移動 B+木(操作:検索 / 挿入 / 削除) 10 20 30 25 10 20 30 25 10 20 20 30 10 30 30 25 25 30 25 30 30 10 20 30 1ノード3データ 挿入 10 20 30 25 親の削除 子の削除 消滅 オーバーフロー -
Copyright © 2015 every, Inc. All rights reserved. 68 B+木(利点)
• 範囲クエリの高速化 ◦ 葉ノードがリンクされることで連続的にキーを横断可能 →範囲検索が大幅に速い • 予測可能なレイテンシ ◦ 全検索が同じ深さ(ルート→葉) →パス長一定でパフォーマンスを予測可能 • 内部ノードの高密度化 ◦ 内部ノードはキーのみ格納するため、 1ノードあたりのキー数が増加 →分岐数が増加するため、ツリーが低くなる • 順次アクセスの効率化 ◦ 葉のリンクで連続読み出し → 連続配置された大量のデータを読み書きする場合に強力 -
Copyright © 2015 every, Inc. All rights reserved. 69 B+木(弱点)
• ストレージ微増(内部キーの重複) ◦ 内部ノードと葉でキーを重複保持 →容量は少し増えるが、検索高速化のための小さな代償 • 書き込み時の追加コスト ◦ 変更のたびに平衡と並び順を維持( B木と同等の制約) →更新はやや重い 書き込みが集中するが、読み取りはそれほど多くない場合 → LSM-treeの導入 -
Copyright © 2015 every, Inc. All rights reserved. 70 LSM木(特徴)
• 書き込み高速化 ◦ 既存ファイルを触らず、DBを追記専用のログとする →低速なランダム書き込みを高速なシーケンシャル I/Oへ • 階層化データ配置(LSM-tree) ◦ 時間経過とともにメモリ層(高速) →ディスク層(低速、大容量)へ順次移動 →主構成:Memtable(メモリ)/ SSTable(ディスク) -
Copyright © 2015 every, Inc. All rights reserved. 71 LSM木(構成)
• MemtableとSSTable ◦ 書き込みはまずRAM(Memtable)へ ◦ 一定条件でDisk(SSTable)へ順序付きでflush ◦ 変更不可ファイルを段階的にマージ( compaction) Write RAM Memtable Disk WAL SSTable L0 Immutable Memtable SSTable L1 SSTable L2 flush compaction Read Read Read Read Read -
Copyright © 2015 every, Inc. All rights reserved. 72 木構造の応用例
• インデックス:DBテーブルからのデータ取得速度を向上させるデータ構造 ◦ テーブル全体をスキャンすることなく、 DBがテーブル内の特定の行を高速に参照 ▪ 参照列がすべてインデックス内のものだった場合、テーブル本体を読まずに完了 ◦ テーブルから選択された列のコピーを作成し、そのコピーを木構造に格納することで機能する ▪ 追加のストレージ、INSERT/UPDATE/DELETEで更新が発生 →作りすぎは逆効果 / 低選択性は効果薄 -
Copyright © 2015 every, Inc. All rights reserved. 73 木構造の応用例
• DataBase ◦ MySQL(InnoDB / B+木) ▪ 主キーも二次もB+木索引 ▪ 葉ノードがリストになっているため範囲検索が速い ◦ PostgreSQL(B木) ▪ B-treeでインデックスを作成 ▪ 検索を高速化 ◦ Cassandra(LSM) ▪ メモリで整列→ディスクへ順序書き出し→マージ ▪ LSM木で書き込み最適化 • FileSystem ◦ ext4(B木 / B+木) ▪ ディレクトリはハッシュ付きB-tree ▪ ファイル配置はextentをB+木風に管理 ◦ XFS(B木 / B+木) ▪ 区画(AG)ごとにB/B+木でファイル位置・空き領域・inodeを効率よく操作 -
Copyright © 2015 every, Inc. All rights reserved. 75 配列:定義とメモリモデル
• 同じ形のデータが、メモリ上に並んでいる • a[i] は「先頭から i 個ぶん進んだ場所」をそのまま読めばよい → ランダムアクセスが速く(O(1))、キャッシュにもやさしい base a[0] a[1] a[2] 同じ幅で連続して並ぶ -
Copyright © 2015 every, Inc. All rights reserved. 76 動的配列
• 動的配列:動的に、配列に格納できるデータ量を変化可能 • 「いま入っている数(size)」と「再配置なしで入る上限(capacity)」を分けて管理 • 容量上限に到達→容量を倍くらいに広げて、中身を新しい場所にまとめて移す • 平均すると末尾追加は速い(O(1)) 容量: 4 サイズ: 3 容量: 8 サイズ: 3 -
Copyright © 2015 every, Inc. All rights reserved. 77 •
計算量 ◦ a[i]:O(1) ◦ 挿入・削除:O(n) ◦ 探索:O(n) • 数値配列、固定サイズのレコード、ランダムにアクセスする処理に適する • 更新が多い処理、大きな要素の大量コピー、容量移動の瞬間にコストがかかる スペースを作るために i…n-1番目の要素を1つずらす 配列:操作ごとの計算量 探索: O(n) 挿入・削除: O(n) a[i]: O(1) i番目のデータに 直接遷移 i番目のデータを挿入 各要素に一度アクセス -
Copyright © 2015 every, Inc. All rights reserved. 78 リスト:定義とメモリモデル
• 要素ノードをポインタで連鎖した構造(単方向 / 双方向)。 • 途中での要素の入れ替え(繋ぎ直し)は 場所が分かっていれば速い(O(1)) • ただし、i 番目を探すのは 先頭から数えるしかない(O(n)) • ノードがバラバラの場所にあるので、キャッシュにのりにくい head val next val next val next NULL 単方向 NULL val next val next NULL val prev prev prev next 双方向 -
Copyright © 2015 every, Inc. All rights reserved. 79 リスト:計算量
• 計算量 ◦ i番目へ進む:O(n) ◦ 挿入・削除:O(1)(ポインタの付け替え) ◦ 走査:O(n)(局所性が低いため遅くなる傾向) • ユースケース ◦ 途中の要素を頻繁に入れ替える ◦ 要素をまとめて別の場所へ移動したい ◦ 参照が安定(他の要素のアドレスが変わらない)してほしい • メモリ確保が多く、分岐や間接参照で速度が出にくい -
Copyright © 2015 every, Inc. All rights reserved. 80 配列
vs リスト:実運用上の観点 観点 配列 リスト 速さ メモリ上の並び良 キャッシュ効率高 ノードが飛び飛び キャッシュミス増 参照の 安定性 要注意:再確保・拡張時のデータ移動で参 照が無効化されることがある 比較的安定: ノード単位で確保→無効化されにくい 中間位置の 更新 コスト高: 挿入・削除で後続要素をずらす必要 コスト低: 前後のポインタをつなぎ直すだけ ランダムアク セス O(1):インデックス O(n):先頭からたどる メモリオー バーヘッド 低め:容量分だけ確保 高め:ポインタ分のオーバーヘッド WIN WIN WIN WIN -
Copyright © 2015 every, Inc. All rights reserved. 81 FIFO/LIFO:抽象仕様
LIFO(stack):最後に入れたものが最初に出る( Last-In First-Out)。 FIFO(queue):最初に入れたものが最初に出る( First-In First-Out)。 x y z push pop x y z head enqueue dequeue tail LIFO FIFO -
Copyright © 2015 every, Inc. All rights reserved. 82 リストベースStack/Queue
• O(1) とスループットは同義ではない • リストでもO(1)でStack/Queueを実現できるが、同じO(1)でも配列のほうが速い ◦ Stack×単方向リスト:先頭へのpush/先頭からのpop → O(1) ◦ Queue×双方向(単方向)リスト:後尾への push/先頭からのpop → O(1) → 高スループットが要件なら配列、参照安定性やスプライスが要件ならリスト head val next NULL head val next NULL new next push_front pop_front val next NULL val next NULL val prev prev next val prev next pop_front push_back Stack Stack Queue -
Copyright © 2015 every, Inc. All rights reserved. 84 ハッシュ
• ハッシュ ◦ 「長いデータ → 一定長の値」に変えるしくみ ◦ 例:ハッシュテーブル • DB/KVS、言語処理、ネットワーク、セキュリティなどに使用 • 良いハッシュの条件 ◦ 速い・偏らない・メモリに当たりやすい(キャッシュ) key h 固定長出力 e.g. index @ ハッシュテーブル -
Copyright © 2015 every, Inc. All rights reserved. 85 ハッシュ
• 目標性能:平均 O(1) の検索・追加・削除 • 負荷率 α = 要素数 n / バケット数 m(αが高いほど遅くなる) • 衝突処理は 2 方式:連鎖法 / 開番地法 ◦ 連鎖法:同じハッシュ値になった要素は配列やリストに格納 ◦ 開番地法:要素そのものを配列に格納 →衝突したら空いている別の位置に格納 k3 k11 k19 k7 k15 0 3 k2 1 2 NULL A B C 0 1 2 3 4 5 h(X) = 1 衝突 → 2は空き → 2にXを置く(線形プローブ) 連鎖法 開番地法 -
Copyright © 2015 every, Inc. All rights reserved. 86 ハッシュ
• プローブ戦略 ◦ 線形:単純だが固まりやすい ◦ 二次:固まりにくい(調整やや難) ◦ 二重ハッシュ:周期を避けやすい(計算やや増) • Tombstone † ◦ 削除跡 ◦ 探索の連続性を守るが、溜まると遅くなる ◦ 増えすぎたら再ハッシュ / ロビンフッド法 • 漸進リハッシュ:負荷率αが閾値を超えたら容量拡大 ◦ データの移し替えは少しずつ行う A † B C 0 1 2 3 4 5 Tombstone -
Copyright © 2015 every, Inc. All rights reserved. 87 ハッシュ(選択方法)
• 非暗号学的(Murmur/xxHash など) ◦ 速くて分布が良い → ハッシュ表・重複排除・分散割当 • 暗号学的(SHA-2/3, BLAKE2/3) ◦ 改ざん耐性強 → 検証・署名・整合性向け • 公開系は鍵付きハッシュ(SipHash)→hash-flooding対策 • CRCは偶発エラー検出向け。改ざん防止には使えない • パスワードは生ハッシュではなく、 KDF(PBKDF2/bcrypt/Argon2) を使用 -
Copyright © 2015 every, Inc. All rights reserved. 88 ハッシュ(困難性)
• 第一原像困難性:h(x) = yからxを逆算できない (≈ 2n) • 第二原像困難性:既知のxと同じハッシュのx' ≠ xを作れない (≈ 2n) • 衝突困難性:任意の2つでh(x) = h(x')を見つけられない(誕生日攻撃 ≈ 2n/2) ◦ メッセージ認証:HMAC(Length-Extension Attack対策) ◦ 署名:ハッシュ+公開鍵暗号(MACは共有鍵) -
Copyright © 2015 every, Inc. All rights reserved. 89 ハッシュ(実装上の要件)
• x = yならh(x) = h(y)(逆は不要) ◦ 静的なオブジェクトをキーにする →安全性確保 • 速度改善 ◦ キャッシュに優しい配置(開番地法が有利。連鎖法は配列を小さくすることで改善) ◦ fingerprintで早期不一致判定→比較回数を減らす ◦ 並行性:ロック分割、段階的リサイズ、 SIMDで同時比較 (optional) • 静的なキー集合:(最小)完全ハッシュで衝突ゼロ -
Copyright © 2015 every, Inc. All rights reserved. 90 ハッシュ(応用例)
• Bloom filter:あるデータが対象の集合に存在するか確認 ◦ k本のハッシュ関数でbitを立てる ▪ 全て1: 存在する ▪ いずれか0: 存在しない ◦ k ≈ (m/n)·ln2(n: 要素数, m: bit数, k: ハッシュ本数) • Count-Min sketch:ストリーム中の要素の出現回数の大概把握 ◦ 複数のハッシュ関数で要素を変換し、該当セルの値をインクリメント →ある要素の出現頻度は、該当するセル群の値の最小値 ◦ 幅 w ≈ e/ε, 行 d ≈ ln(1/δ)(誤差 ε, 失敗確率 δ) 1 1 1 x 1 0 1 h, g y z w h, g Bloom filter 1 0 2 0 1 2 0 0 0 3 0 0 eleA, eleA, eleB h g f 0 1 2 3 Count-Min sketch. h(eleA) = 2, f(eleA) = 1, g(eleA) = 1 h(eleB) = 0, f(eleB) = 0, g(eleB) = 1 eleAの出現頻度 min(2,2,3) = 2 -
92 Copyright © 2015 every, Inc. All rights reserved. あるアルゴリズムを使った演算の性能を表す指標
計算量の種類 ◦ 時間計算量(処理時間の計算量) ◦ 空間計算量(メモリ使用量の計算量) O記法(オーダー記法) ◦ 特定のアルゴリズムでの計算がどれくらいかかるかを表した記号 ◦ 処理対象のデータが非常に大きくなった時の処理時間を大雑把に評価する ◦ 本研修で登場する計算量の大小関係 計算量 input size time O(N²) O(N) O(log N) O(1) O(NlogN) -
93 Copyright © 2015 every, Inc. All rights reserved. 安定ソート・不安定ソート
元のデータの順序を維持するソート (同じ値の要素の順序が変わらない ) 同じ値の要素の順序が 変わる可能性があるソート 安定ソート 不安定ソート ID 名前 点数 1 A 60 2 B 80 3 C 80 ID 名前 点数 2 B 80 3 C 80 1 A 60 ID 名前 点数 1 A 60 2 B 80 3 C 80 ID 名前 点数 3 C 80 2 B 80 1 A 60 -
94 Copyright © 2015 every, Inc. All rights reserved. バブルソート
5 3 1 2 0 4 5 3 4 1 2 0 5 3 4 1 0 2 5 3 4 1 0 2 5 3 4 0 1 2 5 3 4 0 1 2 5 3 0 4 1 2 5 3 0 4 1 2 5 0 3 4 1 2 5 0 3 4 1 2 0 5 3 4 1 2 0 5 3 4 1 2 0 5 3 4 1 2 0 5 3 4 1 2 0 5 3 1 4 2 0 5 3 1 4 2 0 5 1 3 4 2 0 5 1 3 4 2 0 1 5 3 4 2 0 1 5 3 4 2 0 1 5 3 4 2 0 1 5 3 2 4 0 1 5 3 2 4 0 1 5 2 3 4 0 1 5 2 3 4 0 1 2 5 3 4 0 1 2 5 3 4 0 1 2 5 3 4 0 1 2 5 3 4 0 1 2 3 5 4 0 1 2 3 5 4 0 1 2 3 5 4 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 すべての隣り合った値を比較して、小さい方が前になるように交換していく方法 比較対象 ソート済み 完了 -
95 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 (すでにソートされている場合) 実装が簡単 安定ソート 効率が悪い 大規模なデータセットには不向き バブルソート -
96 Copyright © 2015 every, Inc. All rights reserved. 4
0 3 2 1 4 0 3 2 1 0 4 3 2 1 0 4 3 2 1 0 4 3 2 1 0 1 3 2 4 0 1 3 2 4 0 1 3 2 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 配列の整列されていない部分から最小値または最大値を持つ要素を探して、その値を未整列の先頭要素に移 動(交換)することを繰り返す 選択ソート 注目対象 ソート対象 完了 -
97 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 実装が簡単 交換回数が少ないので交換コストが高いデータに対しては効率的 効率が悪く、大規模なデータセットには不向き 不安定ソート 選択ソート -
98 Copyright © 2015 every, Inc. All rights reserved. 4
2 3 6 5 1 以下の配列を選択ソートを用いて昇順にする場合交換回数は何回になるでしょうか 選択ソート 1 2 3 4 3 2 1 4 2 3 1 4 問題 -
99 Copyright © 2015 every, Inc. All rights reserved. 4
2 1 0 3 4 2 1 0 3 4 2 1 0 3 2 4 1 0 3 2 4 1 0 3 1 2 4 0 3 1 2 4 0 3 0 1 2 4 3 0 1 2 4 3 0 1 2 3 4 配列の整列済みの部分に対して新たな要素を適切な位置に挿入することで整列を行う 挿入ソート 注目対象 整列済み -
100 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 (すでにソートされている場合) 小規模なデータセット、ほぼソートされたデータには効率的 安定ソート 大規模なデータセットには不向き 挿入ソート -
101 Copyright © 2015 every, Inc. All rights reserved. 7
3 1 4 5 2 0 6 5 2 0 6 7 3 1 4 5 2 0 6 7 3 1 4 5 2 0 6 整列されていないリストを 2つのリストに分割して、それぞれを整列させた後、それをマージして整列済みの一つ のリストを作る 7 3 1 4 マージソート -
102 Copyright © 2015 every, Inc. All rights reserved. 7
3 1 4 5 2 0 6 7 3 1 4 5 2 0 6 1 3 4 7 0 2 5 6 0 1 2 3 4 5 6 7 整列されていないリストを 2つのリストに分割して、それぞれを整列させた後、それをマージして整列済みの一つ のリストを作る マージソート -
103 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 安定ソートである 大規模なデータセットに対しても効率的 追加のメモリが必要 クイックソート -
104 Copyright © 2015 every, Inc. All rights reserved. 配列の中から基準値を選び、残りの要素を基準値よりも小さいグループと大きいグループに分けるという操作
を、グループの要素数が 1個になるまで繰り返す 2 4 5 3 6 0 1 2 1 5 3 6 0 4 2 1 5 3 6 0 4 2 4 5 3 6 0 1 2 1 0 3 6 5 4 2 1 0 3 6 5 4 0 1 2 3 6 5 4 0 1 2 3 6 5 4 0 1 2 3 4 5 6 クイックソート 注目対象 ソート対象 完了 グループ境界 0 1 2 3 4 5 6 -
105 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 平均的に非常に速い メモリ効率が良い 不安定ソート クイックソート -
106 Copyright © 2015 every, Inc. All rights reserved. 未整列のデータを「ヒープ」の性質を持つ木構造の構成にして、そこから最大値または最小値を取り出して整列と
いうのを繰り返す 0 4 1 2 3 0 4 1 2 3 0 1 4 2 3 0 1 4 2 3 0 1 2 4 3 0 2 4 3 1 0 2 3 1 4 0 2 1 3 0 2 1 3 0 2 3 1 0 2 3 1 3 0 2 1 2 0 1 2 0 1 0 2 1 0 2 1 2 0 1 0 1 0 1 0 1 0 1 0 0 0 ヒープソート 2 1 3 0 4 0 4 1 2 3 -
107 Copyright © 2015 every, Inc. All rights reserved. 未整列のデータを「ヒープ」の性質を持つ木構造の構成にして、そこから最大値または最小値を取り出して整列と
いうのを繰り返す ヒープソート 0 4 1 2 3 0 1 4 2 3 0 2 4 3 1 0 2 1 3 0 2 3 1 2 0 1 0 2 1 0 1 1 0 0 -
108 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 メモリ効率が良い 大規模なデータセットに対しても効率的 実装がやや複雑 不安定ソート ヒープソート -
110 Copyright © 2015 every, Inc. All rights reserved. データ群の端から1つずつ順番に探索対象であるかチェックしていく探索方法
6 4 1 8 3 2 10 7 9 5 6 4 1 8 3 2 10 7 9 5 6 4 1 8 3 2 10 7 9 5 6 4 1 8 3 2 10 7 9 5 6 4 1 8 3 2 10 7 9 5 1回目 2回目 3回目 4回目 8 探索値 線形探索 -
111 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 実装が簡単 ソートされていないデータに対しても使用可能 大規模なデータセットに対しては効率が悪い 線形探索 -
112 Copyright © 2015 every, Inc. All rights reserved. 配列の中間にある値をチェックし、探索対象がそれよりも「大きい」「小さい」などで
切り分けていく探索方法 1 3 4 8 9 11 14 4 探索値 1 3 4 8 9 11 14 小さい 大きい 中間 1 3 4 8 9 11 14 小さい 対象外 中間 大きい 1 3 4 8 9 11 14 対象外 対象外 探索値 1回目 2回目 3回目 二分探索 -
113 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 大規模なデータセットに対して効率的 データを事前にソートする必要がある 二分探索 -
114 Copyright © 2015 every, Inc. All rights reserved. 任意のデータを一定範囲の数値(ハッシュ値)に写像する
ハッシュ関数を用いて、データの格納位置を参照する探索方法 ハッシュ値 5 位置 0 1 2 3 4 20 5 6 ・ ・ ・ ・ ・ データ値 65536 mod(6+5+5+3+6, 20)=5 配列 65536 ・ ・ ・ ・ ・ ハッシュ法による探索 ハッシュ関数 mod(a1+a2+a3+a4+a5, 20) 得られたハッシュ値を配列の添字に使い、データを高速に格納・探索できる。 -
115 Copyright © 2015 every, Inc. All rights reserved. ハッシュ値
5 位置 0 1 2 3 4 20 5 6 ・ ・ ・ ・ ・ データ値 65536 配列 ・ ・ ・ ・ ・ データ値 5 ハッシュ値 5 衝突 ハッシュ法による衝突 ハッシュ関数 mod(a1+a2+a3+a4+a5, 20) 「5」と「65536」のような異なるデータから ハッシュ関数によって同じハッシュ値「 5」が計算されてしまう 複数のデータが配列の同じ位置に 格納されようとして競合する -
116 Copyright © 2015 every, Inc. All rights reserved. ハッシュ値
5 位置 0 1 2 3 4 20 5 6 ・ ・ ・ ・ ・ データ値 65536 配列 5 ・ ・ ・ ・ ・ データ値 5 ハッシュ値 5 65536 ハッシュ法による探索:チェーン法 ハッシュ関数 mod(a1+a2+a3+a4+a5, 20) 1つの格納場所に複数の データを保持できる 後から来たデータ(65536)を上書きしたりせず、 同じハッシュ値を持つデータを 鎖(チェーン)のように 連結リストで繋げて格納する -
117 Copyright © 2015 every, Inc. All rights reserved. ハッシュ値
5 位置 0 1 2 3 4 20 5 6 ・ ・ ・ ・ ・ データ値 65536 配列 5 ・ ・ ・ ・ ・ 65536 データ値 5 ハッシュ値 5 再ハッシュ関数 (例:元の値に+1) ハッシュ値 6 ハッシュ法による探索:オープンアドレス法 ハッシュ関数 mod(a1+a2+a3+a4+a5, 20) 再ハッシュ関数を使って 次の空いているアドレスを探してデータを格納する -
118 Copyright © 2015 every, Inc. All rights reserved. 計算量
メリット デメリット 最良 平均 最悪 平均的に非常に高速な探索が可能 衝突が発生する可能性がある 適切なハッシュ関数を選ばないと性能が低下する ハッシュ法による探索 -
Copyright © 2015 every, Inc. All rights reserved. 120 コマンドのみを使用して、今日の講義の感想を記述してみましょう。
課題 • forkしたリポジトリ内で/kadai/01/Gitのディレクトリを作成 • /kadai/01/Git/report.mdに今日の講義の感想を記述 • ローカルで課題提出用に gitブランチを切ってcommit • fork したリポジトリ内でPRを作成 ◦ PRに何のコマンドを使用したか、の具体を記載してください。 • レビュワーに講師を指定 -
Copyright © 2015 every, Inc. All rights reserved. 121 参考文献
• Linux ◦ 詳解Linuxカーネル第3版 ◦ https://www.redhat.com/en/blog/suid-sgid-sticky-bit ◦ https://linuc.org/study/column/4850/ • Git ◦ https://git-scm.com/ -
Copyright © 2015 every, Inc. All rights reserved. 122 参考文献
• 木構造 ◦ https://www.tutorialspoint.com/data_structures_algorithms/b_plus_trees.htm ◦ https://www.tutorialspoint.com/data_structures_algorithms/b_trees.htm ◦ https://www.geeksforgeeks.org/dsa/introduction-to-log-structured-merge-lsm-tree/ ◦ https://www.geeksforgeeks.org/dsa/introduction-to-avl-tree/ ◦ https://www.pingcap.com/article/understanding-basics-b-tree-data-structures/ • 配列とリスト ◦ https://mitpress.mit.edu/9780262046305/introduction-to-algorithms/ • ハッシュ ◦ https://vivekbansal.substack.com/p/count-min-sketch ◦