データ構造、時間と空間の複雑さ、推奨される学習 Web サイトの簡単な説明

目次

IT学習ルート

関連するタフな本

関連する興味深い/読みやすい書籍またはビデオ

おすすめのデータ構造とアルゴリズム学習サイト

レビュー質問

時間と空間の複雑さ

データ構造の簡単な説明

基本的な考え方


データ構造とアルゴリズムの簡単な紹介と CS のレビュー。この記事は基本的なチュートリアルではありません。この記事では、多数の学習および参考 Web サイトをリストします。昔からの慣習どおり、記事はコレクションです (この記事ではコーディングを高速化するために音声入力 (PC 版の iFlytek 入力方法) を使用していますが、簡潔な執筆スタイルは維持されています)。

データ構造 + アルゴリズム = プログラム。データ構造: コンピュータのストレージと一致する現実の問題のモデリング、アルゴリズム: 現実の問題を解決する手順 (有限性、確実性、実現可能性などと一致する)。


IT学習ルート

  1. C言語の基礎(本やBilibiliなどが読めます)→

  2. C 言語の三銃士: 「C とポインター」「C のトラップと欠陥」「C エキスパート プログラミング」、永遠に残る古典 →

  3. データ構造とアルゴリズム (線形テーブル/ツリー/グラフ/ハッシュ + ソート/検索/プランニングなど、オンデマンドで学習) →

  4. コンピューターサイエンスの分野。「コンピュータ構成の原則」/「コンピュータ アーキテクチャ」、「コンピュータ オペレーティング システム」/「最新のオペレーティング システム」/「コンピュータ システムの詳細な理解」、オプションの「コンパイル原則」および「GCC の詳細な分析」、ネットワーク「コンピュータネットワーク」、「TCP-IP詳解 第1巻/第2巻/第3巻」など →

  5. オプション「CPUカスタマイズ入門」→

  6. ディレクション: 組み込み Linux ディレクション、FPGA/チップ設計/検証ディレクション、特定アルゴリズムディレクション (CV、ML、DL など) など。

詳細については、より包括的なrd2coding/Road2Coding: Road to Programming (github.com)の概要を参照してください。

関連するタフな本

リンクを張らずに名前を検索してください。

  • 「データ構造とアルゴリズム」のどの本が最適ですか? - Zhihu (zhihu.com)この回答には、データ構造とアルゴリズムに関する優れた書籍がリストされています。

  • 『アルゴリズム入門』 (クラシック) は、コンピュータ サイエンス分野におけるアルゴリズムの入門書です。

  • 「コンピュータ アーキテクチャ」(クラシック)、「コンピュータ オペレーティング システム」/「最新のオペレーティング システム」/「コンピュータ システムの深い理解」。

  • 「コーディングの極意」、関連紹介/推奨事項「コーディングの極意」の知識を実践したいのですが、どのようなソフトウェアが役に立ちますか? - 志湖 (zhihu.com)「コンパイル原則」(クラシック)、「GCC の詳細な分析」。

  • 『コンピュータネットワーク』や『TCP-IP詳解 第1巻/第2巻/第3巻』などのネットワークプロトコル HTTPプロトコルについて詳しく知りたい場合におすすめの本は何ですか?- 志湖 (zhihu.com)

  • 組込みアプリケーション関連:「GNU Make」、「GDBによるデバッグ」、「Linux高度なプログラム開発」、「POSIXマルチスレッドプログラミング」、「組込みLinux基礎チュートリアル」、「組込みLinxuアプリケーション開発完全マニュアル」、「詳細解説」組み込み Linux アプリケーション開発。

  • 組み込みボトムレベル関連: カーネル関連: 「Linux カーネルの深い理解」、「Linux カーネル ソース コード シナリオ分析」、「Linux カーネルの設計と実装」; ドライバー関連: 「Linux デバイス ドライバー」、「Linux デバイス ドライバー」開発徹底解説』、『Linuxドライバー開発の入門と実践』。

関連する興味深い/読みやすい書籍またはビデオ


おすすめのデータ構造とアルゴリズム学習サイト

レビュー質問


時間と空間の複雑さ

時間計算量は、最悪の場合、ループ数 n が増加するにつれて、アルゴリズム内で実行されるステートメントの数が増加する程度を表します。アルゴリズム内でステートメントが使用される回数 (頻度) は f(n) で表されます。n はアルゴリズム内のループステートメントのサイクル数であり、n を変更するとアルゴリズム全体で使用されるステートメントの数が直接変化します。 ; 時間計算量は O(g(n)) の定義は、すべての n ≥ n0 に対して f(n) ≤ cg(n) が成り立つような正の整数 c と n0 が存在する場合に限り、アルゴリズムに関して次のようになります。この場合、アルゴリズムの漸近時間計算量は f(n) = O(g(n)) となり、g(n) は n の関数になります。

時間複雑度ごとのステートメント頻度の増加率の比較: O(log_2(n)) < O(n) < O(n*log_2(n)) < O(n^2) < O(n^3) < O(2^n) < O(n!)、最初の 3 つは良好ですが、最後の 2 つは受け入れられず、残りは不十分です。

プログラムの実行時間は問題の大きさだけでなく、データの状態によっても変化する、つまり時間計算量も変化しますので、一般にアルゴリズムを評価する際には最悪の場合の時間計算量が使用されます。

空間の複雑さはほぼ同じです。

データ構造の簡単な説明

ソフトウェア プロジェクトの場合、データ構造が適切に設計されていれば、後で関数を実装するときに呼び出し、変更、クエリを行うのが特に便利になり、半分の労力で 2 倍の結果を達成できます。

基本的な考え方

データ構造のいくつかのカテゴリ

  • 線形テーブル:

    • 順序(配列)、

    • リンク リスト (リンク リスト (単一リンク リスト、二重リンク リスト、循環リンク リスト (一方向、双方向)、静的リンク リスト (配列を使用して実装)))、

    • 特殊 (スタック (FILO)、キュー/ヒープ (FIFO))。

  • 木:二分木、赤黒木など。

  • グラフ: 無向グラフ、有向グラフなど。

  • インデックス/ハッシュ: マップ、ハッシュ テーブル。

関係性に応じて分ける

  • 論理関係(要素の接続関係)によれば、次のようになります。

    コレクション、線形 (配列、スタック、キュー/ヒープ、リンク リストなど)、ツリー (1 対多)、グラフ (多対多)。

  • ストレージ関係によると:

    • シーケンシャル ストレージ: 配列など、事前にスペースを申請する必要があります (静的割り当て (コンパイル時に実行) または動的割り当て (malloc および free))。長所: 物理的な場所は連続的かつコンパクトで、ランダム/直接アクセス可能; 短所: メモリの断片化が発生し、追加、削除、または変更時に変更に従う必要がある (多数の要素を移動する必要がある)。

    • リンクされたストレージ: リンクされたリスト、ツリー、グラフなど、事前にスペースを申請する必要があります (動的割り当て (malloc および free))。長所: 連鎖、離散、ノードベース、スペースを動的に割り当てることができ、変更が簡単 (ノードの方向を変更); 短所: 占有スペースが大きく、検索が不便 (リンクリスト全体を走査する必要がある)。

    • インデックス ストレージ: 「インデックス データ」の構造形式 (キーと値、マップとも呼ばれます)。Java および C++ では「マップ」、Python では「辞書」です。

    • ハッシュストレージ:ハッシュテーブル(Hash Table)など

データ操作

  • 各基本データ構造によって実装される基本操作は、追加 (挿入)、削除 (削除)、変更 (更新)、検査 (検索)、判定 (空、満杯)、ソート (並べ替え)、リセット (リセット) です。

  • 上記の基本操作を使用して、より複雑な操作を実装できます。

操作の時間の複雑さ

具体的な概念については、記事「C および MCU の記述仕様とその他」の「時間と空間の複雑さ」セクションで説明されています。(データ構造) 時間計算量は10分で解ける (アルゴリズムの時間計算量) - Jianshu (jianshu.com)「時間計算量」を理解するための図集_12 26 25のブログ - CSDN Blog_Time Complexity

  • 検索: 順次ストレージ構造の場合は O(1)、単一リンク リストの場合は O(n)。

  • 挿入と削除: 順次ストレージ構造の場合は O(n)、単一リンク リストの場合は O(1)。

おすすめ

転載: blog.csdn.net/Staokgo/article/details/132922442