挿入
「えぇ……バブル……泡……?何ですって?」
「バブルソート。数あるソート手法の中でも最も単純かつ基礎的であり、効率が悪いソート方法だ。正直現代人がここまで効率の悪い方法でソートするぐらいなら、ソートしない方がましでしょ」
「えぇ……そこまで……?」
シュプリンガーの表情は驚きを含みつつ、同時に呆れ返っているようだ。しかしここは正しいアルゴリズム教育を施すため、心を鬼にせねばなるまい。
「そもそも、アンタがさっきから連呼してるソートって何の事よ」
「要するに並び替える方法だ。ソートには様々なアルゴリズムが存在する」
「アルゴリズム?」
「アルゴリズムというのは問題を解法するための手順を定式化したもので……うーむ、そこから始めないといかんのか……」
何やら訳の分からない説明を始めた私に対して、他のウェイター達は露骨に怪訝な表情を浮かべた。
「何だアイツ、新しいバイトか?」
「確か今日無銭飲食で、皿洗いする事になった奴じゃなかったっけ。それにしても何であんなに偉そうなんだ……?」
どうやらこれは全員に説明する必要がありそうだ。無論テクニカルな単語を一切使わずにだ。
「では段階的を踏んで説明をしよう、私を先生だと思ってくれシュプリンガー女史」
「はーい、先生」
「まずあのバブ……『皿の並べ方』は一体誰が思いついたんだ?」
「えーっと、一昔前はごちゃごちゃの順番のまま棚に仕舞ってたわ。だけど流石に忙しい時皿を取り出すのが不便になって」
「なるほど」
「そこで昔のウェイターの先輩がこの方法を思いついたの。とりあえず小さい皿を左に寄せていくよう入れ替えれば、最終的には全部の皿が綺麗に並び替えられるって」
「うーむ……つまり何故最終的に皿が並べられるのかは分からないが、とりあえずやってみるとうまくいくという気持ちか」
「そうね」
「なるほど」
まぁ大体のアルゴリズムの発端なんてそんなものだろう。
「この方法は私の地元で『バブルソート』と呼ばれていた」
「何でバブル?」
「皿が右に行ったり左に行ったりする様子を、泡が移ろう様子に例えたらしい」
「あらオシャレ」
「しかし効率が悪い」
「そんなに?」
「例えば……あの皿は全部で何枚だ?
「大体1000枚ぐらいじゃなかったかしら」
「よろしい全部で皿が1000枚あったとして、一番右端に最も小さい小人用の皿があったとする」
「ふむ」
「この時、この小人用の皿が本来あるべき左端に移動するまで、全部で何人行列に並ぶ必要があると思う?」
「ええっと、1人が皿を1つ左に移動するから……1000人?」
「その通り。しかし諸君は有限なので、のべ1000人になるまで繰り返し繰り返し並び続けなければいけない」
「ひえぇ……」
「しかも1人につき999回皿の大小比較を行っている事を考えると、全体で見るとで99万9千回も皿の大小比較を行うはめになる」
「ひょえぇ……」
「もちろんこれは最悪のケースだ。とはいえ平均しても25万回近くは『隣同士で並び替える』という単調な作業を、諸君らはあまりにも無駄な回数繰り返し続けていたのだ」
「うーん……」
ウェイター間ではざわめきが広がっていた。気持ちは分かる。今まで正当であるとして利用されてきた方法が否定されて、あまりいい気持ちはしないだろう。
「じゃあ、そこまで言うからには具体的な改善案も用意してるんでしょうね?」
シュプリンガーからやや怒りを含む、挑戦的な物言いが来ることも無論想定済みだ。
「もちろんだ。皿の並び替えにかかる時間は劇的に削減できるだろう」
おおーっ!という感嘆の声がオーディエンスから漏れ出た。
「ただし今までとは少し手順が異なるので、各自で今から言うルールを守って欲しい」
「ルール?」
「あぁ、それじゃあ私が手本を見せる。すまないがあの棚からスタンド込みで皿を全て持ってきてくれないか」
「えーっ……めんどくさ」
「つべこべ言うでない。ソートという主目的を達成するためには皆の協力が必要となるのだ」
私の眼前には棚から取り出された皿がずらりと一列に並んだ。
「数えたら全部で1024枚あったわ」
「なるほど、おあつらえ向きにキリのいい数字だ。素晴らしい」
「キリがいい……何のこと?」
「どうでもいいことだ。さて、まず我々の入力と出力を定義しよう」
「入力と出力?」
「つまりは、我々一人一人がアルゴリズムに従ってプロセスを実行するわけで……」
「プロセス?」
「うーんつまり……機械……そう、我々はオートマタの気持ちになるのだ」
「あぁ!オートマタの事ね。それなら最初からそう言ってくれればいいのに」
先程から単語が通じたり通じなかったりするのは、ニュアンスの違いだろうか。誰か翻訳でも雇いたい気分である。
「それでだ。先程のバブルソートにて、我々オートマタは『全ての皿が左から小さい順に並ぶ』という終了条件を満たすまで、『皿の大小を比較して小さい方を左に配置する』という命令1つをひたすら実行していたわけだ」
「確かにそういうことになるわね」
「このように我々オートマタは何枚かの皿を受け取ってから、皿の順番に何らかの処理をして皿を元に返す。これが今回入出力の基本となるので覚えておいてくれ」
「はーい」
「それではより高速な皿の並べ方、これから『クイックソート』を紹介する」
「へぇ、何か名前からして早そうじゃない」
「まず皿を受け取った人間は次の2つのルールに従う。これを頭に叩き込んでくれ。まずルール1、皿を1枚だけ受け取った場合はそのまま返す」
「へ?なにそれ」
「こう聞くと確かに馬鹿っぽいかもしれないが、後々重要になる非常に大切な規則だ」
「1枚の皿を受けとったらそのまま突っ返せばいいのね?」
「あぁそうだ。では続いてルール2。複数枚の皿を入力として受け取った場合だ」
「こっちが本題ね」
「ルール2は4つの操作で構成されている。まずその1。受け取った複数の皿の中から中央値……つまり大体真ん中の大きさに近い皿を探す」
「小人用とオーク用があったとしたら、一番真ん中に近い人間用の皿を選択するみたいな感じかしら?」
「そういうことになるな。この選択した大体真ん中の皿をピボットと名付ける」
「はいはい、これがぴぼっと」
「で、その2。ピボットより小さい皿を左側の集合に寄せて、ピボットより大きい皿を右側の集合に寄せる」
「えっ、これ全部?」
「そうだ、今回は1023枚に対して適用する。正直私一人ではどうしようもないので、分類を手伝ってくれ」
「はぁ……相変わらず面倒くさい作業が続くわね……」
最初はどうしても時間がかかる。数十分後、皿は2つの集合に分かれた。
「よし、一仕事終わった。3つ目。小さい皿の集合を左側の人間に渡して、大きい皿の集合を右側の人間に渡す。これが新しい入力になるわけだ。ほい、そこの二人組に任せた」
「えっ」
「僕らですか?」
「やることは同じだ。ピボットを設定して、それより小さい集合と大きい集合の2つに分割する。分割し終わったらそれぞれ別の人間に渡す。後はこれを繰り返してくれ」
「へぇ……?」
一同疑問符を浮かべていたものの、時間の経過に伴い段々と私の意図する完成図が見えてきたようだ。段々と左側に寄せられた皿の集合は小さくなり、右側に寄せられた皿の集合は大きくなる。目に見えて無事にソート処理が進んでいる証拠だ。
しかし一回分割する度に皿の集合の数は半分となり、集合の数は1つ増えてしまう。このまま集合の数が増え続けると人手が不足するのは明確だ。そこで私は意図的に、左の小さい集合から深さ優先で分割を進めるよう指示していった。
それにしてもアルゴリズムを進めるに連れ、皿を並べていた従業員達の目が虚ろになっていくのは興味深い。最初に我々がオートマタとなるよう指示したが、人間が徐々に人間性を失っていくのは情報科学に携わる者の宿命なのだろうか。
「えーっと、皿が3枚の時は1枚ピボットにして、左右1枚ずつが集合になるから、それぞれ左右の人間に渡して……あれ?」
「その通り。ここで初めてルール1が適用される」
「あぁ、そうだったわ。なるほど、ここで1枚の時はそのまま戻ってくるのね」
「さぁ、ここからはどんどん戻していくぞ」
「戻す?」
「ここからがルール2のその4だ。受け取った集合を『小さい集合』+ピボット+『大きい集合』の順番に並べて元に返す」
「ぴぼっとを小さい皿達と大きい皿達でサンドするのね」
「その通り。これが出力に当たるわけだな。こうすると部分的には順番通りに皿が並んでいるはずだ」
「あら、本当だ……」
「これを後は全て全部の皿が並ぶまで繰り返す」
「あっ、そうすると、皿を返した先でも順番通りに並んでるのね!」
「その通り」
「これを繰り返せば全体が並び終わった状態で完成する……ってことかしら」
「まさにその通りだ」
終わりが見えてきた作業から希望を見出したのか、従業員の目に光が宿ってきた。
「んー、ちょっと待って」
「何かね」
「これって本当に改善されてるの?何か作業量自体は変わってない気持ちがあるんだけど……」
「実は大幅に減っている。適切にピボットを選択しさえすれば、全体での皿の比較回数は約10000回で済む。さっきの平均25万回と比べれば25分の1だ」
「えっ!25分の1も……?」
「しかもこれはあくまで比較回数の総計だ。並列に皿を比較する事でさらに時間効率がよくなる」
「並列って?」
「例えば2人の人間がそれぞれ100の皿の大小を同時に比較していれば、100枚分皿を比較する時間で累計200枚分の皿を比較できるだろう?」
「あっ、確かに……」
「まず第一段階で(1024-1)回の比較を行う。次の段階では(512-1)回、その次は(256-1)回……よって大体2000回程度の比較時間で済む」
「そんな……さらに5分の1近くにも減るなんて……」
「ただしこれはあくまで完全な並列作業が可能ならば……つまり1024人が並行して作業できる状況だ」
「そんなに従業員はいないわ」
「その通り。ということである程度まで皿の集合が小さくなったら、人力でソートしてしまえばよい。人間もエルフも4枚ぐらいならパッと見で並び替えられる」
「まぁ確かに4枚ぐらいなら……」
「結局はソートされた状態で出力すればいいわけだ。だから細部までクイックソートにこだわる必要はなく、ある程度まで小さくなったら他のソートを用いて一気にソートするのも1つの手だろう」
「よくわかんないわね……」
「ま、とりあえずは目の前の問題に取り掛かろう。どんどんマージ……つまりは皿の集合を上流に戻していくぞ」
「……はーい」
当初不審に満ちていた私に対する周囲の態度は、普段よりも格段に短縮された並び替え時間によってとうとう払拭されたようだ。一列にずらりと、きちんと正確な大きさ順に並んだ純白の皿1024枚は、なかなかの見ごたえがあるものだ。
辺りを見渡すと一仕事終えたからか、あちらこちらで一杯やり始めている。無論本日の功績者である私にも、髭がやたらと濃いバーテンのおっさんからエールを一杯薦められた。一仕事終えた後の一杯は格段と旨い。
「いやはや、しかしすんげぇもんだなぁ!皿並べのやり方を替えちまうだけでこんなに早く終わるなんて!」
「いつもはもっと時間がかかるのか?」
「そりゃもう、就寝の直前までずっとだ。こうやって仕事終わりの一杯を楽しむ時間も、最近は無かったぐらいだもんな」
「それは災難だったな……」
「何せここ最近はシュプちゃんが中心になって毎晩のようにグルグル皿を回してたもんな」
「なるほど……」
バブルソートでもある程度実行すれば、ざっくりとはソートされるはずだ。この状況を鑑みるに、彼女は厳密にソートが完了するまでずっと続けていたのだろう。仕方がないとはいえ可哀想な事だ。
「しかしあのクイックソートってやつかい、あれはまるで魔術みたいだな!」
「いえいえ、アルゴリズムはあくまで人間の生み出した知恵の1つだ」
その一言で思い出すものがあった。昼に受けた治療魔術だ。
「時におっさんよ、私は見識が狭いので1つお伺いしたいのだが」
「おうよ、分かる範囲で聞いてくれ」
「魔術というものではどういった事ができるんだ」
「魔術?そらあれだろ、スーパーとか雑貨屋で回路を買って」
「買って……?」
「炎とか水とか出すやつだろ。困ったことに最近また値上がりして、ウチの家計もすっかり火の車だ」
「値上がり……?」
詳細まで理解には至らないが、こちらはまた後日調べをつければいいだろう。
「ちなみにだ」
「おうよ」
「ここで魔"法"は使われてないのか?」
「マホ……あっ、ひょっとして魔法か!?」
「あぁ、個人的には魔法の方が魔術よりも一般的な単語かと……」
「ぶっ……くく……おい、皆聞いてくれよ!この遠方のお客様『魔法』だってさ!」
一瞬で血の気が引いた。ひょっとして何か不味い事を口走ってしまったのだろうか?
しかし周囲の反応はそんな私を一笑するものだった。
「魔法!ひっさびさに聞いたなその単語!」
「あんな蛮族の余興、よく知っとるな旅のお方!」
「なんだっけか、全裸で逆立ちしながら炎の周囲を一周するんだったっけか?」
「いや、蒸留酒を一気飲みして氷水の浸かったバスタブに浸かるなんてのもあったぞ」
「待て待て、俺の聞いた話じゃ……」
従業員は一気に魔法面白談話で盛り上がり始めてしまった。
「ええっと、つまりな……ご存知かもしれないが、『魔法』ってのは東方の洞窟に隠れ住む蛮族が独自に編み出した、謎の超常現象を発生させる儀式の事を指すわけだ」
「なるほど」
「モノによっては魔術よりも強力な効果が得られる事もあるらしいが、その儀式の方式があまりにも野蛮……おっと、この言い方はまずかった。奇妙奇天烈なもんで色物扱いされてるって訳だ。こっちの地方で使う人間は一部の大道芸人ぐらいのもんだよ」
「うぅむ……そういうものなのか」
「どうも魔術師のお偉いさんの話によると、魔術と違って魔法は学術的体系に則っていないんだとさ。それで何を起因として結果何をしでかすかさっぱり予想がつかないから、よく分からんけども気味が悪い。それでさっさと撲滅すべきだってんで最近躍起になってる」
「ふむ、なるほど」
どうやら私が思い描いている魔法とこちらの地方で認識されているそれには、大きな差があるらしい。ひとまず当面は魔術と魔法を言い間違えないよう、注意が必要なようだ。
「ところでお前さんは旅のお方のようだが、今夜は何処に泊まる予定なんだ?」
「あっ……!そうだ、ここに泊めてもらえるよう相談していたんだ。シュプリンガーの某は何処だ?」
「あぁ、シュプちゃんならあっちだよ。あの子弱いくせして酒好きだから、もう出来上がってやがんな」
冗談じゃない、こちとら今夜の寝泊まりがかかってるのだぞ。私はカウンターの奥で既にへべれけになっているシュプリンガーをひっ捕らえてきた。
「おい、シュプリンガー女史よ」
「んぇ〜?」
「ウッ、だいぶアルコール臭いな……おい、皿の並び替えをしたらここの宿に一泊してもよいという話、忘れていないだろうな?」
「えぇ?そうらっけ?」
「おいおい……それじゃあ私は何処の部屋に泊まればいいんだ……?」
「えーっとね、アタシの部屋しかないよ〜」
「何だって?」
思わず耳を疑う。
「今夜はお客様がいっぱいでね〜アタシの部屋の二段ベッドの上以外、寝床は空いて無いわよ〜」
「そうか、では仕方あるまい。部屋まで案内してくれ」
「えぇ〜?しょうが無いわね〜」
とにかく私は早く布団に潜り込み、一日の疲れを癒やしたくて仕方がないのだ。年頃の男女が1つ同じベットの上下に寝泊まりするぐらいで、細かいことは四の五の言っていられないだろう。
彼女の部屋で寝泊まりする旨をバーテンのおっさんに伝えると、彼ははっと何かを察したような表情を浮かべ、ただ肩を叩いてがんばれよとだけ呟いた。
何か誤解されているようだが仕方あるまい。
足元のおぼつかないシュプリンガーの誘導に従って……道中彼女は2,3回自分の部屋を間違えたりもしたが、何とか目的の部屋まで辿り着くことができた。
中身は乙女の部屋とは思えぬほど質素な造りだ。華やかさもなければフローラル系の香りも特にしない。ベット、本棚、机、クローゼットさえあれば人間生きていけるということだろうか。
気がつくとシュプリンガーの某は既に下の寝床へと倒れ込んでいた。私もとりあえず靴を脱ぎ、角ばった窓から漏れ出す月光だけを頼りに、梯子を昇ってようやく横になる。本来なら寝間着に着替えたいところだが、そこまでの贅沢も言ってられないだろう。部屋には冷房もないため少し暑苦しいが、今はおとなしく快眠に着くとする。
「あのさ……」
「何かね」
「今日やってた皿の並べ方のやつ、あれってアンタが思いついたの?」
「私が?まさか。50年以上も前に発見された方法だ」
正直非常に眠たいが妙に脳だけは冴え渡っているので、口頭で質問に答えてやる。
「へぇ〜……アンタの地元は相当に頭のいい人間が集ってるのねぇ……」
「うーん、地元という程身近な存在でも無いが……」
「あんな利口な方法思いつかれたら、今までのアタシ達のやってきたことってバカみたいじゃない。呑まなきゃやってられないわよ」
「一理ある」
「ところでさ」
「何だね」
「ちょっと疑問に思ったんだけど、あの『皿の並べ方』ってやつは常に上手くいくのかしら?」
「というと?」
「あのルールに従って実際動いてみても、たまには最終的には並び替えられてない……みたいな事があるんじゃないの?」
「……素晴らしい!」
「何が?」
「恐れ入った、素晴らしい着眼点だ。何かしらのアルゴリズム、もしくはソースコードを生成したものの、それが本当に正しく目的通り実行されているのか。そして停止するのか。さらにはどのような入力を与えても安全なのか。これは我々が生涯取り組み続けている非常に重要な問題だ」
「はぁ……さいですか……」
明らかにそこまで意図は無かったような声が漏れ出ているが、その疑問にまで到れる彼女の理解力の早さにはやはり目を見張るものがある。
「そこで正しく動作するための数学的根拠を提示するためのツール、それこそがまさに『証明』なのだ」
「ショウメイ……確かアンタが昼に言ってたやつね……」
「そうだ。とりあえず紙とペンだけでもクイックソートの停止性程度なら示せるのだが……今からご覧に入れよう」
「え、めんどいからやだ」
「そう……」
せっかくのやる気をそがれたからだろうか、急激に睡魔が訪れた。
そういえば実のところ、私は今朝記憶喪失になってだな……などという身の上話を始めようかと思っていた口からは、既に寝息が漏れ始め得ていた。
それから4,5時間経過したところで限界が訪れた。
ただでさえ蒸し暑い熱帯夜を過ごした後に、朝も早くから陽光が顔面に照りつけられれば、冴えたくない目が冴えてしまうのも至極当然だろう。
確かにこの暑さはいかんともし難いが、百歩譲ってそれは我慢できる。
だがこの寝苦しさに伴い、ボトボトと零れ落ちる汗にはもう我慢ならんかった。
「風呂場を借りるぞ」
「んごごごぉおお……」
眠りに着くシュプリンガーの某は、ぶかぶかのシャツにパンツ一丁という堂々とした出で立ちだ。大股を開きながらへそを出し、器用にもヘソの周辺を爪でかきながら同時にいびきをかいていた。
私もつい見入ってしまう。それはうら若き乙女の美貌に見とれて云々という話でもなく、もはやドン引きすらも通り越して、年頃の女性がここまでおっさん臭い睡眠をとれるものかという純粋な驚きによるものだった。
私は彼女を起こさぬよう、そっと無言で風呂場へと向かった。
風呂場はいわゆるビジネスホテルにありがちなユニットバス形式だ。左手には風呂場、右手には洋式便器の姿がある。
とりあえず私は全裸になり、脱いだ衣服は便器の蓋の上に乗せておいた。
が、本来ならば所定位置にあるはずのカランが見当たらない。代わりと言ってはなんだが、眼前には赤、青、黄という3つのボタンが見当たった。
まさか爆発などしないだろうか……?
早速赤を押してみる、が何もおきない。青も押してみた、が何もおきない。
最後の黄色を押すと、待ってましたと言わんばかりにボタンが青白く怪しげに光り、頭上の穴からからバケツをひっくり返したかのような水が叩き落ちてきた。
あまりにも勢いはよいが、この汗を洗い流す用途に限って言えば丁度いい。しかしこのシャワー、水しか出てこないのだろうか。
ひょっとしてと思いたち赤いボタンを押すと、それはまたしても青白く光り、段々と流水が温かみを帯びてきた。
となると青いボタンは湯温を下げるためのものだろう。うーむ、なるほどなるほど……。
次の瞬間、私はこのシャワーのあまりの使いづらさに絶望し、頭を抱えて壁に打ち付けていた。
何故赤青黄という初心者に全くもって分かりづらいボタンの配色をしているのだろうか。そして何故程よい湯温を保つため、私は赤と青のボタンを交互に押さなければいけないのだろうか。
何て酷いBAD UIだ……いや、ひょっとするとそもそもこの地方には、ユーザーインターフェースという概念すら導入されていないのではないだろうか……。
とは言えどんなにシャワーが糞だろうと、得られる爽快感に変化がないのはありがたい。ひとしきり熱湯と冷水を交互に浴びた後、備え付けられた厚手のタオルで全身の水滴を念入りに拭き落とした。
その時だ。
タオルで拭きながらふと自身の肉体上に、明確な変化が3つ現れている事に気づいた。
1つは昨日後頭部を打った時に盛り上がったコブだ。止血されまだ押すと少し痛みがあるものの、これは数日で治るだろう。何故頭を打ったのか直接的な原因はわからないものの、この怪我については心当たりがある。そしてどうやらこいつのせいで、私は記憶喪失になったらしい。
だがもう1つ。右足の裏に刻まれていたスタンプについては、完全に覚えがなかった。何かしらの文字列が油性のインクで書かれており、強くこすっても落ちない。表面に凸凹があることから、入れ墨の要領で少し肌を傷つけてからインクを流し込まれたようだ。痛みはない。これは私が記憶を失う前に書き込まれたものと見てよいだろう。後々何か重要な手がかりになるかもしれない。
そして最後にもう1つ。これは正直あまり気づきたくない、認めがたい事実ではあったが、現に違和感として実存しているのだから致し方あるまい。
臀部への違和感だ。
有り体に申し上げればケツへの挿入感である。何かだ。何かが私の大事な部分に埋め込まれている。考えうる限り自分からそういった事に及んだ記憶は全く無いが、実は寝ている間にシュプリンガーの手によって差し込まれたという可能性も……いや、そこまで大胆な行動に移されれば流石に目覚めるはずだ。
となれば記憶を失う前から仕込まれていた、と考えるのが妥当だろう。では一体何故か。考えられる可能性としては以下の通り列挙される。
(1)実は私は運び屋で、税関をくぐり抜けるため怪しいブツを誰にも見られない方法で運搬していた。
(2)該当部位が何らかの原因で裂傷し、ガーゼや包帯などが詰め込まれている。
(3)実はそういった趣味があり……
いや、最後はなかったことにしよう。ないことにしてほしい。
ともかくだ。ほんの少し力めばその何かは正体を晒すので、不毛な疑念は解消される。気味が悪いので直ちに確認するとしよう。
私は覚悟の表情を持って便器に腰掛けた。
「うっ、うわぁあああああああっ!!!」
「ぎゃぁああああああああああっ!!!」
私の絶叫に対して即座にシュプリンガーが目覚めレスポンスを返した。
「何?何があったの!?」
「しゅ、シュプリンガー女史よ。私は……私は……」
「どしたのよ、アンタ裸一貫で……って、服着なさいよ!」
やかましい、こちとらベタな逆ラブコメ展開なんぞにかまっている暇はないのだ。
「私は……私は許されざる罪を犯した……いや、犯していたのだ……」
「下着だけでもいいから早く!」
「まさか金属製の電子機器が中からなんて……そんな……」
「分かった、そのタオル使っていいから大事な部分だけでも隠して頂戴!」
「本当に私は……私は出口を入口にしていたのか……?」
「知らないわよこの変態野郎!」
結局正体は不明だったものの、私はそれをよく洗ってから乾かし、風呂場の戸棚の奥に隠した。
アップがだいぶ遅くなりました。大まかな骨組みもできてきたのであとは続けるのみです。