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ヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Vue.js と Perl 言語を使用して、効率的な Web クローラーとデータ スクレイピング ツールを開発します。近年、インターネットの急速な発展とデータの重要性の増大に伴い、Web クローラーとデータ スクレイピング ツールの需要も増加しています。この文脈では、Vue.js と Perl 言語を組み合わせて効率的な Web クローラーとデータ スクレイピング ツールを開発することは良い選択です。この記事では、Vue.js と Perl 言語を使用してこのようなツールを開発する方法を紹介し、対応するコード例を添付します。 1. Vue.js と Perl 言語の概要

今日のデジタル時代では、Web アプリケーションがますます一般的になり、私たちの生活がより便利かつ効率的になりました。 Python と Perl は広く使用されている 2 つのプログラミング言語であり、どちらも Web アプリケーションの構築に最適です。ただし、高パフォーマンスの Web アプリケーションを構築するには、いくつかのベスト プラクティスを習得する必要があります。この記事では、Python と Perl で高パフォーマンスの Web アプリケーションを構築するためのいくつかのベスト プラクティスを紹介します。適切な Web フレームワークの選択 適切な Web フレームワークを選択することは、高パフォーマンスの Web アプリケーションを設計する上で重要なステップです。

Vue.js と Perl 言語を使用したシステム スクリプトと自動化ツールの開発 現在のソフトウェア開発環境では、システム スクリプトと自動化ツールは開発者にとって時間を節約し効率を向上させる重要なツールとなっています。この記事では、Vue.js と Perl 言語を使用してシステム スクリプトと自動化ツールを開発する方法を紹介し、いくつかのコード例を示します。 Vue.js は、ユーザー インターフェイスを構築するための人気のある JavaScript フレームワークです。コンポーネントベースの開発アプローチを採用しているため、開発者は次のことを行うことができます。

perl+fastcgi+nginx の構築 nginx+fastcgi は、PHP で最も一般的な環境です。perl にも fastcgi はありますか? もちろん、あります。今日は、nginx で perl 用の fastcgi を構築します。パフォーマンスは、PHP のパフォーマンスに劣りません。 Web プログラム PHP の人気は Perl の比ではありません。いくら性能が良くても無駄です。しかし、細かい機能は Perl の fastcgi を使用することで解決できます。本題に入ります。 1. ソフトウェア環境を準備します。 : nginxperl: システムには fastcgi1.2perl がインストールされています 通常、Linux には perl が付属しているため、インストールする必要はありませんが、インストールされていない場合は、次のコマンドを実行してください。

Redis および Perl 言語開発: 効率的なコマンド ライン ツールの構築 はじめに: Redis は、C 言語で書かれたオープン ソースのインメモリ データ ストレージ システムであり、高いパフォーマンスと柔軟な機能を備えており、キャッシュ、メッセージ キュー、リアル アプリケーションなどのシナリオで広く使用されています。 -時間分析です。 Perl は、強力なテキスト処理機能と正規表現機能を備えたスクリプト言語であり、コマンドライン ツールの迅速な開発に最適です。この記事では、Perl 言語と Redis を使用して効率的なコマンド ライン ツールを構築する方法を紹介し、関連するコード例を示します。 1つ

Redis と Perl を使用してレコメンデーション システム機能を開発する方法 レコメンデーション システムは、最新のインターネット アプリケーションの非常に重要な部分であり、ユーザーが興味のあるコンテンツや製品を発見するのに役立ちます。この記事では、RedisとPerlを使った簡単なレコメンドシステム機能の開発方法と具体的なコード例を紹介します。まず、Redis と Perl の基本概念を理解しましょう。 Redis は、データベース、キャッシュ、メッセージング ミドルウェアとして使用できるオープン ソースのインメモリ データ ストレージ システムです。それ

システム プログラミングにおける Golang と Perl の間には、次のような重要な違いがあります。 同時実行性: Golang は同時実行言語ですが、Perl は外部モジュールを使用して同時実行性を実装します。メモリ管理: Golang はガベージ コレクションを使用し、Perl は手動メモリ管理を使用します。コンパイルと解釈: Golang はコンパイル言語であり、Perl はインタプリタ言語です。実際のケース: Golang は、ファイルが存在するかどうかを確認し、そのサイズを返す例ではシンプルかつ効率的です。

テキスト翻訳における多言語変換の問題、特定のコード例が必要 グローバリゼーションのさらなる発展に伴い、テキスト翻訳は日常生活やビジネスコミュニケーションにおいてますます重要になっています。テキストを翻訳するとき、多言語変換の問題に直面することがよくあります。この記事では、多言語変換の問題について説明し、読者が多言語変換をよりよく理解して適用できるように、いくつかの具体的なコード例を示します。多言語変換の問題には主に、テキストをある言語から別の言語に変換することが含まれます。実際のアプリケーションでは、英語のテキストを中国語、フランス語、スペイン語に変換する必要があることがよくあります。
