我是perl的新手,正在寻找一个@array
中的最小值。是否有一些代表非常大整数的常量?
我知道我可以对数组进行排序并取开头,但这似乎浪费了很多CPU周期。在Perl中,有什么优雅的解决方案来解决我的问题?
为了回答你实际提出的问题(尽管这对你并没有真正用处):
Largest integer value that can be stored as a signed integer.
say ~0 >> 1;
Largest integer value that can be stored as an unsigned integer.
say ~0;
All integer values from 0 to this number can be stored without loss as a floating point number.
use Config qw( %Config );
say eval($Config{nv_overflows_integers_at});
Note that some larger integers can be stored without loss in a floating point number, but not the one 1 higher than this.
$Config{ivmax}
或 $Config{uvmax}
。在 blead Perl 源代码中搜索也没有找到任何信息。您能分享一下您是如何获取这些配置条目的吗? - amon$Config {ivsize} * 8
可以给出位数)。已修复。 - ikegami-(~0 >> 1)-1
。 - ikegamiundef
来表示不存在的值;Perl 标量不仅限于存储整数。这样写:my $min; # undef by default
for my $value (@array) {
$min = $value if !defined $min or $value < $min;
}
但这里有一些更简单的选项。例如,将$min
初始化为数组中的第一个值,然后与其余值进行比较:
my $min = $array[0];
for my $i (1 .. $#array) {
$min = $array[$i] if $array[$i] < $min;
}
或者只需使用内置函数:
use List::Util 'min';
my $min = min @array;
undef
),所有三个返回值都相同! - ikegamimy $min = $array [0]; 对于我的价值观@array { 如果$value < $min,则$min = $value; }
(是的,它会进行一次额外的比较,但它会减少(N-1)和(N-1)*2个变量查找。但更重要的是,它是更简单的代码。) - ikegami9**9**9
可以工作。在许多版本/平台的perl上,0+'inf'
也可以使用。
Perl不同于C语言,如果你试图计算一个太大的整数,你会得到一个浮点数结果(除非你使用use bigint
,它可以使整数无限制)。此外,你会得到inf
。
你可以通过Devel::Peek
来查看这一点,它会显示Perl值的内部表示:
$ perl -E 'use Devel::Peek; Dump(1000); Dump(1000**100); Dump(1000**100 + 1)'
SV = IV(0xcdf290) at 0xcdf2a0
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 1000
SV = NV(0xd04f20) at 0xcdf258
REFCNT = 1
FLAGS = (PADTMP,NOK,READONLY,pNOK)
NV = 1e+300
SV = NV(0xd04f18) at 0xcdf228
REFCNT = 1
FLAGS = (PADTMP,NOK,READONLY,pNOK)
NV = 1e+300
IV
表示整数值;NV
表示浮点数值。
你应该使用适合你目的的工具,而不是模糊的 hack;如另一个答案中提到的 List::Util::min
就非常好。只是想让你确认一下你最初的问题 :)
这里:http://www.perlmonks.org/?node_id=718414
我得到了一个在Linux 64位上可以验证的答案
18,446,744,073,709,551,615 = (2 ^64)-1
Perl 可以存储的最大整数值为 9,007,199,254,740,992。
我不知道是否有一个专门针对此的常量。
O(n log n)
。与遍历(O(n)
)相比,只有当你有数千到数百万个项目的数组时才会成为问题。 - Niet the Dark AbsolO(n log n)
。 - Krishnachandra SharmaO(n log {n})
次比较来对n
个项目进行排序。在最坏情况下,它需要O(n^{2})
次比较。 - Zak