Skip to content

Commit

Permalink
feat: 創造情報に関する過去問の打ち込み
Browse files Browse the repository at this point in the history
  • Loading branch information
xhiroga committed Aug 19, 2024
1 parent 5abfc57 commit 34159a9
Show file tree
Hide file tree
Showing 14 changed files with 438 additions and 27 deletions.
2 changes: 1 addition & 1 deletion computer-science/computer-architecture/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

### 基数変換 (radix conversion)

n進数→10進数は次のように考える。4,000(よんせん)は40 00(よんじゅう ひゃく)と考えることができる。同様に、0.05 = 5厘(ごりん)は0.5分(れいてんごぶ)とも考えられる。このように、指数の絶対値が大きい桁の数字による数は、指数の絶対値が小さい桁の数字でも表せる。n進数→10進数の変換では、$n^{|m|}$の倍数を$n^{|m-1|}$の倍数で表す操作を繰り返す。
n進数→10進数は次のように考える。4,000(よんせん)は40 00(よんじゅう ひゃく)と考えることができる。同様に、0.05 = 5厘(ごりん)は0.5分(れいてんごぶ)とも考えられる。このように、指数の絶対値が大きい桁の数字による数は、指数の絶対値が小さい桁の数字でも表せる。n進数→10進数の変換では、$n^{|m|}$の倍数を$n^{|m|-1}$の倍数で表す操作を繰り返す。

また、10進数→n進数は次のように考える。指数の絶対値が小さい桁の数は、指数の絶対値が大きい桁の数としては表すことができない。(ここで4は0.4 10と言い出すとややこしいので一旦考えない)そのため、nで割って/掛けて、余り/整数部を指数の絶対値が小さい桁の数にする。

Expand Down
9 changes: 5 additions & 4 deletions computer-science/data-structures-algorithms/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
それぞれのPythonにおける実装とデータ追加・削除の操作をまとめた。(`pop()`するのはスタック?キュー?といつも迷うので)

| データ構造\実装 | list | collections.deque | queue.Queue |
| --------------- | ---------------------------------------- | ------------------------------------------- |
| --------------- | ---------------------------------------- | ------------------------------------------- | ---------------------------- |
| スタック | 追加: append(), 取り出し: pop() | 追加: append(), 取り出し: pop() | - |
| キュー | 追加: append(), 取り出し: pop(0) | 追加: append(), 取り出し: popleft() | 追加: put(), 取り出し: get() |
| 両端キュー | 追加: append(), 取り出し: pop() / pop(0) | 追加: append(), 取り出し: pop() / popleft() | - |
Expand All @@ -75,7 +75,7 @@

集合を木構造で表したとき、同じ集合に属しているか?を調べるのは根を求めることに等しく、計算量が$O(N)$となりえる。

しかし、union by rank を行うことで$O(log N) に、さらに経路圧縮を行うことで$O(α(N))$となる。$α(N)$はアッカーマンの逆関数と呼ばれ、増加がとても遅いことで知られる。[^union_find]
しかし、union by rank を行うことで$O(log N)$ に、さらに経路圧縮を行うことで$O(α(N))$となる。$α(N)$はアッカーマンの逆関数と呼ばれ、増加がとても遅いことで知られる。[^union_find]

- union by rank: 2つの木を合体させるとき、背の高い木に背の低い木をつなげる
- 経路圧縮: find処理時、中間節点を全て根に繋ぎなおす
Expand All @@ -101,8 +101,9 @@
[ハッシュ探索②(オープンアドレス法) | Programming Place Plus アルゴリズムとデータ構造編【探索アルゴリズム】 第7章](https://programming-place.net/ppp/contents/algorithm/search/007.html#linear_probing)

> [!NOTE] オープンアドレス法って、ハッシュ値を削除したら、同じハッシュ値で再ハッシュされた値を探せなくならない?
> なる。したがって、ハッシュ値の削除時には空の番地であることを示す値をいれる。この値をTombstone (墓石)という。[kumagi^2023]
[kumagi^2023]: [あなたの知らないハッシュテーブルの世界](https://www.docswell.com/s/kumagi/ZGXXRJ-hash-table-world-which-you-dont-know#p20)
> なる。したがって、ハッシュ値の削除時には空の番地であることを示す値をいれる。この値をTombstone (墓石)という。[^kumagi_2023]
[^kumagi_2023]: [あなたの知らないハッシュテーブルの世界](https://www.docswell.com/s/kumagi/ZGXXRJ-hash-table-world-which-you-dont-know#p20)

## 基礎的なアルゴリズム (algorithms)

Expand Down
18 changes: 12 additions & 6 deletions computer-science/network/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@

[^node]: なお、リンク層ではノードをステーションと呼ぶことが多い。

CSMA方式に対して、積極的にデータの衝突を検知するよう改良されたCSMA/CD(CSMA with Collision Detection)方式がある。CSMA/CD方式は主に有線LANでの通信で用いられる。早いもの勝ちで通信を開始した後も、他のノードが通信していないかの監視を続け、競合を見つけたら直ちに通信を中止する。その後、ランダムな時間待ってから再送を行う。
CSMA方式に対して、積極的にデータの衝突を検知するよう改良されたCSMA/CD(CSMA with Collision Detection)方式がある。CSMA/CD方式は主に有線LANでの通信で用いられる。

CSMA方式では、他のノードが送信中のときは送信を待つ。したがって、他のノードの送信が終了した直後に衝突が発生しやすい。CSMA/CD方式は、フレーム送信中の衝突を検知する仕組みを備えているが、特にフレームの先頭で衝突が発生した場合を検知したい。フレームの先頭が衝突したことを検知するのにかかる最悪時間は往復の伝送速度だから、フレームサイズを往復の伝送にかかるサイズよりも大きくすることで、自然とフレーム先頭の衝突に備えることができる。[^xtech_2006]また、通信を開始した後も、他のノードが通信していないかの監視を続け、競合を見つけたら直ちに通信を中止する。その後、ランダムな時間待ってから再送を行う。
[^xtech_2006]: [イーサネットの基本原理(2),フレーム間ギャップと最短フレーム長の存在意義](https://xtech.nikkei.com/it/article/COLUMN/20060523/238716/)

無線LANのアクセス制御方式としてはCSMA/CA (CSMA with Collision Avoidance)がある。無線通信では、送信中は自身の信号が強いため、他の弱い信号を検出できない。したがって、CSMA/CD形式のように、送信中に衝突を検知することが難しい。そのため、CSMA/CA形式では、衝突が起きやすい条件で衝突を予防する。具体的には、送信を開始する前に通信路が使用中かを検知して、実際に使用中だった場合、他にも待っているノードがいる可能性があるため、ランダムな時間待ってから送信を開始する。

Expand Down Expand Up @@ -132,8 +135,6 @@ IPv4を延命するための技術としての説明をよく見かけるが、

##### NAT Traversal



##### UDP hole punching

### IPv6
Expand Down Expand Up @@ -269,6 +270,8 @@ default 192.168.1.1 LAN2(DHCP) static
| IGPs | マルチキャスト | リンク状態型 | MOSPF |
| EGPs | ユニキャスト | パスベクトル型 | BGP |

距離ベクトルはディスタンスベクター、リンク状態はリンクステートともいい、表記揺れがある。

> [!NOTE] IGPsとEGPsを分けたとしても、IPヘッダを見てパケットを転送する以上は、EGPsスピーカーではないルーターも巨大な経路制御表を持つことにならない?
> たしかにEGPsでやり取りされる経路制御表は巨大である。ISPの数で考えてもほとんどAS番号と同じだけ(約10万)存在する上、ISPの保有するIPアドレスのネットワーク部が飛び地のために経路集約できないことも普通だから、フルBGPテーブルのエントリは100万以上になる。しかし、ISPでEGPsスピーカー(以降エッジルーター)同士をつなぐルーターが必ずしもハブのような役割を果たすわけではないらしい。むしろエッジルーターが転送先のルーターを慎重に選ぶことで、転送先のルーターがパケットをデフォルトゲートウェイとなる別のエッジルーターに転送するだけで済むようになっているようだ。[^nikkei_2007]
[^nikkei_2007]: [IPパケットはプロバイダ内をどのように転送されるのか](https://xtech.nikkei.com/it/article/COLUMN/20071009/284027/)
Expand All @@ -277,19 +280,22 @@ default 192.168.1.1 LAN2(DHCP) static

ホストは自分が知っている経路制御表を30秒ごとにブロードキャストする。経路制御表を受け取ったホストは、受け取った経路情報で自分が持っていた経路情報を更新し、それをブロードキャストする。このアルゴリズムはベルマン・フォード法に則っている。

距離ベクトル型プロトコルでは、誤った経路情報を設定してしまった場合、メトリックが無限に増大する恐れがある。例えば、ルーターAが実際には接続していないネットワークXへのホップ数を1としてルーターBに通知した場合、ルーターBはルーターXへのホップ数を2としてAに再び通知する。ルーターAは実際にはネットワークXに接続していないので、ホップ数を3にして再び通知してしまい、無限ループが発生する。これを無限カウント問題という。無限カウント問題を避けるため、RIPでは最大ホップ数を15に設定している。

### OSPF

各ルーターはAS内のネットワーク構造をグラフとして持つ。グラフを更新次第、ルーターは各宛先への最短距離をダイクストラ法で計算し、ネクストホップをルーティングテーブルに登録する。
各ルーターはAS内のネットワーク構造をグラフとして持つ。各ルーターはグラフの情報を受け取ったら、中身を読む前に隣接する全てのルーターに情報をコピーして配信する。これをフラッディング(flooding)という。[^takagi_2010]グラフを更新次第、ルーターは各宛先への最短距離をダイクストラ法で計算し、ネクストホップをルーティングテーブルに登録する。経路情報の操作が難しいため、エリア間での利用には適さない(逆にIGPsとして運用する分には問題ない)。
[^takagi_2010]: [ディスタンスベクターとリンクステート](https://gihyo.jp/admin/serial/01/net_prac_tech/0011)

最短経路について、RIPではルーターのホップ数で計算していたが、OSPFではサブネット毎に自由にコストを付与できる。例えば、LANケーブルが古いなどで遅いネットワークではコストを重くする運用が考えられる。

### IS-IS (intermediate system-intermediate system)

ISOで標準化されている、OSPFの基になった経路制御プロトコル。

### BPG
### BGP

AS間の通信経路を定めるために用いるプロトコル。パスベクトル型といい、向きと距離だけでなく、途中で経過するAS番号も全て持っている。それにより、無限カウントを避けたり、ポリシーによってパケット毎に経路を選んだりしやすくなる
AS間の通信経路を定めるために用いるプロトコル。パスベクトル型といい、向きと距離だけでなく、途中で経過するAS番号も全て持っている。これにより、ルーティングループによる無限カウント問題を回避できる。無限カウント問題とは、ルーティング情報が永遠にループし続け、メトリック値が際限なく増加する現象だ。BGPでは、自身のAS番号がすでにパス内に存在する経路を受け取った場合、その経路を破棄することでループを防ぐ。また、AS番号の列を参照することで、管理者はより柔軟なポリシーを設定でき、セキュリティや経済的な要因に基づいてパケット毎に最適な経路を選択しやすくなる

> [!NOTE] 全ASとの通信経路を持っているとしたら、エントリ数が膨大にならない?
> なる。AS番号は約10万だが、エントリ数は100万行以上に達する。したがって、経路表は差分更新を行っている。
Expand Down
Loading

0 comments on commit 34159a9

Please sign in to comment.