【问题标题】:Calculating gains and losses of overlapping number regions计算重叠数区域的得失
【发布时间】:2017-06-07 09:25:37
【问题描述】:

第二列和第三列中的数字指定了一个范围。我想要的是(如果第一列中的数字相同)计算重叠区域,并计算由右侧数字确定的范围内获得或损失的数量(+1 = 获得一个,-1 =一个丢了)。 例如,如果我有

1   0   300  +2
1   100 200  -1
2   100 200  -1

这意味着我实际上有

1   0   100   +2
1   100 200   +1
1   200 300   +2
2   100 200   -1

因为1 100 2001 0 300 重叠创建0 100 +2100 200 +1200 300 +22 100 200 没有重叠并且只是打印出2 100 200 -1

示例输入

1   0   5000    +1
1   100 400 -1
1   300 500 +2
1   1000    1200    +3
1   1000    1100    -2
1   0   50  -1

预期结果

1  50   100 +1
1  300  400 +1
1  400  500 +3
1  1000 1100    -1
1  1100 1200    +2
1  1200 5000    +1

如何实现这一点的某种伪代码会很好

但适合我的语言是 bash、perl、awk 或 sed

【问题讨论】:

  • 你写过什么吗?
  • @codeforester 我没有,我想不出我可以如何操纵数字来做到这一点
  • 为什么 300 - 400 “+1”?我得到了 +2。
  • @choroba:我同意。它仅在前三个范围内:0 .. 5000 (+1)、100 .. 400 (-1) 和 300 .. 500 (+2)。总数为 +2。

标签: bash perl sorting add


【解决方案1】:

对于第一列的每个不同的值,创建一个列表,列出它所划分的范围的所有起点和终点。

对这些点进行排序

对于每一行数据,将增量值添加到限制之间的所有范围

(如果多个范围相邻且最终具有相同的值,则可以合并多个范围)

打印结果

【讨论】:

  • 增量值是什么意思
  • @Bob:我的意思是你的第四栏。如果您在问题中命名数据字段,这总是有帮助的,这样我们就可以使用我们都能理解的术语。
【解决方案2】:

将数据存储在哈希表中。最上面的键是 id(第 1st 列)。第二级键是“中断”,即增益变化区域的边界。这些值是增益变化的程度。

打印输出时,只要保持一个运行增益,加上存储的值即可;如果结果不为零,则打印。请注意,输出与您预期的不同,但我在尝试用笔和纸解决问题时也得到了我的输出。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my %table;

while (<>) {
    my ($id, $from, $to, $gain) = split;
    $table{$id}{$from} += $gain;
    $table{$id}{$to} -= $gain;
}

for my $id (sort { $a <=> $b } keys %table) {
    my $previous;
    my $gain = 0;
    for my $break (sort { $a <=> $b } keys %{ $table{$id} }) {
        if (defined $previous) {
            $gain += $table{$id}{$previous};
            say join "\t", $id, $previous, $break, $gain
                if $gain;
        }
        $previous = $break;
    }
}

输出:

1       50      100     1
1       300     400     2
1       400     500     3
1       500     1000    1
1       1000    1100    2
1       1100    1200    4
1       1200    5000    1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多