「みんなのデータ構造」(Amazonリンク)とは、コンピュータ・サイエンスの基礎となるデータ構造の教科書「Open Data Structure」の日本語訳です。Introduction to Algorithmsといったアルゴリズムの名著への橋渡しになるような、実用的なテーマが丁寧に説明されています。
「みんなのデータ構造」(Amazonリンク)とは、コンピュータ・サイエンスの基礎となるデータ構造の教科書「Open Data Structure」の日本語訳です。Introduction to Algorithmsといったアルゴリズムの名著への橋渡しになるような、実用的なテーマが丁寧に説明されています。
「みんなのデータ構造」(Amazonリンク)とは、コンピュータ・サイエンスの基礎となるデータ構造の教科書「Open Data Structure」の日本語訳です。Introduction to Algorithmsといったアルゴリズムの名著への橋渡しになるような、実用的なテーマが丁寧に説明されています。
void resize() { array<T> b(max(2 * n, 1)); for (int k = 0; k < n; k++) b[k] = a[(j+k) % a.length]; a = b; j = 0;}
ArrayDeque: 配列を使った高速な双方向キュー
Dequeは両端に対して追加と削除が効率的に実行できるデータ構造である。
ArrayDequeはListインターフェースを実装する。
get(i)およびset(i, x)の実行時間はO(1)である
add(i, x)およびremove(i)の実行時間はO(1 + min{i, n-i})である
array<T> a;int j;int n;
get(i)/set(i, x) - O(1)
get(i)、set(i, x)はシンプル。
T get(int i) { return a[(j+i) % a.length];}
T set(int i, T x) { int k = (j+i) % a.length; T y = a[k]; a[k] = x; return y;}
add(i, x)/ remove(i) - O(1 + min{i, n - i})
add、removeは、i個の要素を左に、またはn-i個の要素を右にずらす。
resize()を無視すれば、計算量はO(1 + min{i, n - i})である。
void add(int i, T x) { if (n+1 >= a.length) resize(); // a[0],...,a[i-1] を左に1つずつずらす if (i < n/2) { // jが0なら、indexが-1になってしまうため j = (j == 0) ? a.length - 1 : j - 1; for (int k = 0; k <= i-1; k++) a[(j+k) % a.length] = a[(j+k+1) % a.length]; } else { // a[i],...a[n-1] を右に1つずつずらす for (int k = n; k > i; k--) a[(j+k) % a.length] = a[(j+k-1) % a.length]; } a[(j+i) % a.length] = x; n++;}
removeもaddと同様に実装できる。
T remove(int i) { T x = a[(j+i) % a.length]; if (i < n/2) { for (int k = i; k > 0; k--) a[(j+k) % a.length] = a[(j+k-1) % a.length]; } else { for (int k = i; k < n-1; k++) a[(j+k) % a.length] = a[(j+k+1) % a.length]; } n--; if (3*n > a.length) resize(); return x;}
「みんなのデータ構造」(Amazonリンク)とは、コンピュータ・サイエンスの基礎となるデータ構造の教科書「Open Data Structure」の日本語訳です。Introduction to Algorithmsといったアルゴリズムの名著への橋渡しになるような、実用的なテーマが丁寧に説明されています。
「みんなのデータ構造」(Amazonリンク)とは、コンピュータ・サイエンスの基礎となるデータ構造の教科書「Open Data Structure」の日本語訳です。Introduction to Algorithmsといったアルゴリズムの名著への橋渡しになるような、実用的なテーマが丁寧に説明されています。
T remove(T x) { int j = hash(x); for (int i = 0; i < t[j].size(); i++) { T y = t[j].get(i); if (x == y) { t[j].remove(i); n--; return y; } } return null;}
find - O(nhash(x))
t[hash(x)]を線形に探索する。
T find(T x) { int j = hash(x); for (int i = 0; i < t[j].size(); i++) { if (x == t[j].get(i)) { return t[j].get(i); } } return null;}