2016-07-02 75 views
-4

n個の配列に分配するプログラムを作成するのに助けが必要です。配列を均等に分配するロジック

例:私は配列を持って、期待

array=(20,80,340,10,96,100,40,870,65) 

出力はこのようなものがあり、これは一例であり、

array1=(870) 
array2=(340) 
array3=(100,20,10) 
array4=(96,40) 
array5=(80,65) 
+3

で停止しましたインデックスから実行を継続[あなたは何を試してみました?](http://whathaveyoutried.com/)SOではありませんwrite-some-code-for-meサイトにアクセスしてください。あなたはあなた自身のために試してみなければなりません。あなたがどこかでつかまえられているときにここにあなたの問題を述べれば、助けを得るでしょう。 5つの結果の配列を得るためにどのようなルールを使用しますか?投稿したコードのほかに、有効なperlはありません。 – dgw

+0

私はこれのためのロジックが必要です。私が投稿したものはperlコードではありません。私は例えば、 – Rameez

+3

パターンが表示されません...要素をランダムに配列に割り当てるだけですか?そうでない場合は、各配列がそれぞれの配列に入る理由を説明してください。 – ThisSuitIsBlackNot

答えて

-1
use strict; 
use warnings; 
use v5.10; 
use Data::Dumper; 

my $servers_number = 5; 
my @source = (20, 80, 340, 10, 90, 100, 40, 450, 60); 
my @result; 

@source = sort {$b <=> $a} @source; 
my @server_times; 

foreach my $time_chunk (@source) 
{ 
    my $server_index = get_less_loaded_server_index(); 
    $result[$server_index] //= [ ]; 

    push @{$result[$server_index]}, $time_chunk; 
    $server_times[$server_index] += $time_chunk; 
} 

sub get_less_loaded_server_index 
{ 
    my $lessest_time; 
    my $selected_server; 

    for (my $i = 0; $i < $servers_number; $i++) 
    { 
     $server_times[$i] //= 0; 

     if (!defined $selected_server || $lessest_time > $server_times[$i]) 
     { 
      $lessest_time = $server_times[$i]; 
      $selected_server = $i; 
     } 
    } 
    return $selected_server; 
} 

say Dumper(\@result); 
+0

パーフェクト。どうもありがとうございます – Rameez

-1

私はあなたの質問の権利を理解していれば、あなたは、n個の配列の維持に数字の配列を分割する必要がありますでも、できるだけ彼らは、私が見る最初の方法:

秒の
  • 計算完璧な量を降順ソート源アレイは、サブに収まる
    1. 配列全体の要素の合計が完全な量よりも少なくなるまで、すべての要素を最初の部分配列に入れてから、ソース配列の反復を開始します。
    2. サブアレイに次の要素を配置するのが完全な量を超える場合は、最後から実行を開始し、いくつかの小さな数値を入れます。
    3. 新しい部分配列を作成し、P 3
  • +0

    欲張りアルゴリズムが常に最適なわけではありません。 – bipll

    +0

    ありがとうございます。しかし、私の目標は、次の時間に均等に完了するように、時間(プログラムの履歴実行時間)を異なるサーバーに分散することです。したがって、最初の配列@time_arrayは、いくつかのプログラムの履歴実行時間です。今私は、実行時間を短縮するために別のサーバーに配布したいと思っています。私が順番を落として、最初の配列にすべてを入れ始めると、より大きなすべてのprojectd(実行する時間の点で)が最初の配列になることを意味します。私はatleastすべての大きなプロジェクトを別の配列に配布したい。私はあなたが私のポイントを持っていればいいと思う – Rameez

    +0

    @bipllそれは最高のものではなかった、ちょうど最初の考え。 –

    関連する問題