English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ゲスト
1 / ?

すべての複雑性クラスは曲線を描く

コストを入力サイズに対してプロット

x軸に入力サイズNを、y軸にコスト(操作回数、時間)を置く。各複雑性クラスは異なる曲線を生成する。アルゴリズムの成長率はパフォーマンス曲線の形から認識できる。


Complexity Growth Shapes


O(1) — 平坦な水平線。 関数f(N) = 1。勾配なし。コストはNに関わらず変わることはない。ハッシュテーブル検索:テーブルが10個か10,000,000個の要素を保持しているかに関わらず、1つのハッシュ計算が正しいバケットにジャンプする。


O(log N) — ゆるい上向き曲線、勾配が減少。 N = 1,000,000のとき:コスト ≈ 20操作。曲線は小さなNで急上昇し、その後平坦になる。Nが2倍になるたびに、コストは正確に1単位増加する。


O(N) — 対角斜線。 勾配 = 1(漸近的な意味で)。コストはNと同じ速度で増加する。NがN 3倍増加すれば、コストは3倍になる。


O(N log N) — より急な対角線、わずかな上向き曲率。 O(N)より上、O(N²)より下に位置する。対数因子は線形勾配に緩やかに増加する乗数を加える。


O(N²) — 上向きに開く放物線。 勾配はNが増加するにつれて増加する。N = 10のとき:コスト = 100。N = 100のとき:コスト = 10,000。N = 1,000のとき:コスト = 1,000,000。


増加するギャップ

比率O(N²) / O(N) = N。放物線と対角線の間のギャップはNが増加するにつれて広がる。N = 10のとき:10倍のギャップ。N = 100のとき:100倍のギャップ。N = 1,000のとき:1,000倍のギャップ。N = 50,000のとき:50,000倍のギャップ。ギャップは常にNに等しい。

スケールギャップの計算

大規模な依存性グラフには50,000個のパッケージが含まれている(N = 50,000)。1つのアルゴリズムはO(N)時間で実行される。2番目のアルゴリズムはO(N²)で実行される。このNでは、比率O(N²)/O(N) = N = 50,000。

O(N)アルゴリズムがN = 50,000で10秒かかる場合、O(N²)アルゴリズムはどのくらいの時間がかかるか。答えを時間で表す。計算を示す。

線分の二等分

繰り返される二等分としての二分探索

N個の要素の整列配列は長さNの線分を形成する。二分探索はこの線分を繰り返し二等分する:


1. 残りの線分の中点を指す。

2. ターゲット < 中点:右半分が消える。左半分で再帰。

3. ターゲット > 中点:左半分が消える。右半分で再帰。

4. ターゲット = 中点:完了。


Binary Search Halving


k回の二等分後、残りの線分の長さはN / 2^k。探索は長さが1になるまで続く:


N / 2^k = 1 → 2^k = N → k = log₂N


したがって、N個の要素に対する二分探索は最大log₂N回の比較が必要。


半分割と倍増:同じ曲線の両側

半分割と倍増は幾何学的な逆数である。指数曲線2^kと対数曲線log₂Nは、直線y = xの両側で反射している。


紙を折ることを考える:用紙は0.1 mmの厚さから始まる。折るたびに厚さが2倍になる。42回の折り目の後:0.1 mm × 2^42 ≈ 439,804 km — 月を過ぎている(384,400 km)。二分探索は逆を実行:N個の要素から開始し、各ステップで数を半分にし、log₂Nステップで1要素に到達する。


幾何学的:二等分は自己相似操作である。各二等分は全体と同じ構造を見た2つの半分を生成する。再帰と対数はこの自己相似性を共有する。

比較と倍増

整列配列は1,048,576個の要素を含んでいる。注意:1,048,576 = 2^20。

二分探索は最大何回の比較でターゲットを見つけるか。対数計算を示す。その後、配列が2,097,152個の要素(2^21)に2倍になった場合、幾何学的に何が変わるかを説明する。

幾何学的マップとしてのハッシュ関数

関数としてのハッシュ関数

ハッシュテーブルはハッシュ関数を使用してキーをバケットにマッピング:


bucket = hash(key) mod table_size


これは厳密な数学的意味での関数:定義域(可能なすべてのキー)を値域(バケットインデックス0からtable_size−1)にマッピング。幾何学的イメージ:キーは1つの空間に存在;バケットは別の空間に存在。ハッシュ関数はキーをバケットインデックスに投影する。


Hash Table Geometry


O(1)検索—直接ジャンプ、検索なし。 ハッシュ関数は一定時間でバケットインデックスを計算する。そのバケットに直接ジャンプ。トラバーサルなし、比較ループなし。


負荷係数。 負荷係数0.75では、75%のバケットが少なくとも1つの要素を含む。約0.9を超えると、衝突が増加:2つのキーが同じバケットにハッシュされ、そのバケット内に要素のチェーンを形成。長いチェーンでの検索は最悪の場合O(N)に低下。


分布品質としての幾何学

よく分散されたハッシュ関数はキーをすべてのバケットに均一に分散。幾何学的:関数の値域がその余域を均等にカバー。各バケットはおよそN / table_sizeのキーを受け取る。


悪いハッシュ関数はキーをいくつかのバケットにクラスター。幾何学的:関数の値域は余域のサブセットに折りたたまれる — ほとんどのキーは同じ数個の点にマップ。残りのバケットは空のまま。


MOAD-0001との接続

リストをセットで置き換えるとMOAD-0001を修正する。なぜなら、セットは内部的にハッシュテーブルを使用するため。O(N)リストスキャン→O(1)ハッシュテーブル検索。幾何学的:シーケンスに沿った線形トラバーサルが関数を介した直接投影に変換。シーケンスは消える;関数がそれを置き換える。

不均一に分散されたハッシュの分析

ハッシュテーブルには1,000個のバケットと900個の要素がある(負荷係数0.9)。悪いハッシュ関数は、これらの要素の500個を同じバケットに送信。

パフォーマンスへの影響を分析:(a)混雑したバケット内の要素の平均検索時間は何か。(b)すべての900個の要素全体の平均検索時間は何か。(c)これは、良好なハッシュ関数の選択がハッシュテーブルの選択と同じくらい重要な理由をどのように説明するか。