私は非常に多くのアイテムで機能する並べ替え/ランク付けアルゴリズムに取り組んでおり、それを機能させるために効率的な方法で次のアルゴリズムを実装する必要があります。
番号のリストは2つあります。それらは同じくらい長く、約10万から50万のアイテムです。これから、これらのリストの中でn番目に大きい製品を見つける必要があります。上部に1つのリストがあり、側面にもう1つのリストがあるマトリックスを作成すると、各セルは上の数値と側面の数値の積になります。
例:リストはとA=[1, 3, 4]
ですB=[2, 2, 5]
。次に、製品は[2, 2, 5, 6, 6, 15, 8, 8, 20]
です。それから3番目に大きいものが必要な場合は8になります。
単純な解決策は、これらの数値を生成し、並べ替えてから、n番目に大きい数値を選択することです。しかし、O(m^2 * log m^2)
ここでmは小さなリストの要素の数であり、それは十分に高速ではありません。
私が必要としているのは、最初に2つの小さなリストを並べ替えることだと思います。それはO(m * log m)
です。それなら私は確かに最大のものがA[0]*B[0]であることを知っています。2番目に大きいのはA[0]*B[1]またはA[1]*B[0]のいずれかです...
O(f(n))
これは、マトリックスのサイズに関係なく、段階的に実行できると思います。しかし、私はこの部分を行うための効率的な方法を理解することはできません。
編集:削除された回答がありました。これは、2つの並べ替えられたセットの位置を覚えてから、A [a] * B [b+1]とA[a+ 1] * B [b]を見て、大きい方とa/bをインクリメントします。削除される前にこのコメントを投稿するつもりでした:
これは機能しません。2つのリストA=B=[3,2,1]を想像してみてください。これにより、[9,6,3;のようなマトリックスが得られます。6,4,2; 3,2,1]。したがって、(0,0)= 9から開始し、(0,1)= 6に移動すると、(0,2)= 3または(1,1)=4が選択されます。ただし、これは両方よりも大きい(1,0)=6を見逃します。したがって、2つの隣人だけに目を向けることはできませんが、後戻りする必要があります。