F# List と Seq を使用して、2 つの並べ替えられたリスト/シーケンスをマージしました。値は、セカンダリ メモリから 2 つのファイルを読み取ることによって取得されます。ファイル読み取りの結果は、2 つのシーケンスで格納されます。テスト目的で整数が保存されていると仮定すると、これらをマージして、次のコードを使用して並べ替えられたシリーズを出力しようとしています。
let rec printSortedSeq l1 l2 =
match ( l1, l2) with
| l1,l2 when Seq.isEmpty l1 && Seq.isEmpty l2 -> printfn "";
| l1, l2 when Seq.isEmpty l1 -> printf "%d " (Seq.head l2); printSortedSeq l1 (Seq.skip 1 l2);
| l1, l2 when Seq.isEmpty l2-> printf "%d " (Seq.head l1); printSortedSeq (Seq.skip 1 l1) [];
| l1,l2 -> if Seq.head l1 = Seq.head l2 then printf "%d " (Seq.head l1); printSortedSeq (Seq.skip 1 l1) (Seq.skip 1 l2);
elif Seq.head l1 < Seq.head l2 then printf "%d " (Seq.head l1); printSortedSeq (Seq.skip 1 l1) (Seq.skip 1 l2);
else printf "%d " (Seq.head l2); printSortedSeq (Seq.skip 1 l1) (Seq.skip 1 l2);
このコードはもともと、2 つのソート済みリストをマージするために作成されました。
let rec printSortedList l1 l2 =
match ( l1, l2) with
| h1 :: t1 , h2 :: t2 -> if h1 = h2 then printf "%d " h1; printSortedList t1 t2;
elif h1 < h2 then printf "%d " h1; printSortedList t1 l2;
else printf "%d " h2; printSortedList l1 t2;
| [] , h2 :: t2 -> printf "%d " h2; printSortedList [] t2;
| h1 :: t1, [] -> printf "%d " h1; printSortedList t1 [];
| [], [] -> printfn"";
それらを使用した場合のパフォーマンスは、リストに比べて非常に優れていました。#time;; を実行した後、タイミングの結果を示しています。いくつかの試行入力に関する FSI で。
let x = [0..2..500];
let y = [1..2..100];
let a = {0..2..500}
let b = {1..2..100}
printSortedList xy;; 実数: 00:00:00.012、CPU: 00:00:00.015
printSortedSeq ab;; 実数: 00:00:00.504、CPU: 00:00:00.515
問題は、シーケンスを使用して物事を高速化する方法はありますか? リストははるかに高速ですが、入力を提供するファイルが非常に大きい (> 2 GB) ため、メインメモリに収まらないため、ファイルから値を遅延シーケンスとして読み取っています。マージする前にそれらをリストに変換すると、目的全体が無効になります。