「圧縮配列」/「圧縮ベクトル」クラス (詳細は後述) を作成したいと考えています。これにより、多かれ少なかれ一定時間でランダム データ アクセスが可能になります。
「ほぼ一定の時間」とは、要素のアクセス時間は一定ではありませんが、配列の特定のポイントに近づいても増加し続けるべきではないことを意味します。つまり、コンテナーは、1 つの要素を取得するために、大幅に多くの計算を行うべきではありません (「最後の要素を取得するためにもう一度すべてを解凍する」、「最初の要素を取得するためにほとんど何もしない」など)。おそらく、配列を圧縮データのチャンクに分割することで実現できます。つまり、1 つの要素にアクセスするには、「averageTime」+- 偏差が必要です。最良のアクセス時間と最悪のアクセス時間を平均アクセス時間に比較的近づけたいと言えます。
私のオプションは何ですか (適切なアルゴリズム/既に利用可能なコンテナー - 存在する場合)?
コンテナの詳細:
- コンテナーは、同一の要素 (std::vector など) の線形配列として機能します。
- コンテナーが初期化されると、データは一定になり、変更されることはありません。コンテナは読み取り専用アクセスを提供する必要があります。
- コンテナーは array/std::vector のように動作する必要があります。つまり、値は operator[] を介してアクセスされ、.size() などがあります。
- テンプレートクラスとして作れたらいいのに。
- データへのアクセスは、多かれ少なかれ一定時間である必要があります。すべての要素に同じアクセス時間は必要ありませんが、最後の要素を取得するためにすべてを解凍する必要はありません。
使用例:
データの二分探索。
データの詳細:
1. データは、大部分が float といくつかの int で構成される構造体です。int よりも float の方が多い。文字列はありません。
2. 配列に同一の要素が多数存在する可能性は低いため、単純にデータのインデックスを作成することはできません。
3. 1 つの要素のサイズが 100 バイト未満です。
4. コンテナーあたりの合計データ サイズは、数キロバイトから数メガバイトです。
5. データはまばらではありません。要素の連続ブロックであり、すべてが割り当てられており、「空のスロット」はありません。
圧縮の目的は、圧縮されていない配列としての表現と比較して、ブロックが使用する RAM の量を減らすことですが、ある程度妥当な読み取りアクセス パフォーマンスを維持し、要素を配列としてランダムにアクセスできるようにすることです。つまり、データは圧縮された形式で内部的に保存され、std::vector または同様のコンテナーであるかのように (読み取り専用で) アクセスできる必要があります。
アイデア/意見?