間違い探しシリーズ:アルゴリズム・ミステリー:上書きされた秘密のデータ
5分35秒 | アルゴリズム基礎FE
基本情報技術者試験の頻出テーマを解説した動画コンテンツです。
トランスクリプト(字幕テキスト)
はいどうも。さて今日はですね、プログラミングを始めた人なら、誰もが一度はハマるかもしれない、あるあるミステリーを一緒に解き明かしていきたいと思います。 早速見ていきましょうか。 まずはこの一言から。「アキ先輩!データが消滅しました...!」 いやあ焦ってますね。後輩プログラマーのカイくん、どうやら自分の書いたコードが上手く動かなくて大パニックみたいです。一体何が起きちゃったんでしょうか。 カイくんがやろうとしてた事って、実はすっごくシンプルなんですよ。ええと、データをしまっておく箱みたいなものがありますよね。変数っていう。 その変数Aに入っている3っていう数字と、変数Bに入っている5。この二つをただ入れ替えたかった。たったそれだけのはずだったんですけどねえ。 で、これがその結果なんですけど、ちょっと見てくださいよ。入れ替えた後Aはちゃんと5になってますよね。でも、あれ?Bも5になっちゃってる。 本来Bに入るはずだった3は?どこにもない。影も形もないんですよ。まるでマジシャンに消されたみたいにね。 そこに颯爽と現れたのが、先輩プログラマーのアキさんです。彼女はこれを見て一言。「あー、これ典型的な上書き事件ね。」って。 そして僕らにも問いかけるわけです。「このコードのどこがおかしいか分かる?」ってね。 さあ皆さんにも探偵になってもらいましょうか。カイくんが書いたコード、一体どこに問題が隠されてるんでしょうね。ちょっと考えてみてください。 はい、これが問題のコードです。たったの二行。すごくシンプルですよね。 まずA = B。これでAにBの値を入れます。次にB = A。これでBにAの値を入れる。 うーん、一見すると、これでちゃんと入れ替わりそうに見えちゃいますよね。でもここに、見事にはまってしまう罠があるんですよ。 さあ、お待たせしました。謎解きの時間です。何でこのたった二行のコードが、大事なデータを消しちゃったのか。その犯人を今から突き止めますよ。 犯人はこの一行目です。A = B。これが実行された、まさにその瞬間、 元々変数Aの中にいた3は、変数Bから来た5によって、無慈悲にも上書きされてしまったんです。 もうこの時点で、3というデータはプログラムの世界から完全に消え去ってしまったということなんですね。 やー、でも、上書きって言われてもちょっとピンとこないかもしれないですよね。 大丈夫です。これを一発で理解できる、すっごく分かりやすい例え話があるんですよ。それがこの「空のグラス作戦」です。 ちょっと想像してみてください。変数を飲み物が入ったグラスだと思ってください。 グラスAには牛乳が、そしてグラスBにはジュースがなみなみと入っています。さあ、この中身、どうやって入れ替えますか? カイくんが書いたコードって、実はこれをやっちゃってるんですよ。グラスBのジュースをいきなりグラスAの牛乳の中にドバッと注いじゃった。 そしたらどうなります?そう、混ざってしまってもうめちゃくちゃですよね。元の牛乳はもう二度と取り出せません。データが消えた瞬間というのは、まさにこれなんです。 じゃあ、どうすればよかったんでしょう。もうお分かりですよね。 そう、もう一つ、空のグラスがあればいいんですよ。プログラミングの世界で、この空っぽのグラスの役目をしてくれるのが一時変数と呼ばれるものです。よくtempっていう名前が使われますね。 これが正解のやり方です。見ていきましょう。まずグラスAの牛乳を、一時避難場所である空のグラス、tempに移します。 そうするとグラスAが空になりますよね。そこにグラスBのジュースを注ぐ。 最後に、tempに避難させておいた牛乳を、今度は空になったグラスBに戻してあげる。どうです?これで中身を零すことも混ぜることもなく、完璧に入れ替えができました。 さあ、このグラスのイメージを頭に残したまま、もう一度実際のコードを見てみましょう。これが正しくて安全な解決策です。 こうして並べてみると、違いはもう明らかですよね。失敗したコードは二行。正しいコードは三行。 たった一行、このtemp = A。つまりAの値をちょっとどけておくっていう処理があるかないか。たったこれだけでデータを失うっていう最悪の事態を防げるんです。 で、この話。たかが入れ替えでしょって思うかもしれないですけど、とんでもない。これがめちゃくちゃ大事な基本なんです。 例えばデータを順番に並べ替える、ソートアルゴリズムっていうのがあるんですけど、その一番大事な部分でこのテクニックが使われてるんです。 それに実務でも、面接や試験でも本当によく出てきます。何より、自分の書いたプログラムが知らないうちにデータを零しちゃうなんていう悲劇を防ぐための、基本中の基本なんですよ。 というわけで、最後に皆さんに質問です。あなたのコードには大事なデータを守るための三つ目のグラス、ちゃんと用意されてますか? 何かを入れ替えるとき、この一時退避っていう考え方、ぜひ忘れないでくださいね。
このコンテンツは Web society で視聴・学習できます。