[解決済み] JavaでBagを使用する理由
質問事項
現在、アルゴリズムとデータ構造について勉強しているのですが、「アルゴリズムの本4版」を読み返していたら
Bag
データ構造とともに
Stack
と
Queue
.
その説明を読んだ後でも、私はまだ何が良いのか不明です。
Bag
(これは
remove()
メソッド) のような他のデータ構造よりも優れています。
Stack
,
Queue
,
LinkedList
または
Set
?
私がBookから理解する限りでは、実装は
Bag
と同じです。
Stack
の名前を置き換えるだけです。
push()
を
add()
を削除し
pop()
メソッドを使用します。
という考え方があるんですね。
Bag
は、基本的にアイテムを収集する機能を持ち、収集したアイテムを繰り返し、バッグが空かどうかをチェックし、その中のアイテムの数を見つけます。
しかし、どのような状況であれば
Bag
は、上記のCollectionsのいずれかを超えるものですか?また、なぜ
Bag
は
remove()
メソッドは、基本的に、何か特別な理由があるのでしょうか?
よろしくお願いします。
どのように解決するのですか?
Stack
は、特定の削除順序 = LIFO (last-in-first-out)を持つ要素のコレクションのADTで、重複を許容します。
Queue
は、特定の削除順序 = FIFO (first-in-first-out) で、重複を許容する要素のコレクションの ADT です。
LinkedList
はリストの実装です。
Set
は、重複を許さない要素の集まりのADTです。
Bag
は、重複を許容する要素の集合のADTである。
一般に、ある要素を保持するものは
Collection
.
重複を許容するコレクションは
Bag
そうでない場合は
Set
.
インデックス経由で要素にアクセスするバッグは
List
.
最後の要素の後に新しい要素を追加し、先頭(最初のインデックス)から要素を削除するメソッドを持つバッグは、次のようになります。
Queue
.
最後の要素の後に新しい要素を追加し、末尾(最後のインデックス)から要素を削除するメソッドを持つバッグは、次のとおりです。
Stack
.
例 Javaでは
LinkedList
は、コレクション、バッグ、リスト、キューであり、スタック操作をサポートしているので、スタックのように扱うことができます (
add
~
addLast
~
push
,
peekLast
,
removeLast
~
pop
)なので、スタックも呼び出せます。その理由は
スタック
インターフェースは
peek
メソッドが予約されています。
キュー
の実装は、リストの先頭(最初の要素)を取得するものです。したがって
リンクリスト
スタックメソッドは
デク
.
の有無
Bag
を含む
remove(Object)
を実装するかどうかは、実装に依存します。
Bag
型はこの操作をサポートします。また
get(int)
操作で、指定したインデックスのオブジェクトにアクセスすることができます。の時間的な複雑さは
get(int)
を実装することができます。
Bag
リンクリストを使った場合は平均O(n/2)、サイズ変更可能な配列(array-list)を使った場合はインデックスで要素に直接アクセスできるのでO(1)となります。
しかし、その主な考え方は
Bag
は、このコレクションで複製と反復を可能にすることです。他の有用な操作をサポートするかどうかは、実装者の設計判断によります。
コレクションタイプのうちどれを使うかはニーズ次第で、重複を望まない場合は
Set
ではなく
Bag
. さらに、削除順序を気にするのであれば
Stack
または
Queue
であり、基本的には
Bags
を、特定の削除順序で削除します。以下のように考えることができます。
Bag
のスーパータイプです。
Stack
と
Queue
であり、特定の操作によってAPIを拡張するものである。
ほとんどの場合、オブジェクトを集めて何らかの処理をするだけです(反復処理+要素処理)。そこで、最もシンプルな
Bag
を実装したもので、一方向のリンクリストである。
関連
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】スレッド "main "での例外 java.util.NoSuchElementException
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver [重複]。
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません