キーと値のペアを持つリストがあるとします。キーも値もペアも一意である必要はありません。
次の例
a -> 1
b -> 2
c -> 3
a -> 3
b -> 1
有効です。
ここで、任意のキーと値のペア (k->v) に、次のプロパティを持つ別の値 V を関連付けたいとします。
- キーが同一であれば、2 つのペアで同じです。
- リスト全体のキーと値のペアのセットによって一意に決定されます
これは抽象的なように聞こえますが、たとえば、合計、最大、およびカウント関数は例として適格です
Pair SUM MAX COUNT
a -> 1 4 3 2
b -> 2 3 2 2
c -> 3 3 3 1
a -> 3 4 3 2
b -> 1 3 2 2
リスト全体でそのような関数を計算するための高速なメソッド/データ構造を探しています。
キーを並べ替えることができる場合、単純にリストを並べ替えてから、並べ替えられたリストを反復処理し、同一のキーを使用して各ブロックの関数 V を計算できます。
値が比較できない場合、またはエントリの順序を変更したくない場合に、これを行うための優れた方法があるかどうかを尋ねています。
いくつかの考え:
- もちろん、ソート可能なキーを取得するために、キーにハッシュ関数を適用することもできます。
- もちろん、各ペアの元の位置を保存し、並べ替えを行い、関数を計算し、最後に並べ替えを元に戻すこともできます。
したがって、本質的に、質問はすでに回答されています。ただし、おそらくいくつかの適応データ構造を使用した、よりエレガントなソリューションがあるかどうかに興味があります
編集: Sunny Agrawal のコメントを明確にするために、アソシエイトとは何を意味するのかを説明します。これは、データ構造を適切に配置する方法に関する問題の一部でもあります。私の例では、(k->v) をキーとして、V を値として別のリスト/マップを取得します。ただし、データをそのように配置しない方がよい場合もあります。V は、特定の k に対して V を取得するのに一定の時間を必要とするような方法で保存する必要があります。