みなさん、こんにちは!昨日、プログラミング面接の準備をしていて、アルゴリズムの基礎を学ぼうとしている友人とチャットしていました。 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 技術を一般に公開します。
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
開発者は人工知能に関するオープンソース プロジェクトを数多く目にしてきたと思いますし、Github ...
[[335658]]現在、数十のスタートアップ企業や大手テクノロジー企業が、ホテル、小売店、さらには...
大規模言語モデル (LLM) の開発と応用により、人工知能の分野で LLM ベースの自律エージェント...
7月19日、Metaはついに無料の商用版Llama 2をリリースし、オープンソースの大規模モデルの...
まとめこの記事では主に、プロンプトを最適化することで ChatGPT の使用を改善する方法について説...
2002年から2012年までの石炭の「黄金の10年」を経験した後、「古い工業基地」である山西省太原市...
傘が吹き飛ばされるほど風が強いときでも、ドローンは次のように安定した状態を保ちます。風に乗ることは、...
2006 年 12 月、国際的に有名な学術組織である IEEE 国際データマイニング会議 (ICD...
私たちが知っている食品の消費とレストラン体験の変革は、1921 年にカンザス州ウィチタでアメリカ初の...
具現化された知能は、ビッグモデルの将来の応用にとって重要な方向性です。現在、大規模なモデルでサポート...
制作:51CTO テクノロジースタック(WeChat ID:blog)深夜、OpenAI の最大のラ...
著者 | 崔昊レビュー | Chonglou一般的なモデルは優れていますが、技術者は、独自の大規模な...
人間の言語を習得することはコンピューターにとって依然として課題だが、グーグルのエンジニアは人工知能(...
要点: 1. 自動車会社が独自の自動運転システムを開発することがトレンドとなっている。 2. MBD...