GitHub スター 15w、すべてのアルゴリズムを Python で実装するにはどうすればよいですか?

Pythonの基礎を学んだ後、さらに進めたい場合はアルゴリズムをやってみましょう!結局のところ、プログラミング言語は単なるツールであり、構造アルゴリズムは魂です。

初心者が Python アルゴリズムを使い始めるにはどうすればよいでしょうか?

インド人の兄弟数名が、さまざまな Python アルゴリズムの初心者ガイドを GitHub 上に作成しました。原理からコードまでわかりやすく解説しています。初心者でも直感的に理解できるよう、一部にアニメーションも搭載しています。

https://github.com/TheAlgorithms/Python

このプロジェクトは主に 2 つの部分で構成されています。1 つはさまざまなアルゴリズムの基本原理の説明で、もう 1 つはさまざまなアルゴリズムのコード実装です。

アルゴリズムコードの実装

アルゴリズムのコード実装について提供される情報も比較的豊富で、アルゴリズムの基本原理の Python コードに加えて、ニューラル ネットワーク、機械学習、数学を含むコード実装もあります。

例えば、ニューラルネットワークの部分では、BPニューラルネットワーク、畳み込みニューラルネットワーク、完全畳み込みニューラルネットワーク、パーセプトロン等が挙げられる。

畳み込みニューラル ネットワークのコード例

コードは Python ファイル形式で GitHub に保存され、必要な学生は自分で保存してダウンロードできます。

https://github.com/TheAlgorithms/Python

アルゴリズム原理

アルゴリズム原理の部分では、主にソートアルゴリズム、検索アルゴリズム、補間アルゴリズム、ジャンプ検索アルゴリズム、クイック選択アルゴリズム、タブ検索アルゴリズム、暗号化アルゴリズムなどを紹介します。

もちろん、テキストの説明に加えて、Wikipedia やアニメーション インタラクティブ Web サイトへのリンクなど、アルゴリズムをより深く理解するのに役立つ対応するリソースへのリンクも提供されます。

たとえば、一部のアルゴリズム セクションでは、アニメーションのインタラクティブ リンクが提供されており、アルゴリズムの動作メカニズムを理解するのに最適です。

インタラクティブ アニメーションのアドレス:

https://www.toptal.com/developers/sorting-algorithms/bubble-sort

ソートアルゴリズム

バブルソート

バブル ソート (シンキング ソートとも呼ばれます) は、比較的単純な並べ替えアルゴリズムです。このアルゴリズムは、ソート対象のリストを走査し、配置規則に準拠しない 2 つの隣接するデータ項目の位置を交換し、交換する必要のあるデータ項目がなくなるまでリストを繰り返し走査することによって実装されます。交換する必要があるデータ項目がない場合、リストはソートされます。

バケットソートアルゴリズム

バケット ソート (いわゆるビン ソート) は、配列を有限数のバケットに分割することで機能する並べ替えアルゴリズムです。各バケットは個別に並べ替えられ、別の並べ替えアルゴリズムを使用したり、並べ替えにバケット 並べ替えを再帰的に使用し続けることができます。

カクテルの種類

カクテル ソートは、ディレクテッド バブル ソート、カクテル スター ソート、スター ソート (選択ソートのバリエーションとも見なされます)、リップル ソート、前後ソート、またはハッピーアワー ソートとも呼ばれ、バブル ソートのバリエーションです。このアルゴリズムとバブル ソートの違いは、ソートがシーケンス内で両方向に実行されることです。

翻訳者注:

カクテル ソートはバブル ソートの少し変形です。違いは、バブル ソートでは下位から上位へ、次に上位から下位へ進むのに対し、バブル ソートではシーケンス内の各要素が下位から上位へのみ比較されることです。バブル ソートは一方向 (低から高) からのみ比較し、ループごとに 1 つのアイテムのみを移動するため、バブル ソートよりもわずかに優れたパフォーマンスが得られます。

シーケンス (2,3,4,5,1) を例にとると、カクテルソーティングではソートを完了するためにそのシーケンスに 1 回アクセスするだけで済みますが、バブルソーティングを使用する場合は 4 回のアクセスが必要です。しかし、乱数列の状態では、カクテル選別やバブル選別の効率は非常に悪い。

挿入ソート

挿入ソートは、シンプルで直感的なソート アルゴリズムです。これは、順序付けられたシーケンスを構築することによって機能し、ソートされていないデータの場合は、ソートされたシーケンスの後ろから前にスキャンして、対応する位置を見つけて挿入します。挿入ソートの実装では、通常、インプレース ソートの余分なスペースがソートに使用されるため、後方から前方へスキャンするプロセスでは、ソートされた要素を徐々に後方に繰り返しシフトして、要素の挿入スペースを確保する必要があります。最新の要素。

マージソート

マージ ソート (マージ ソート、またはマージソート) は、マージ操作で作成される効率的な並べ替えアルゴリズムであり、効率は O(n log n) (big O 表記) です。1945 年にジョン フォン ノイマンによって初めて提案されました。このアルゴリズムは、分割統治の非常に典型的なアプリケーションであり、分割統治の再帰の各層を同時に実行できます。

ヒープ

ヒープは、比較に基づく並べ替えアルゴリズムです。これは、改良された選択ソートと考えることができます。入力をソートされた領域とソートされていない領域に分割し、最大の要素を抽出してソートされた領域に移動することで、ソートされていない領域を繰り返し縮小します。

翻訳者注:

ヒープは、1964 年に J._W._J._Williams によって公開されたヒープ ソートから始まり、彼はこのアルゴリズムのデータ構造としてバイナリ ヒープ ツリーを提案しました。

キュー内では、スケジューラはキュー内の最初のジョブを繰り返し抽出して実行します。実際には、時間が短い一部のタスクは完了までに長時間待機するか、短くはないが重要なジョブも実行する必要があるためです。優先順位。ヒープは、このような問題を解決するために設計されたデータ構造です。

基数ソート

基数ソート (基数ソート) は、非比較整数ソート アルゴリズムであり、その原理は、整数を桁に応じて異なる数値に切り出し、各桁を個別に比較することです。整数は特定の形式の文字列 (名前や日付など) や浮動小数点数も表すことができるため、基数ソートは整数に限定されません。基数ソートの発明は、1887 年のパンチカード集計機 (Tabulation Machine) に関する Herman Hollery の貢献にまで遡ることができます。

選択ソート

選択ソートは、シンプルで直感的なソート アルゴリズムです。以下のように動作します。まず、ソートされていないシーケンス内の最小 (最大) 要素を見つけて、ソートされたシーケンスの先頭に格納します。次に、残りのソートされていない要素から最小 (最大) の要素を検索し、それをソートされたシーケンスの最後に置きます。 。すべての要素がソートされるまで続きます。

シェルソート

ShellSort は、遠く離れた項目を交換できるようにする挿入ソートを一般化したものです。アイデアは、n 番目の要素ごとにソートされたリストが得られることを考慮して、どこからでも開始できるように要素のリストを配置することです。このようなリストは h 順序と呼ばれます。同様に、各要素が個別にソートされた h のギザギザのリストと考えることができます。

トポロジー

トポロジカル ソート、または有向グラフのトポロジカル ソートは、頂点 u から頂点 v までの各有向エッジ uv について、ソートにおいて u が v の前に来るように頂点を線形に並べたものです。たとえば、グラフの頂点は実行されるタスクを表し、エッジはあるタスクを別のタスクの前に実行する必要があるという制約を表すことができます。このアプリケーションでは、トポロジカル ソートは単に有効なタスクのシーケンスです。トポロジカル ソートは、グラフに有向サイクルがない場合、つまり有向非巡回グラフ (DAG) である場合にのみ可能です。すべての DAG には少なくとも 1 つのトポロジカル ソートがあり、線形時間で任意の DAG のトポロジカル ソートを構築するアルゴリズムが知られています。

複素時間折れ線グラフ

ソートアルゴリズムの複雑さの比較(バブルソート、挿入ソート、選択ソート)

比較ソートアルゴリズム:

クイックソートは非常に高速なアルゴリズムですが、実装するのはかなり難しいです。バブル ソートは遅いアルゴリズムですが、実装は簡単です。小さなデータセットを並べ替える場合は、バブル ソートの方が適している可能性があります。

検索アルゴリズム

線形探索

線形検索または逐次検索は、リスト内の目的の値を見つけるために使用される方法です。一致するものが見つかるか、すべての要素が検索されるまで、リストの各要素がターゲット値であるかどうかを順番にチェックします。

配列内に N 個の要素があると仮定すると、探している特定の値が配列内の最初の要素であるため、比較が 1 回だけ必要になるのが最良のケースです。そして最悪のケースは、探している特定の値がこの配列または配列の最後の要素にない場合であり、N 回の比較が必要になります。

二分二分探索

二分検索は、半間隔検索または対数検索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つけるために使用されます。ターゲット値と配列の中央の要素を比較し、等しくない場合はターゲットの半分が削除され、成功するまで残りの半分の検索が継続されます。

補間検索

補間検索は、キーの値によってすでにソートされている配列内のキーを検索するアルゴリズムです。

1957 年に WW Peterson によって初めて説明されました。補間検索は、人々が電話帳で名前 (帳簿のエントリを並べ替えるのに使用されるキー) を検索する方法に似ています。各ステップで、アルゴリズムは、境界のキー値に基づいて、残りの検索スペース内の位置を計算します。検索スペースとキーの値は、通常、項目を見つけるための線形補間によって見つけることができます。

対照的に、バイナリ検索では、推定された位置で見つかったキーと求められたキーの比較に応じて、残りの検索スペースの中央が常に選択され、半分または残りの半分が破棄されます。残りの探索空間は推定位置の前後に絞り込まれる。線形検索では順序を無視して要素を最初から 1 つずつ比較するため、等価性のみが使用されます。

平均内挿検索では、log(log(n)) 比較が行われます (要素が均一に分布している場合)。ここで、n は検索する要素の数です。最悪の場合 (キーの数値が指数関数的に増加する場合など)、O(n) 回の比較が行われる可能性があります。

補間順次検索では、補間を使用して検索対象の項目に近い項目を検索し、次に線形検索を使用して正確な項目を検索します。

ジャンプ検索

ジャンプ検索とは、順序付きリストの検索アルゴリズムを指します。まず、検索キーより大きい項目が見つかるまで、すべての項目の Lkm (K ∈ N、m はブロック サイズ) をチェックします。リスト内の検索キーの正確な位置を見つけるために、サブリスト L[(k-1)m, km] に対して線形検索が実行されます。

m の最適値は √n です。ここで、n はリスト L の長さです。アルゴリズムの両方のステップは最大 √n 項であるため、アルゴリズムは O(√n) 時間で実行されます。これは線形検索よりは優れていますが、二分探索よりは劣ります。後者に対する利点は、バイナリではレコードに n 回ジャンプできるのに対し、ジャンプ検索では 1 回だけジャンプして戻る必要があることです。

このアルゴリズムは、最終的に線形検索を実行する前に、サブリストに対して複数レベルのジャンプ検索を実行することで変更できます。k レベルのジャンプ検索の場合、レベル l での最適なブロック サイズ ml (1 から数えます) は n(k1)/k です。変更されたアルゴリズムは k 回の後方ジャンプを実行し、O(kn1/(k+1)) 時間で実行されます。

クイック選択アルゴリズム

クイックソート (クイックソート) は、順序なしリストから k 番目に小さい要素を見つける選択アルゴリズムです。これは原則としてクイックソートに関連しています。クイックソートと同様にトニー・ホールによって提案されたため、ホール選択アルゴリズムとも呼ばれます。同様に、これは実際のアプリケーションでは効率的なアルゴリズムであり、平均時間計算量は良好ですが、最悪の時間計算量は理想的ではありません。クイック選択とそのバリアントは、実際のアプリケーションで最も一般的に使用される効率的な選択アルゴリズムです。

クイック選択の大まかな考え方はクイックソートと同じで、要素を分割するベンチマークとして要素を選択し、ベンチマークより小さい要素と大きい要素をベンチマークの左右の2つの領域に分割します。 。違いは、クイック選択では両側を再帰的に訪問するのではなく、片側の要素のみを再帰的に入力して検索を継続することです。これにより、平均時間計算量は O(n log n) から O(n) に減少しますが、最悪の場合でも依然として O(n2) です。

タブー検索

タブー検索 (タブー検索、TS、タブー検索とも呼ばれる) は、1986 年頃にコロラド大学教授のフレッド グローバーによって提案された現代のヒューリスティック アルゴリズムです。局所的な最適解から逃れるために使用される検索方法です。 。まず初期解を作成し、これに基づいてアルゴリズムは隣接する解に「移動」します。何度も連続して実行することで、ソリューションの品質を向上させます。

パスワード

シーザー暗号

シーザー暗号は、シーザー暗号、シフト暗号、シーザー コード、またはシーザー シフトとも呼ばれ、最も単純で最もよく知られている暗号化技術の 1 つです。

これは、平文内の各文字をアルファベットの固定数の位置の文字に置き換える置換暗号です。たとえば、3 だけ左にシフトすると、D は A に置き換えられ、E は B になります。

この方法は、もともと私信で使用していたジュリアス・シーザーにちなんで名付けられました。Caesar 暗号によって実行される暗号化ステップは、Vigenère 暗号などのより複雑なスキームの一部としてよく使用され、ROT13 システムでも最新のアプリケーションとして使用されています。すべての 1 文字置換暗号と同様、シーザー暗号は解読されやすく、現代の実践における通信には本質的に安全ではありません。

ヴィジェネール暗号

ヴィジェネール暗号は、キー文字に基づいて一連のインターリーブされたシーザー暗号を使用してアルファベット テキストを暗号化する方法です。複数文字の代替形式です。

ヴィジェネール暗号 この方式は、ジョヴァン・バッティスタ・ベラッソが 1553 年の著書『La cifra del』で初めて提案しました。しかし、この方式は後に 19 世紀にブレーズ・ド・ヴィジュネールで悪用され、現在では「ヴィジュネール暗号」として広く知られています。

この暗号は理解し、実行するのが簡単ですが、3 世紀にわたって暗号を解読するあらゆる試みに抵抗してきたため、le chiffre indé chiffrable (フランス語で「理解できない暗号」の意) と呼ばれています。フリードリヒ・カシスキは、1863 年にヴィジュネール暗号を解読するための一般的な方法を初めて公開しました。

暗号を転置する

転置暗号は、平文の単位 (通常は文字または文字のグループ) が保持する位置を従来の方式に従って移動し、暗号文が平文の配列を構成する暗号化方式です。つまり、ユニットの順序が変わります(平文が並べ替えられます)。

数学的には、2 文字関数を使用して文字の位置を暗号化し、逆関数を復号化に使用します。

RSA (リベスト – シャミア – アドルマン)

RSA 暗号化アルゴリズムは、非対称暗号化アルゴリズムです。RSA は、公開キー暗号化と電子商取引で広く使用されています。RSA は、1977 年に Ronald Rivest、Adi Shamir、Leonard Adleman によって提案されました。当時、3人全員がMITで働いていました。RSA は 3 つの姓の頭文字で構成されています。

1973 年に、GCHQ で働く数学者クリフォード・コックスは内部文書で同等のアルゴリズムを提案しましたが、それは 1997 年まで機密扱いでした。

ROT13

ROT13 (「13 桁回転」、ハイフン ROT-13 が使用される場合もあります) は、文字をアルファベットの後の 13 番目の文字に置き換える単純な文字置換暗号です。ROT13 は、古代ローマで開発されたシーザー暗号の特殊なケースです。

基本的なラテン文字には 26 文字 (2×13) があるため、ROT13 はそれ自体の逆になります。つまり、ROT13 を元に戻すには同じアルゴリズムが必要となるため、エンコードとデコードに同じアクションを使用できます。このアルゴリズムは暗号化セキュリティをほとんど提供しないため、弱い暗号化の典型的な例としてよく引用されます。

おすすめ

転載: blog.csdn.net/qq_41771998/article/details/130217524