均匀分布数组的逻辑
Logic to evenly distribute an array
我需要帮助来创建一个程序来分发到 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)
如果我理解你的问题是正确的并且你需要将数字数组拆分为 n 个数组以尽可能保持它们均匀,我看到的第一种方式:
- 对源数组进行降序排序
- 计算子数组中适合的完美秒数(用 n-1 对元素和 div 求和)
- 从头开始迭代源数组,将每个元素放入第一个子数组,直到其元素之和小于完美数量。
- 如果将下一个元素放入子数组会超过完美数量,请从末尾开始 运行,并放入一些低数。
- 创建新子数组并从您在 p 3 处停止的索引继续 运行。
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);
我需要帮助来创建一个程序来分发到 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)
如果我理解你的问题是正确的并且你需要将数字数组拆分为 n 个数组以尽可能保持它们均匀,我看到的第一种方式:
- 对源数组进行降序排序
- 计算子数组中适合的完美秒数(用 n-1 对元素和 div 求和)
- 从头开始迭代源数组,将每个元素放入第一个子数组,直到其元素之和小于完美数量。
- 如果将下一个元素放入子数组会超过完美数量,请从末尾开始 运行,并放入一些低数。
- 创建新子数组并从您在 p 3 处停止的索引继续 运行。
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);