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

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Verwenden Sie die Sprachen Vue.js und Perl, um effiziente Webcrawler und Daten-Scraping-Tools zu entwickeln. Mit der rasanten Entwicklung des Internets und der zunehmenden Bedeutung von Daten ist auch die Nachfrage nach Web-Crawlern und Daten-Scraping-Tools gestiegen. In diesem Zusammenhang ist es eine gute Wahl, Vue.js und die Perl-Sprache zu kombinieren, um effiziente Webcrawler und Daten-Scraping-Tools zu entwickeln. In diesem Artikel wird vorgestellt, wie man ein solches Tool mit Vue.js und der Perl-Sprache entwickelt, und es werden entsprechende Codebeispiele beigefügt. 1. Einführung in Vue.js und die Perl-Sprache

Im heutigen digitalen Zeitalter werden Webanwendungen immer häufiger eingesetzt und machen unser Leben komfortabler und effizienter. Python und Perl sind zwei weit verbreitete Programmiersprachen, die sich beide ideal für die Erstellung von Webanwendungen eignen. Um jedoch leistungsstarke Webanwendungen zu erstellen, müssen Sie einige Best Practices beherrschen. In diesem Artikel werden einige Best Practices für die Erstellung leistungsstarker Webanwendungen in Python und Perl vorgestellt. Auswahl des richtigen Web-Frameworks Die Auswahl eines geeigneten Web-Frameworks ist ein entscheidender Schritt beim Entwurf leistungsstarker Webanwendungen.

Verwendung von Vue.js und der Perl-Sprache zur Entwicklung von Systemskripten und Automatisierungstools In der aktuellen Softwareentwicklungsumgebung sind Systemskripte und Automatisierungstools zu wichtigen Tools für Entwickler geworden, um Zeit zu sparen und die Effizienz zu verbessern. In diesem Artikel stellen wir vor, wie man Systemskripte und Automatisierungstools mit Vue.js und der Perl-Sprache entwickelt, und stellen einige Codebeispiele bereit. Vue.js ist ein beliebtes JavaScript-Framework zum Erstellen von Benutzeroberflächen. Es verfolgt einen komponentenbasierten Entwicklungsansatz, der es Entwicklern ermöglicht

Perl + Fastcgi + Nginx erstellen. Wird Perl auch Fastcgi unter Nginx erstellen? Die Popularität des Webprogramms PHP ist unübertroffen, egal wie gut die Leistung ist. Einige kleine Funktionen können jedoch durch die Verwendung von Fastcgi gelöst werden. 1. Bereiten Sie die Softwareumgebung vor : nginxperl: Das System wird mit der Installation von fastcgi1.2perl geliefert. Im Allgemeinen wird Linux mit Perl geliefert, sodass Sie es nicht installieren müssen. Wenn dies nicht der Fall ist, führen Sie bitte Folgendes aus:

Redis- und Perl-Sprachentwicklung: Erstellen effizienter Befehlszeilentools Einführung: Redis ist ein Open-Source-In-Memory-Datenspeichersystem, das in der Sprache C geschrieben ist. Es verfügt über hohe Leistung und flexible Funktionen und wird häufig in Szenarien wie Caching, Nachrichtenwarteschlangen und real verwendet -Zeitanalyse. Perl ist eine Skriptsprache mit leistungsstarken Textverarbeitungs- und regulären Ausdrucksfunktionen und eignet sich daher ideal für die schnelle Entwicklung von Befehlszeilentools. In diesem Artikel wird erläutert, wie Sie mithilfe der Perl-Sprache und Redis effiziente Befehlszeilentools erstellen, und relevante Codebeispiele bereitstellen. eins

So entwickeln Sie mit Redis und Perl eine einfache Schlüsselwertspeicherfunktion. Einführung: Redis ist ein Open-Source-In-Memory-Datenstrukturspeichersystem, mit dem Daten effizient gespeichert und darauf zugegriffen werden kann. Perl ist eine fortschrittliche Skript-Programmiersprache mit Rich-Text-Verarbeitungsfunktionen und praktischer Modulintegration. In diesem Artikel wird erläutert, wie Sie mit Redis und Perl einfache Schlüsselwertspeicherfunktionen entwickeln, und es werden spezifische Codebeispiele bereitgestellt. 1. Installieren Sie Redis- und Perl-Module. Zuerst müssen Sie Red auf dem Server installieren.

So verwenden Sie Redis und Perl zum Entwickeln von Empfehlungssystemfunktionen. Das Empfehlungssystem ist ein sehr wichtiger Bestandteil moderner Internetanwendungen, der Benutzern dabei helfen kann, Inhalte oder Produkte zu entdecken, die für sie von Interesse sein könnten. In diesem Artikel stellen wir vor, wie man mit Redis und Perl eine einfache Empfehlungssystemfunktion entwickelt, und stellen spezifische Codebeispiele bereit. Lassen Sie uns zunächst die Grundkonzepte von Redis und Perl verstehen. Redis ist ein Open-Source-In-Memory-Datenspeichersystem, das als Datenbank, Cache und Messaging-Middleware verwendet werden kann. Es

Mehrsprachige Konvertierungsprobleme bei der Textübersetzung, die spezifische Codebeispiele erfordern. Mit der Weiterentwicklung der Globalisierung ist die Textübersetzung im täglichen Leben und in der Geschäftskommunikation immer wichtiger geworden. Bei der Übersetzung von Texten stehen wir häufig vor dem Problem der Mehrsprachenkonvertierung. In diesem Artikel wird das Problem der mehrsprachigen Konvertierung erörtert und einige spezifische Codebeispiele bereitgestellt, um den Lesern zu helfen, sie besser zu verstehen und anzuwenden. Das Problem der mehrsprachigen Konvertierung besteht hauptsächlich darin, einen Text von einer Sprache in eine andere zu konvertieren. In praktischen Anwendungen müssen wir häufig einen englischen Text ins Chinesische, Französische oder Spanische umwandeln
