先日、食料品を買いに出かけていたので、財布の中を検索して、クレジット カード、顧客特典 (ロイヤルティ) カード、写真付き ID を見つける必要がありました。私の財布には他にも数十枚のカード (仕事用 ID、他のクレジット カードなど) が入っているので、すべてを見つけるのに時間がかかりました。
私の財布には、カードを入れることができる 6 つのスロットがあり、各スロットの最初のカードだけが一度に最初に表示されます。特定のカードを見つけたい場合は、それがどのスロットに入っているかを覚えてから、そのスロットにあるすべてのカードを 1 つずつ見て見つけなければなりません。スロットの前面に近いほど、見つけやすくなります。
これはほとんどデータ構造の問題だと思いました。それぞれが任意の数の要素を格納できる k 個のリンクされたリストで構成されるデータ構造があるとします。検索を最小限に抑える方法で、リンクされたリストに要素を配布したいと考えています。要素をさまざまなリストに分散するために必要なシステムを使用でき、いつでもリストを並べ替えることができます。この設定が与えられた場合、次のいずれかの仮定の下で、リストを並べ替える最適な方法はありますか?
- 各要素にアクセスする確率が事前に与えられており、アクセスが独立している、または
- どの要素がいつアクセスされるかを事前に知りませんか?
私がウォレットで使用している非公式のシステムは、カードをユース ケース (ID、クレジット カード、ロイヤルティ カードなど) に基づいて異なるスロットに「ハッシュ」し、各スロット内の要素をアクセス頻度で大まかに分類することです。ただし、これを行うためのより良い方法があるかもしれません (たとえば、ユースケースに関係なく、各スロットの先頭に最も頻繁に使用される k 個の要素を格納するなど)。
この問題を解決する既知のシステムはありますか? これはデータ構造のよく知られた問題ですか? もしそうなら、最適な解決策は何ですか?
(これがプログラミングに関連していないように思われる場合: ユーザーがよく使用されるアイテムのドロップダウン リストをいくつか持っていて、それらのアイテムを見つけるのに必要な時間を最小限に抑える方法で並べ替えたいアプリケーションを想像できます。特定のアイテム。)