逻辑均匀分布数组

时间:2016-07-02 20:36:11

标签: distribution

我需要帮助来创建一个程序来分发给n个数组。

EG。我有一个数组,

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

预期的输出是这样的,这只是一个例子,

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

2 个答案:

答案 0 :(得分:-1)

如果我理解你的问题,你需要将数组数组分成n个数组,尽可能保持它们,我看到的第一种方式是:

  1. 对源数组进行降序排序
  2. 计算适合子阵列的完美秒数(sum elements和div by n-1)
  3. 从头开始迭代源数组,将每个元素放入第一个子数组,直到其元素之和小于完美数量。
  4. 如果将下一个元素放到子数组中将超过完美数量,从最后开始运行,并放入一些低数字。
  5. 创建新的子阵列并继续从您在第3页停止的索引开始运行。

答案 1 :(得分:-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);