小编Pav*_*sov的帖子

找到数组中两个数字之间的最小绝对差值的最佳算法

有一个数组,可以包含,例如,最多1000元素.它可以产生的数字范围1 to 10^10.现在我必须minimal absolute difference在数组中找到两个数字之间的数字.我想到了两种算法:

对于第一个,我已经定义了一个binarysearch函数,该函数在排序的数组中找到要插入的数字的位置.现在,我只使用给定数组的第一个数字启动排序数组,然后从第二个元素开始迭代给定数组.对于每个数字,我在排序数组中找到它的位置.如果该位置的数字是这个数字,那么差值为0,它是最低的数字,所以我退出循环.否则,我在该点插入已排序数组中的数字,然后检查该数字与该数组中前一个和下一个数字之间的差异.然后我存储此结果的最小值和先前的结果,并以这种方式继续.

第二:我使用quicksort对数组进行排序.(范围太大,所以我认为基数排序不会那么高效).然后我迭代它,如果两个连续的数字相等则以0的答案断开,否则存储该数字与前一个数字和前一个结果之间的差值的最小值.

哪一个会更有效率?

还有更好的算法吗?

Stackoverflow在这方面有很多帖子,但它们没有多大帮助.这是我在Perl中的代码:

sub position {
    my @list   = @{$_[0]};
    my $target = $_[1];

    my ($low,$high) = (0, (scalar @list)-1);

    while ($low <= $high) {
        $mid = int(($high + $low)/2);

        if ( $list[$mid] == $target ) {

            return $mid;
        }
        elsif ( $target < $list[$mid] ) {

            $high = $mid - 1; 
        }
        else {

            $low = $mid + 1;
        }
    }
    $low; …
Run Code Online (Sandbox Code Playgroud)

sorting algorithm perl binary-search

16
推荐指数
3
解决办法
7835
查看次数

如何在Perl中正确声明全局变量?

我试图理解变量范围并在Perl中正确声明变量,我很难过.

下面的代码基本上读取一个excel文件,解析它,然后将它吐出到一个新的excel文件中.

但是,我试图读取其中一个标题,如果标题与我的字符串匹配,我想记录该列号,并在稍后的代码中使用它.

我在./parser.pl第38行打印出"使用未初始化的值$ site_name_col".

第38行是"print $ site_name_col;"

我意识到这个print语句在最初初始化变量的{}之外,但它在代码的开头被声明为一个全局变量,那么是什么给出了?

#!/usr/bin/perl -w

use strict;
use warnings;
use vars qw($site_name_col);
use Spreadsheet::WriteExcel;
use Spreadsheet::ParseExcel;

my ($fname1) = @ARGV;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse($fname1);

my $new_workbook = Spreadsheet::WriteExcel->new('formated_list.xls', $fname1);

if (!defined $workbook) {

    die $parser->error(), ".\n";
}

for my $worksheet ( $workbook->worksheets() ) {

    my ($wsheet_name) = $worksheet->get_name();
    my $new_worksheet = $new_workbook->add_worksheet($wsheet_name);  

    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();

    for my $row ($row_min .. $row_max) {

        for …
Run Code Online (Sandbox Code Playgroud)

perl

9
推荐指数
1
解决办法
3万
查看次数

为什么可以在布尔上下文中评估`defined $ x && $ x`?

my $target_type = (defined($item->{target_type}) && $item->{target_type}) 
                ? $item->{target_type} 
                : "";

my $target_id   = (defined($item->{target_id}) && $item->{target_id})
                ? $item->{target_id} 
                : "";
Run Code Online (Sandbox Code Playgroud)

为什么开发人员使用&&几乎相同的条件?

perl boolean operators

3
推荐指数
1
解决办法
140
查看次数

尝试:: Tiny:使用try-catch或Not的奇怪行为?

我正在使用Try::Tinytry-catch.

代码如下:

use Try::Tiny;

try {
    print "In try";
    wrongsubroutine();  # undefined subroutine
}
catch {
    print "In catch";
}

somefunction();
Run Code Online (Sandbox Code Playgroud)

...

sub somefunction {
    print "somefunction";
}
Run Code Online (Sandbox Code Playgroud)

当我执行时它是这样的:

somefunction
In Try
In catch
Run Code Online (Sandbox Code Playgroud)

输出序列对我来说是错误的.这是错的吗?或这是正常的行为吗?

perl cpan exception-handling try-catch weak-typing

3
推荐指数
1
解决办法
934
查看次数

如何使用perl中的现有数组声明数组?

所以说我创建了一组这样的数组:

my (@device, @mount, @type, @options, @dump, @pass) = ();
Run Code Online (Sandbox Code Playgroud)

然后我想在其中创建一个包含这些数组的数组.我该怎么办?我试着用:

my @columns = (@device, @mount, @type, @options, @dump, @pass);
Run Code Online (Sandbox Code Playgroud)

my @columns = ([@device], [@mount], [@type], [@options], [@dump], [@pass]);
Run Code Online (Sandbox Code Playgroud)

问题似乎是@columns仍为空.我觉得我犯了一个非常简单的语法错误.我做错了什么?

arrays perl dereference

3
推荐指数
1
解决办法
497
查看次数

2个文件之间的比较,并以顺序方式打印它们之间的差异

我有2个文件

**a.txt**
cars
bikes
bus 
vehicle
atv

**b.txt**
hawk
hero
atv
bus

***result.txt***
cars
bikes
vehicle
hawk
hero
Run Code Online (Sandbox Code Playgroud)

我想打印2个文件之间的差异.现在我尝试了一个代码,但它以随机的方式给了我差异; 我希望它以适当的顺序方式显示它.任何人都可以帮助我.

use strict;
my %results = ();  

open FILE1, "<a.txt"
    or die "Could not open file: $! \n"; 
while (my $line = <FILE1>) {

    $results{$line}=1; 
} 
close FILE1;  

open FILE2, "<b.txt" 
    or die "Could not open file: $! \n"; 
while (my $line = <FILE2>) {

    $results{$line}++; 
} 
close FILE2;

open OUTFILE, ">>result.txt" 
    or die "Cannot open $outfile for writing \n";
foreach …
Run Code Online (Sandbox Code Playgroud)

regex perl compare

2
推荐指数
1
解决办法
548
查看次数

perl只打印数组的最后一行

我正在尝试打印数组,但输出只包含数组的最后一行.部分代码如下.

open OUT, "> /myFile.txt"
    or die "Couldn't open output file: $!";

foreach (@result) {

    print OUT;
}
Run Code Online (Sandbox Code Playgroud)

输出是

List Z
Run Code Online (Sandbox Code Playgroud)

这是最后一行,但是当我做出print "@result"去的时候是

List A

List B

List C  so on...
Run Code Online (Sandbox Code Playgroud)

我有点混淆为什么在同一个数组上结果不同.

perl

2
推荐指数
1
解决办法
1057
查看次数

如何找出图像中的直线

我有一个图像文件.(jpg或png)

这只有4种颜色和几条黑线.(600px X 600px图像尺寸).可以有2或4或6条黑线.

我需要得到每条黑线的(x1,y1)和(x2,y2).

可以使用perl或c或matlab实现

c perl matlab imagemagick image-processing

2
推荐指数
1
解决办法
875
查看次数

perl中智能匹配运算符的意外行为

根据perlop:Smartmatch-Operator,代码如下:

use 5.012;

my @array = qw/1 2/;

print @array ~~ 2
    ? "true"
    : "false";
Run Code Online (Sandbox Code Playgroud)

应该使用规则

左右描述和伪代码
============================================= ==================

任何Num数字相等(如:Any == Num)

但输出是"假".但我想

@array == 2
Run Code Online (Sandbox Code Playgroud)

应该是真的.我哪里出错了?

perl

2
推荐指数
1
解决办法
198
查看次数

如何使用open pragma的utf8编码

utf8::encode在使用pragma时遇到问题use open qw(:std :utf8);

#!/usr/bin/env perl

use v5.16;
use utf8;
use open qw(:std :utf8);

use Data::Dumper;

my $word = "+????";
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

utf8::encode($word);
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

产量

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0
Run Code Online (Sandbox Code Playgroud)

当我删除这个pragma use open qw(:std :utf8);,一切都很好.

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+????';
0
Run Code Online (Sandbox Code Playgroud)

先谢谢你!

perl utf-8 character-encoding

2
推荐指数
1
解决办法
265
查看次数