みなさん、こんにちは!昨日、プログラミング面接の準備をしていて、アルゴリズムの基礎を学ぼうとしている友人とチャットしていました。 2次時間アルゴリズムと線形時間アルゴリズムについて話をしてきましたが、ここでそれについて書くのは楽しいだろうと思いました。なぜなら、2次時間アルゴリズムを避けることは、面接で重要なだけでなく、実生活で知っておくと便利なこともあるからです。「2次時間アルゴリズム」とは何かについては、後で簡単に説明します :)
ここで議論する 3 つの事項は次のとおりです。
数学の専門用語は避け、実際のコード例と、実際にどれくらい速いか遅いかに焦点を当てたいと思います。 目標問題: 2つのリストの共通部分を見つける2 つの数値リストの共通部分を取得するという、簡単なインタビュー形式の問題について説明しましょう。 たとえば、intersect([1,2,3], [2,4,5]) は [2] を返します。 この問題には現実世界への応用もいくつかあります。2 つの ID リストの正確な交差を必要とする実際のプログラムを想像してみてください。 「明白な」解決策:2 つのリストの共通部分を取得するコードを書いてみましょう。以下は、この要件を実装する quadratic.py という名前のプログラムです。
プログラムの名前が quadratic.py なのは、list1 と list2 のサイズが n の場合、内部ループ (x == y の場合) が n^2 回実行されるためです。数学では、x^2 のような関数は「二次」関数と呼ばれます。 quadratic.py はどれくらい遅いですか?このプログラムを異なる長さのリストで実行すると、2つのリストの交差は常に同じになります: [2]。
これまでのところ順調です。プログラムの実行時間は依然として 2 秒未満です。 次に、それぞれ 100,000 要素の 2 つのリストでプログラムを実行しましたが、長い時間待たなければなりませんでした。結果は次のとおりです。
かなり遅いですね。合計で 160 秒かかりました。これは、10,000 要素で実行したときにかかった 1.6 秒のほぼ 100 倍の時間です。したがって、ある時点以降、リストを 10 倍大きくするたびに、プログラムの実行にかかる時間が約 100 倍長くなることがわかります。 このプログラムを 1,000,000 個の要素で実行しようとはしませんでした。100 倍の時間がかかることがわかっていたからです (おそらく 3 時間程度)。こんな時間はないよ! おそらくこれで、2 次時間アルゴリズムがなぜ問題になるのかがお分かりいただけたと思います。この非常に単純なプログラムでさえ、すぐに非常に遅くなる可能性があるのです。 高速バージョン: linear.pyさて、プログラムの簡単なバージョンを書いてみましょう。まずプログラムがどのようなものかを示し、その後分析します。
(これは Python を使用する最も慣用的な方法ではありませんが、Python を知らない人でも理解しやすいように、Python のアイデアをあまり使用せずにコードを書きたかったのです) ここでは、低速バージョンとは異なる 2 つのことを行います。
linear.pyプログラムの速さを見てみましょうこのプログラムがなぜ高速なのかを説明する前に、実際に高速であることを示すために、いくつかの大きなリストでプログラムを実行してみましょう。ここでは、プログラムが 10 から 10,000,000 までのサイズのリストに対して順番に実行されている様子が示されています。 (前のプログラムは 100,000 要素で非常に遅くなり始めたことを思い出してください)
非常に大きなリストで linear.py を実行するこれを非常に大きなリスト (100 億 / 10,000,000,000 要素) で実行しようとすると、別の問題が発生します。十分に高速ですが (リストは 4.2 秒かかったリストの 100 倍しかないため、おそらく 420 秒以内に終了できるはずです)、コンピューターにはリストのすべての要素を格納するのに十分なメモリがないため、終了する前にプログラムがクラッシュします。
ただし、この記事ではメモリ使用量については説明していないため、この問題は無視できます。 では、なぜ linear.py は高速なのでしょうか?ここで、linear.py が高速である理由を説明します。 もう一度コードを見てみましょう:
list1 と list2 はどちらも約 10,000,000 個の一意の要素を持つリストだとします。これは非常に多い数です。 では、なぜこんなに速く実行できるのでしょうか? それはハッシュマップのおかげです!!! ハッシュマップの検索は瞬時に行われます(「一定時間」)プログラムのクイック バージョンの if ステートメントを見てみましょう。
set1 に 1,000 万の要素が含まれている場合、set1 内の y の検索は、set1 に 1,000 の要素が含まれている場合よりも遅くなると思われるかもしれません。しかし、そうではありません。set1 がどれだけ大きくても、必要な時間は基本的に同じです (超高速)。 これは、set1 がハッシュ セットであり、キーのみで値のないハッシュマップ (ハッシュ テーブル) 構造であるためです。 この記事ではハッシュマップ検索がなぜ瞬時に行われるのかについては説明しません。ただし、ハッシュ テーブルとハッシュ関数に関する Vaidehi Joshi の素晴らしい basecs シリーズでは、ハッシュマップ検索がなぜ瞬時に行われるのかについて説明しています。 偶然の二次方程式: 現実世界における二次アルゴリズム!2 次時間アルゴリズムは非常に遅く、私たちが目にする問題は現実世界で実際に遭遇したものです。Nelson Elhage は、Accidentally Quadratic という素晴らしいブログを運営しており、そこには、誤って 2 次時間でコードを実行し、パフォーマンスの問題を引き起こした事例が紹介されています。 二次時間アルゴリズムが突然現れるかもしれない二次時間アルゴリズムの奇妙なところは、1,000 個のような少数の要素で実行すると、それほど悪くないように見えることです。それほど遅くはありません。しかし、1,000,000 個の要素を指定すると、実行に文字通り何時間もかかります。 したがって、特に線形時間アルゴリズムを簡単に記述できる場合 (ハッシュマップを使用するなど) は、誤って二次時間アルゴリズムを使用することを避けるために、これについてさらに学習する価値があると思います。 いつもちょっと魔法のようなハッシュマップを感じさせてくれるハッシュマップは確かに魔法ではありません (ハッシュマップ検索がなぜ瞬時に行われるのかを知ることができます。本当にすごいです!) が、いつも少し魔法のような気分になり、ハッシュマップを使用してプログラムを高速化するたびに幸せな気持ちになります :) |
<<: インテリジェントコンピューティングセンター構築の「サンゴ礁」と「灯台」
>>: Alimama は曲率空間学習フレームワークと連合学習ソリューションをオープンソース化し、共通の進歩のために AI 技術を一般に公開します。
ネイチャーの公式サイトのトップページには、世界に衝撃を与えた最新の考古学的発見が掲載された。 200...
イノベーションは終わりがなく、人工知能(AI) などのテクノロジーが静かに世界を変えています。人工知...
AI 初心者の多くは、次のような同様の疑問を抱いているかもしれません。機械学習と数理統計の本質的な違...
みなさんこんにちは、三元です。前回の記事では、AIを使いこなせない人は本当に将来淘汰されていくのか?...
情報の海の中で、価値ある洞察を見つけることが重要です。最新の情報管理は、高度なテクノロジーと革新的な...
(レポート制作者/執筆者:国金証券、翟偉)レポートの概要産業チェーンと市場空間:中国の自動運転は現...
OpenAIは7月21日、カスタム指示機能のリリースを発表しました。この機能はまずPLUSプランのベ...
モノのインターネットとインダストリー 4.0 の登場以来、マシン ビジョン、人工知能、機械学習、ディ...
言語モデル (LM) は、不快な言葉を生成する可能性がしばしばあり、モデルの展開にも影響を及ぼします...
[[353013]]みなさんこんにちは。今日は職場でのアルゴリズム エンジニアの日常生活、つまりモ...
現在のネットワーク情報技術の急速な発展に伴い、ネットワーク アーキテクチャはますます複雑になっていま...