Dequeと配列の違いはなんですか?
基本配列があればDequeと同じことができると思うのですが、メモリ効率がいいなどのDequeをつかうメリットをおしえてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
Listも、やろうと思えば配列を使ってやりくりすることは可能です。実際ArrayListの内部では配列を使ってListの機能を実装しています。でもそれをいちいちやるのは面倒で危険なのです。
要素を追加しようとするたび、追加する場所を探したり、足りなかったら大きい配列を作り直して移し替えて…しかもその操作が元の場所ではなく別のメソッドなんかに移っていたら、新しい配列を置くべき場所に戻すのも面倒になります。加えて、いちいちそのように作っていたら、意図しないバグが入り込む可能性があり、それが原因でエラーが発生したら大変なことになります。いったいどこが原因なのか、配列を使って原始的に実装したListのようなもののせいでコードが膨大になった中から探し出さなければいけないのですから。
投稿2019/03/25 16:24
総合スコア20649
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
maisumakunさんの回答だと
じゃあ先頭要素がどこかを示す変数をどこかに持っておけばいいじゃないかとなるので補足です
そういう操作がまとまっていて、しかもそういう操作しかできないことに価値があります。
何でもできるって一見素晴らしいですが、コードを読むときにありとあらゆる用途を想定しながら読まないといけないので大変です。キューで充分なところをわざわざ配列で書いてあると、
先頭要素以外を取り出したりするんじゃないかとか
途中の要素を書き換えたりするんじゃないかとか
コード読むときに余計な心配を生みます。
投稿2019/03/25 08:13
総合スコア13512
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
先端側での追加・削除を行う場合の操作速度が違ってきます。
配列で先頭のものを動かそうとすれば、続く全要素を入れ替えないといけなくなってしまいますが、Deque
の場合はそれが不要なように設計されています。
投稿2019/03/25 08:04
総合スコア145121
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Javaの方の話としてはDequeはインタフェースであって、実装として配列を使うか、連結リストを使うかを選べます。あるいは並列実行のための実装を選べたりします。
使いたい用途に合わせて配列を使うか連結リストを使うかを選べる、あるいは必要があった時に実装を簡単にすげ替えらられる、そういった目的でインタフェースとして定義されています。
Dequeと配列を比較するような質問は無意味です。(インタフェースと実装を比べてメリットがどうこう言っても意味がないでしょう)
Pythonの方の話としては、公式ドキュメントの引用で答えとして足りるでしょう。
list オブジェクトでも同様の操作を実現できますが、これは高速な固定長の操作に特化されており、内部のデータ表現形式のサイズと位置を両方変えるような pop(0) や insert(0, v) などの操作ではメモリ移動のために O(n) のコストを必要とします。
リストのpop(0) insert(0, v) は O(n)のコストのメモリ操作が必要です。
投稿2019/03/26 02:40
総合スコア11029
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。