背景std :: dequeサブアレイのサイズが固定されているのはなぜですか?
std::deque
は、その要素を格納するためにサブアレイを使用します。そのサブアレイを追跡するための追加のブック管理データ構造を持っています。このように、std::vector
と比較して、std::deque
は、償却されたO(1)と比較して、より早く(O(1))、O(n)と比較してOこれは、std::deque
がどちらかの端にサブアレイを追加するだけで、ブックのデータ構造を変更する必要があるためです。
質問
hereを説明するようにサブアレイが自分のサイズが固定されている理由を私は理解していないことである。
典型的な実装は、個別に割り当てられた固定サイズのシーケンスを使用アレイ
固定サイズのサブアレイを持たないという利点があります。たとえば、サブアレイのサイズは固定されているため、中間の挿入はO(n)の複雑さでなければなりません。ここで、nは最も近い端までの要素の数です。しかし、サブアレイが自由に成長する場合、中央の挿入はO(k)になります。ここで、kはサブアレイ内の要素の数であり、特にstd::deque
に多くのサブアレイがある場合はずっと高速です。途中から削除する場合も同じです。
std::deque
はサブアレイのバランスを保ちたいと考えていますか?これは、サブアレイが大きすぎる/小さすぎると分割またはマージすることを可能にすることで簡単に緩和できます。複雑さはちょうどO(k)になります。ここでkは最大サブアレイのサイズです。 (または、最小のサブアレイとそれより小さな隣のサブアレイの合計サイズ)
固定サイズのサブアレイはランダムな反復を高速化するためですか?たとえば、n番目の要素が必要な場合は、ブックを保持しているデータ構造を調べて、複雑さO(k)を作るすべての前の部分配列のサイズを追加する必要があります。ここで、kはブック構造のサイズです。 しかし、これは大きな問題ではありません。std::deque
は、二重にリンクされたリストであるとアドバタイズされています。
EDIT:std::deque
は、リンクリストの実装と配列の実装間のちょうど真ん中の男です。私は私の質問は、その本来の意味を失っているし、それはより多くのサブアレイが自分のサイズが固定されている理由
私は '2 * 23'が何であるかを尋ねるとどれくらい難しいと思いますか、私はあなたに' 13 + 10 + 19 + 4 'が何であるかを尋ねるとどれほど難しいかを比較します。 – smac89
また、固定サイズのバケットでは挿入がO(n)であることに同意しません。それはドキュメンテーションが言っていることでも、それは必ずしも真実ではありません。固定サイズのバケットを使用すると、バケットをランダムに作成した場合よりも、「中央」に挿入するのが簡単になります(実際にはその意味を定義する必要があります) – smac89
中段は両端を意味しません。そして、いいえ、すべての値を挿入ポイントからすべてのサブアレイの両端キューの終わりに移動する必要があるので、中央に挿入するとO(n)になります。 – PhotometricStereo