私はテストでこの質問に出くわしました。要素を追加して配列を減らす
配列を指定すると、最小コストで単一の要素に配列を縮小します。削減するには、配列から2つの要素を削除し、その2つの数を加算し、合計を配列内に戻します。各操作のコストは、そのステップで削除された要素の合計です。
例、その後、我々は彼らの両方を追加し、1と2を削除することができますし、配列に戻って合計を保つ配列にA = [1,2,3]
をしましょう。このステップのコストは、(1 + 2)であろう。3.
したがってA = [3,3]、第2のステップでコスト= 3
=、我々は、アレイからの両方の要素を削除して和を保つことができます再び配列に戻ります。このステップのコストは= 6
コストがそう総コストは9(6 + 3)であることが判明し、A = [6]、SO 3 + 3 = 6
あろう。
私は配列をソートしようとしていますが、要素を増やしていくほど減らしていますが、重複要素があると失敗します。
私のアルゴリズムの擬似コード
sort(Array)
cost = 0
for(i=0; i<Array.length - 1; i++) {
Array[i+1] = Array[i] + Array[i+1]
cost = cost + Array[i+1]
}
上記のアルゴリズムが働いていませんでした。私はそれが失敗する可能性のあるケースを考え出した。 Array = [5,5,5,5]の場合、上記のアルゴリズムに従ってCost = 45になります。
ただし、最初の2つの要素と最後の2つの要素を合計し、残りの2つの要素を合計すると、合計コストは40になります(最初の手順ではコスト= 10 * 2、次の手順別の20)
これに対して効率的なアルゴリズムは何でしょうか?
私はいつも2つの最小要素を追加すると効果があると思う。あなたはこれをしていますか?使用している正確なアルゴリズムを表示してください。配列に合計を追加すると、それを前面、背面、またはw.r.tに属する場所に配置しますか?ソート? –
質問を編集しました。私は合計を前の配列に戻しています(要素の1つを合計で置き換える)。私は適切な場所で配列に和を戻しておくことを考えましたw.r.t.並べ替えるたびにそれを行う必要があるので、並べ替えには少し時間がかかります。 – AnkitAti
おそらく、ヒープまたはバイナリ検索ツリーの要素を保持する必要がありますか?次に、毎回2つの最小要素を取り出すためにO(logn)のコストがかかります。 –