Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
perl快速排序_Perl_Sorting - Fatal编程技术网

perl快速排序

perl快速排序,perl,sorting,Perl,Sorting,有没有一种在perl中进行快速排序的方法?就像我有一个非常大的散列,可能有1亿个键。当我测试时,对我的$x(sort{$a cmp$b}键%myhash){do SOMETHING}执行是非常低效的。我想知道是否可以先将所有键复制到一个数组中,并对其进行快速排序 您不希望将哈希放在列表上下文中,因为您不希望值与键一起排序。相反,如果要对键进行排序,请选择“是”: my @ordered_keys = sort { $a cmp $b } keys %hash; 但是,如果您希望以这种方式处理这

有没有一种在perl中进行快速排序的方法?就像我有一个非常大的散列,可能有1亿个键。当我测试时,对我的$x(sort{$a cmp$b}键%myhash){do SOMETHING}执行
是非常低效的。我想知道是否可以先将所有键复制到一个数组中,并对其进行快速排序

您不希望将哈希放在列表上下文中,因为您不希望值与键一起排序。相反,如果要对键进行排序,请选择“是”:

my @ordered_keys = sort { $a cmp $b } keys %hash;
但是,如果您希望以这种方式处理这些值,您可以这样做:

my @ordered_values = @hash{ sort { $a cmp $b } keys %hash };
这使用了一个

但通过这种方式,您可以执行以下操作:

foreach my $value ( @hash{ sort { $a cmp $b } keys %hash } ) { 
    # key? What key?
    do_something_with_hash_value( $value );
}

您不希望将哈希放在列表上下文中,因为您不希望值与键一起排序。相反,如果要对键进行排序,请选择“是”:

my @ordered_keys = sort { $a cmp $b } keys %hash;
但是,如果您希望以这种方式处理这些值,您可以这样做:

my @ordered_values = @hash{ sort { $a cmp $b } keys %hash };
这使用了一个

但通过这种方式,您可以执行以下操作:

foreach my $value ( @hash{ sort { $a cmp $b } keys %hash } ) { 
    # key? What key?
    do_something_with_hash_value( $value );
}

假设对100个字符串进行排序需要10μs(千万分之一秒)。你会考虑这么快吗?可能这大概就是我的机器的功能

如果是这样,你应该考虑41s快速100000000弦! 原因如下

您没有对100个字符串进行排序;您对字符串的排序是原来的1000000倍。但排序不是线性的。最好的排序算法是O(N logn)。假设这是紧密结合的,这意味着

  • 对100个字符串进行排序将需要$开销+100*log2(100)*$time\u/次操作

  • 对100000000个密钥进行排序将需要$开销+1000000*log2(1000000)*$time\u/次操作

假设可以忽略不计的开销,这意味着排序100000000个字符串将比排序100个字符串花费4100000倍的时间

因此,如果考虑100个字符串的快速10μs,则应该考虑100000000个字符串的41s快。


你得到的是什么类型的数字?

假设排序100个字符串需要10μs(千万分之一秒)。你会考虑这么快吗?可能这大概就是我的机器的功能

如果是这样,你应该考虑41s快速100000000弦! 原因如下

您没有对100个字符串进行排序;您对字符串的排序是原来的1000000倍。但排序不是线性的。最好的排序算法是O(N logn)。假设这是紧密结合的,这意味着

  • 对100个字符串进行排序将需要$开销+100*log2(100)*$time\u/次操作

  • 对100000000个密钥进行排序将需要$开销+1000000*log2(1000000)*$time\u/次操作

假设可以忽略不计的开销,这意味着排序100000000个字符串将比排序100个字符串花费4100000倍的时间

因此,如果考虑100个字符串的快速10μs,则应该考虑100000000个字符串的41s快。


你得到了什么样的数字?

你想做什么
sort{$a cmp$b}%myhash
将尝试对散列的键和值进行排序,我确信这不是您要做的。散列中的1亿个键(内存中)听起来您应该考虑perl以外的东西。数据库?@j_random_hacker,是的,这是一个打字错误,我是说排序{$a cmp$b}键%myhashOK,对一亿个东西进行排序需要很长时间。通常,命令行
sort
经过了很好的优化,并且知道如何将太大而无法在内存中高效排序的数据集分解,因此可以更快地写出数据,在数据上运行
sort
,然后将其读回。为什么需要将所有1亿个键按“ASCII beticial”顺序排序?有没有可能你真的只对那一亿把钥匙中的一小部分感兴趣。。。还是在划分它们?为什么不是一个更有用的订单?你想做什么
sort{$a cmp$b}%myhash
将尝试对散列的键和值进行排序,我确信这不是您要做的。散列中的1亿个键(内存中)听起来您应该考虑perl以外的东西。数据库?@j_random_hacker,是的,这是一个打字错误,我是说排序{$a cmp$b}键%myhashOK,对一亿个东西进行排序需要很长时间。通常,命令行
sort
经过了很好的优化,并且知道如何将太大而无法在内存中高效排序的数据集分解,因此可以更快地写出数据,在数据上运行
sort
,然后将其读回。为什么需要将所有1亿个键按“ASCII beticial”顺序排序?有没有可能你真的只对那一亿把钥匙中的一小部分感兴趣。。。还是在划分它们?为什么不建立一个更有用的秩序呢?