Perl中著名的Schwartzian转换问题解决实现
Perl中著名的Schwartzian转换,其产生背景主要涉及到排序问题:
比如说,根据文件名以字母顺序排序,代码如下:
use strict;
use warnings;
my @files = glob "*.xml"; #perl中文件操作符glob提供相当于shell中的通配符的功能
my @sorted_files = sort @files; #sort(),排序,默认是字母顺序排序
比如说,根据文件名长度排序,其代码如下:
use strict;
use warnings;
#length求长度。 太空船操作符,默认变量是$a,$b,返回值为-1,0,1分别表示大于,==,小于。 sort进行排序
my $files = ".xml";
my @sorted_length = sort { length($a) length($b) } @files;
上面的两种情况,对很多文件操作来说,速度还不算慢,如果是下面这种情况。
比如说:要批量比较文件大小,其代码如下:
use strict;
use warnings;
my @files = glob "*.xml";
my @sort_size = sort { -s $a -s $b } @files; #比较大小
上面的代码设计到三重(次)操作:
1. 从硬盘上获取文件大小(-s $b)
2. 比较文件大小(太空船操作)
3. 对其进行排序(sort操作)
考虑到要比较$a,$b大小时,要从硬盘中获取两次,所以次数是6次!也就是说,如果有1万个文件,总共是6万次。
其算法复杂度是: n*long(n),考虑到后两项(比较文件大小,进行排序)必然要进行的操作,但第一项却可以降低!
即一次性从硬盘中读取所有文件大小,将其放置到Perl中的默认的变量,并存储到内存中!于是又下面算法实现:
use strict;
use warnings;
my @files = glob "*.xml";
my @unsorted_pairs = map { [$_, -s $_] } @files;
my @sorted_pairs = sort { $a->[1] $b->[1] } @unsorted_pairs;
my @sorted_files = map { $_->[0] } @sorted_pairs;
看上去比较复杂,分三个步骤解释下:
第一步:遍历文件列表,对每个文件创建一个数组引用。数组引用包含两个元素:
第一个是文件名($_),第二个是文件大小(-s $_)。这样,处理每个文件只访问一次磁盘。
第二步:对二维数组排序。因比较文件大小,所以需取元素[1],比较它们的值。得到另一个二维数组。
第三步:丢掉文件大小元素,创建一个只含文件名的列表。完成目标!
上面的代码使用了两个临时数组,但这并不是必须的。我们可以一个语句就能完成所有的工作。为了达到目的,需要按照“数据从右流向左”的原理反转句子顺序,不如果将每个句子放在单独一行,并且留出足够的空间,我们依然可以写出可读性高的代码。
my @quickly_sorted_files =
map { $_->[0] }
sort { $a->[1] $b->[1] }
map { [$_, -s $_] }
@files;
这就是以Randal L. Schwartz命名的Schwartzian转换,对数据量特多的情况下,其速度要比前者快数倍!
下面写了小程序,包括在生成1万个xml文件,在两种情况下,完整代码如下:
#!/usr/bin/perl -w
use strict;
use warnings;
use autodie;
use v5.10;
######################################
### 创建要比较的10,000个.xml文件 ###
######################################
my $profix = ".xml";
foreach my $num (1..10000) {
open(my $fh, '>', $num . $profix) || die "Can not create the file: $!\n";
print $fh "This is file size testing!";
}
print "All the 10_1000 files created! \n";
######################################
### 常规转换: 遍历20次 ###
######################################
my $t1 = time();
foreach (1..20){
my @files = glob "*.xml";
my @sorted = sort { -s $a -s $b } @files;
}
say "常规算法需要时间: => ", time()- $t1;
######################################
### Schwartzian转换: 遍历20次 ###
######################################
my $t2 = time();
foreach (1..20){
my @files = glob "*.xml";
my @sorted =
map {$_->[0]}
sort {$a->[1] $b->[1]}
map {[$_, -s $_]}
@files;
}
say "Schwartzian算法需要时间: => ", time()- $t2;
输出结果:
All the 10_1000 files created!
常规算法需要时间: => 185
Schwartzian算法需要时间: => 115

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Vue.js 및 Perl 언어를 사용하여 효율적인 웹 크롤러 및 데이터 스크래핑 도구를 개발하십시오. 최근 인터넷의 급속한 발전과 데이터의 중요성이 증가함에 따라 웹 크롤러 및 데이터 스크래핑 도구에 대한 수요도 증가했습니다. 이러한 맥락에서 Vue.js와 Perl 언어를 결합하여 효율적인 웹 크롤러와 데이터 스크래핑 도구를 개발하는 것은 좋은 선택입니다. 이 기사에서는 Vue.js 및 Perl 언어를 사용하여 이러한 도구를 개발하는 방법을 소개하고 해당 코드 예제를 첨부합니다. 1. Vue.js 및 Perl 언어 소개

오늘날의 디지털 시대에 웹 애플리케이션은 점점 더 보편화되어 우리 삶을 더욱 편리하고 효율적으로 만들고 있습니다. Python과 Perl은 널리 사용되는 두 가지 프로그래밍 언어로, 둘 다 웹 애플리케이션 구축에 이상적입니다. 그러나 고성능 웹 애플리케이션을 구축하려면 몇 가지 모범 사례를 숙지해야 합니다. 이 기사에서는 Python 및 Perl에서 고성능 웹 애플리케이션을 구축하기 위한 몇 가지 모범 사례를 소개합니다. 적합한 웹 프레임워크 선택 적합한 웹 프레임워크를 선택하는 것은 고성능 웹 애플리케이션을 설계하는 데 있어 중요한 단계입니다.

Vue.js 및 Perl 언어를 사용하여 시스템 스크립트 및 자동화 도구 개발 현재 소프트웨어 개발 환경에서 시스템 스크립트 및 자동화 도구는 개발자가 시간을 절약하고 효율성을 향상시키는 중요한 도구가 되었습니다. 이 기사에서는 Vue.js 및 Perl 언어를 사용하여 시스템 스크립트 및 자동화 도구를 개발하는 방법을 소개하고 몇 가지 코드 예제를 제공합니다. Vue.js는 사용자 인터페이스 구축에 널리 사용되는 JavaScript 프레임워크입니다. 컴포넌트 기반 개발 접근 방식을 채택하여 개발자가 다음을 수행할 수 있도록 합니다.

perl+fastcgi+nginx nginx+fastcgi는 PHP에서 가장 인기 있는 환경입니다. Perl에도 fastcgi가 있습니까? 물론 오늘 우리는 nginx에서 perl용 fastcgi를 구축할 것입니다. 웹 프로그램 PHP의 인기는 아무리 성능이 좋아도 헛수고입니다. 그러나 몇 가지 작은 기능은 Perl의 fastcgi를 사용하여 해결할 수 있습니다. : nginxperl: 시스템에는 fastcgi1.2perl 설치가 함께 제공됩니다. 일반적으로 Linux에는 Perl이 함께 제공되므로 설치하지 않아도 다음을 실행하세요.

Redis 및 Perl 언어 개발: 효율적인 명령줄 도구 구축 소개: Redis는 C 언어로 작성된 오픈 소스 메모리 내 데이터 저장 시스템으로 고성능과 유연한 기능을 갖추고 있으며 캐싱, 메시지 대기열 및 실제와 같은 시나리오에서 널리 사용됩니다. -시간 분석. Perl은 강력한 텍스트 처리 및 정규식 기능을 갖춘 스크립팅 언어로, 명령줄 도구의 신속한 개발에 이상적입니다. 이 기사에서는 Perl 언어와 Redis를 사용하여 효율적인 명령줄 도구를 구축하는 방법을 소개하고 관련 코드 예제를 제공합니다. 하나

Redis 및 Perl을 사용하여 추천 시스템 기능을 개발하는 방법 추천 시스템은 사용자가 관심을 가질 수 있는 콘텐츠나 제품을 찾는 데 도움이 될 수 있는 최신 인터넷 애플리케이션의 매우 중요한 부분입니다. 이번 글에서는 Redis와 Perl을 활용하여 간단한 추천 시스템 기능을 개발하는 방법을 소개하고 구체적인 코드 예시를 제공하겠습니다. 먼저 Redis와 Perl의 기본 개념을 이해해보자. Redis는 데이터베이스, 캐시, 메시징 미들웨어로 사용할 수 있는 오픈 소스 인메모리 데이터 스토리지 시스템입니다. 그것

시스템 프로그래밍에서 Golang과 Perl 사이에는 다음과 같은 주요 차이점이 있습니다. 동시성: Golang은 동시 언어인 반면 Perl은 동시성을 구현하기 위해 외부 모듈을 사용합니다. 메모리 관리: Golang은 가비지 수집을 사용하고 Perl은 수동 메모리 관리를 사용합니다. 컴파일 및 해석: Golang은 컴파일된 언어이고 Perl은 해석된 언어입니다. 실제 사례: 파일이 존재하는지 확인하고 크기를 반환하는 예제에서 Golang은 간단하고 효율적입니다.

텍스트 번역의 다국어 변환 문제, 특정 코드 예제가 필요함 세계화가 더욱 발전함에 따라 텍스트 번역은 일상 생활과 비즈니스 커뮤니케이션에서 점점 더 중요해지고 있습니다. 텍스트를 번역할 때 다국어 변환 문제에 직면하는 경우가 많습니다. 이 기사에서는 다국어 변환 문제에 대해 논의하고 독자가 이를 더 잘 이해하고 적용할 수 있도록 몇 가지 구체적인 코드 예제를 제공합니다. 다국어 변환 문제는 주로 텍스트를 한 언어에서 다른 언어로 변환하는 것과 관련됩니다. 실제 적용에서는 영어 텍스트를 중국어, 프랑스어, 스페인어로 변환해야 하는 경우가 많습니다.
