mirror of
https://github.com/krahets/hello-algo.git
synced 2026-11-05 04:32:19 +08:00
Retranslate the complete Japanese online edition from Chinese (#2008)
* Retranslate the complete Japanese online edition from Chinese * Fit Japanese homepage labels and localize heading permalinks * Point Japanese contribution instructions to the Japanese preview * Replace locale conditionals with multilingual UI tables
This commit is contained in:
@@ -2,30 +2,30 @@
|
||||
|
||||
### 要点の振り返り
|
||||
|
||||
- スタックは後入れ先出しの原則に従うデータ構造であり、配列または連結リストで実装できます。
|
||||
- 時間効率の面では、スタックの配列実装は平均効率が高い一方、拡張時には 1 回のプッシュ操作の時間計算量が $O(n)$ まで悪化します。これに対して、スタックの連結リスト実装はより安定した効率を示します。
|
||||
- 空間効率の面では、スタックの配列実装はある程度の領域の無駄を生む可能性があります。ただし、連結リストのノードが占有するメモリは配列要素よりも大きい点に注意が必要です。
|
||||
- キューは先入れ先出しの原則に従うデータ構造であり、同様に配列または連結リストで実装できます。時間効率と空間効率の比較における結論は、前述のスタックの場合と似ています。
|
||||
- 両端キューはより高い自由度を持つキューであり、両端で要素の追加と削除を行えます。
|
||||
- スタックは先入れ後出しの原則に従うデータ構造であり、配列や連結リストで実装できます。
|
||||
- 時間効率では、配列によるスタックの実装は平均的な効率が高いものの、容量拡張時には一回のプッシュの時間計算量が $O(n)$ に悪化します。これに対し、連結リストによる実装は、より安定した効率を示します。
|
||||
- 空間効率では、配列によるスタックの実装はある程度の領域の無駄を生じる可能性があります。ただし、連結リストのノードが占めるメモリは配列の要素より大きい点に注意が必要です。
|
||||
- キューは先入れ先出しの原則に従うデータ構造であり、同じく配列や連結リストで実装できます。時間効率と空間効率の比較については、前述のスタックと同様の結論になります。
|
||||
- 両端キューは自由度の高いキューであり、両端で要素を追加したり削除したりできます。
|
||||
|
||||
### Q & A
|
||||
|
||||
**Q**:ブラウザの進む・戻るは双方向連結リストで実装されているのですか?
|
||||
**Q**:ブラウザの進む・戻る機能は双方向連結リストで実装されていますか?
|
||||
|
||||
ブラウザの進む・戻る機能の本質は「スタック」の表れです。ユーザーが新しいページにアクセスすると、そのページはスタックの先頭に追加されます。ユーザーが戻るボタンをクリックすると、そのページはスタックの先頭から取り出されます。両端キューを使うといくつかの追加操作を簡単に実装でき、この点は「両端キュー」の章で触れています。
|
||||
ブラウザの進む・戻る機能は、本質的に「スタック」の仕組みを表しています。新しいページを開くと、そのページがスタックの先頭に追加され、戻るボタンを押すと、先頭から取り出されます。両端キューを使うと、一部の追加操作も容易に実装できます。これについては「両端キュー」の節で触れています。
|
||||
|
||||
**Q**:ポップした後、そのノードのメモリを解放する必要はありますか?
|
||||
**Q**:ポップした後は、取り出したノードのメモリを解放する必要がありますか?
|
||||
|
||||
後で取り出したノードを引き続き使うのであれば、メモリを解放する必要はありません。以降そのノードを使わない場合でも、`Java` や `Python` などの言語には自動ガベージコレクション機構があるため、手動でメモリを解放する必要はありません。一方、`C` と `C++` では手動でメモリを解放する必要があります。
|
||||
その後も取り出したノードを使うなら、メモリを解放する必要はありません。使わなくなった場合、`Java` や `Python` などには自動ガベージコレクションがあるため、手動での解放は不要です。`C` と `C++` では手動でメモリを解放する必要があります。
|
||||
|
||||
**Q**:両端キューは 2 つのスタックをつなげたように見えますが、用途は何ですか?
|
||||
**Q**:両端キューは二つのスタックをつなげたように見えますが、どのような用途がありますか?
|
||||
|
||||
両端キューは、スタックとキューの組み合わせ、あるいは 2 つのスタックをつなげたもののような構造です。表しているのはスタック + キューのロジックなので、スタックとキューのすべての応用を実現でき、しかもより柔軟です。
|
||||
両端キューはスタックとキューの組み合わせ、あるいは二つのスタックをつなげたものに似ています。スタックとキューの両方の論理を持つため、それらのすべての用途を実現でき、さらに柔軟性も高いです。
|
||||
|
||||
**Q**:取り消し(undo)とやり直し(redo)は具体的にどのように実装されますか?
|
||||
**Q**:元に戻す(undo)とやり直す(redo)は、具体的にどう実装しますか?
|
||||
|
||||
2 つのスタックを使い、スタック `A` を取り消し用、スタック `B` をやり直し用に使います。
|
||||
二つのスタックを使い、スタック `A` を元に戻す操作に、スタック `B` をやり直す操作に用います。
|
||||
|
||||
1. ユーザーが操作を 1 つ実行するたびに、その操作をスタック `A` にプッシュし、スタック `B` を空にします。
|
||||
2. ユーザーが「取り消し」を実行したときは、スタック `A` から直近の操作をポップし、それをスタック `B` にプッシュします。
|
||||
3. ユーザーが「やり直し」を実行したときは、スタック `B` から直近の操作をポップし、それをスタック `A` にプッシュします。
|
||||
1. ユーザーが操作するたびに、その操作をスタック `A` にプッシュし、スタック `B` を空にします。
|
||||
2. ユーザーが「元に戻す」を実行したら、スタック `A` から直近の操作をポップし、スタック `B` にプッシュします。
|
||||
3. ユーザーが「やり直す」を実行したら、スタック `B` から直近の操作をポップし、スタック `A` にプッシュします。
|
||||
|
||||
Reference in New Issue
Block a user