我有一个数学问题,我尝试用 Delphi 函数来解决。我试图将一个整数分成(几乎)相等的部分。示例:
您有 10 个测试用例,您希望分 3 部分执行它们。因此,平衡工作负载的最佳方法是执行 3、3 和 4,而不是 1、1 和 8。
procedure calc_stream_numbers;
var div_res,rest:double;
total,streams:integer;
begin
total := 10;
streams := 3;
div_res := total DIV streams;
rest := total MOD streams;
showmessage('Items: ' +IntToStr(total)+#13#10+
'Streams: '+IntToStr(streams)+#13#10+
'Result: '+FloatToStr(div_res)+
'Rest: '+FloatToStr(rest));
end;
这给了我除法结果 10/3 = 3 (Rest 1) 所以我可以执行 3 x 3 个测试用例,总共 9 个。要执行全部 10 个流,我必须将剩余的一个添加到 3 个流中的任意一个。但是如果你有一个更复杂的例子..
我确信有一个数学表达式,但我必须承认,我没有任何线索。也许你能启发我这样的划分是如何调用的以及是否有任何内置的delphi函数。
最佳答案
这是:http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
一个维度是工作负载量,另一个维度是工作人员数量
<小时/>嗯,2D 图形的目标是养眼,因此在“短”片段中公平地分配“长”片段。 对于您的情况,我们可以将所有“长”的都偏向一端。
function SplitIntoEqualParts(Total, Count: Integer): TArray<Integer>;
var
i: Integer;
delta, delta1, extra: Word;
begin
Assert( Count < High(Word) ); // RTL DivMod limitation
SetLength(Result, Count);
DivMod(Total, Count, delta, extra);
// one division operation is 2 times faster than two separate operations :-D
delta1 := Succ(delta);
for i := 0 to extra-1 do
Result[i] := delta1;
for i := extra to Count-1 do
Result[i] := delta;
end;
关于德尔福除法与其余部分均分(MOD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30782474/