Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在perl中查找下一个更高数字的最佳算法_Algorithm_Perl - Fatal编程技术网

Algorithm 在perl中查找下一个更高数字的最佳算法

Algorithm 在perl中查找下一个更高数字的最佳算法,algorithm,perl,Algorithm,Perl,我试图找到以前类似于我的问题的线索,但没有找到 考虑一个获取数组和数字的函数。我想找到下一个更高的号码 例如: 输入:arr={2,5,3,8,15,10},number=6 输出:8因为6$input\U number){ $next\u number=$loop\u number; $found=1; 最后; } } 如果($found==1){ 打印“+input_number+”的“下一个更高的数字”为:“+next_number; }否则{ 打印“未找到下一个更高的数字”; } 您可以

我试图找到以前类似于我的问题的线索,但没有找到

考虑一个获取数组和数字的函数。我想找到下一个更高的号码

例如:

输入:
arr={2,5,3,8,15,10},number=6

输出:
8
因为
6<8

在Perl中最好的算法是什么

编辑:我尝试的:

my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = 10000000;
foreach my $val (@arr) {
    if($number < $val && $next_largest > $val) {
        $next_largest = $val;
    }
}

if(defined($next_largest)) {
    print $next_largest."\n";
}
my@arr=(2,5,3,8,15,10);
我的$number=6;
我的$next_最大=10000000;
foreach my$val(@arr){
如果($number<$val&$next\u max>$val){
$next_max=$val;
}
}
如果(已定义($next_最大)){
打印$next\u最大值。“\n”;
}
有没有办法不声明
$next\u max=10000000
?它看起来不太好,也不能处理值高于此值的情况。另外,如果我尝试不带数字的
$next\u lergest
,它也不起作用


我的意思是“最好”——看起来最好(时间并不那么重要)。

首先,按数字升序对数组进行排序。然后循环数组中的元素,直到找到一个更大的数字

my $input_number = 6;

my @array = (2, 5, 3, 8, 15, 10);
my @sorted_array = sort { $a <=> $b } @array;

my $found = 0;
my $next_number;

foreach (@sorted_array) {
    my $loop_number = $_;

    if ($loop_number > $input_number) {
        $next_number = $loop_number;
        $found = 1;
        last;
    }
}

if ($found == 1) {
    print "next higher number for " + input_number + " is: " + next_number;
} else {
    print "no next higher number found";
}
my$input\u number=6;
my@array=(2,5,3,8,15,10);
my@sorted_array=sort{$a$b}@array;
我的$found=0;
我的$next_号码;
foreach(@sorted_数组){
我的$loop\u编号=$\u;
if($loop\U number>$input\U number){
$next\u number=$loop\u number;
$found=1;
最后;
}
}
如果($found==1){
打印“+input_number+”的“下一个更高的数字”为:“+next_number;
}否则{
打印“未找到下一个更高的数字”;
}

您可以使用
$number
作为哨兵值:

my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = $number;
foreach (@arr) {
    if($number < $_ && ($next_largest == $number || $next_largest > $_)) {
        $next_largest = $_;
    }
}

if($next_largest > $number) {
    print $next_largest."\n";
}
my@arr=(2,5,3,8,15,10);
我的$number=6;
my$next_max=$number;
foreach(@arr){
如果($number<$\u&&($next_-magnet==$number | |$next_-magnet>$){
$next\u最大=$\u;
}
}
如果($next\u max>$number){
打印$next\u最大值。“\n”;
}
这将消除代码中的任意大值,并且仅当找到严格大于
$number
的元素时才打印结果

注意:更优雅,但我的内存效率可能更高。

这也可以:

use strict;
use warnings;
my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = (sort {$a <=> $b} grep {$_ > $number} @arr)[0];
if(defined($next_largest)) {
    print $next_largest."\n";
}
使用严格;
使用警告;
my@arr=(2,5,3,8,15,10);
我的$number=6;
我的$next_最大=(排序{$a$b}grep{$\>$number}@arr)[0];
如果(已定义($next_最大)){
打印$next\u最大值。“\n”;
}

扫描阵列并跟踪大于数字的最小元素(如果有)。有很多方法可以做到这一点;你试过什么?如果输入数组已经排序,二进制搜索将是最快的,但这似乎不适用。另外,请定义“最佳”的含义。@TedHopp,我编辑了我的问题。请看一看。数组中的数字总是排序的吗?谢谢您的快速重播。可以不分类吗?请看我的编辑。如果你要麻烦排序,那么用二进制搜索代替循环会更快。但总的来说,这将是缓慢的,因为单独的排序是O(n log n),这个问题可以在一个简单的O(n)扫描中解决。此外,您还可以销毁原始数组。如果数组总是被排序,那么您可以只编写
my$next\u max=first{$\u>$number}@arr
。(
first
也在
List::Util
)@Borodin-根据OP的示例数据,数组不一定排序。@TedHopp:Ah。我没有发现最后两个值!它不起作用(试图运行它),因为if语句第一次迭代时实际检查的是:
if(6<$\u&&6>$\u)
-始终为false。@TTaJTa4-Oops。是的,我遗漏了哨兵值所需的特殊处理。有办法解决吗?这就是我需要它的方式。
use strict;
use warnings;
my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = (sort {$a <=> $b} grep {$_ > $number} @arr)[0];
if(defined($next_largest)) {
    print $next_largest."\n";
}