目次
データ構造とアルゴリズムの簡単な紹介と CS のレビュー。この記事は基本的なチュートリアルではありません。この記事では、多数の学習および参考 Web サイトをリストします。昔からの慣習どおり、記事はコレクションです (この記事ではコーディングを高速化するために音声入力 (PC 版の iFlytek 入力方法) を使用していますが、簡潔な執筆スタイルは維持されています)。
データ構造 + アルゴリズム = プログラム。データ構造: コンピュータのストレージと一致する現実の問題のモデリング、アルゴリズム: 現実の問題を解決する手順 (有限性、確実性、実現可能性などと一致する)。
IT学習ルート
-
C言語の基礎(本やBilibiliなどが読めます)→
-
C 言語の三銃士: 「C とポインター」「C のトラップと欠陥」「C エキスパート プログラミング」、永遠に残る古典 →
-
データ構造とアルゴリズム (線形テーブル/ツリー/グラフ/ハッシュ + ソート/検索/プランニングなど、オンデマンドで学習) →
-
コンピューターサイエンスの分野。「コンピュータ構成の原則」/「コンピュータ アーキテクチャ」、「コンピュータ オペレーティング システム」/「最新のオペレーティング システム」/「コンピュータ システムの詳細な理解」、オプションの「コンパイル原則」および「GCC の詳細な分析」、ネットワーク「コンピュータネットワーク」、「TCP-IP詳解 第1巻/第2巻/第3巻」など →
-
オプション「CPUカスタマイズ入門」→
-
ディレクション: 組み込み 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ドライバー開発の入門と実践』。
関連する興味深い/読みやすい書籍またはビデオ
-
学習体験の紹介 | Xiaolincoding (xiaolincoding.com)。はじめに | Xiaolincoding (xiaolincoding.com)。
-
入門から習熟まで13万語のC言語ナニーレベルチュートリアル 2021年版_Geek Jiangnanのブログ - CSDNブログ。
-
tangtangcoding/C-CppLearning: C 言語と C++ の学習 (github.com)、多くのコンテンツがあります。
-
グラフィカル システム Xiaolin、メモ: グラフィカル システム (Xiaolin コーディング)_NiXGo のブログ - CSDN ブログ、推奨。
-
イラストネットワークシャオリン、お勧めです。
-
手には、HTTP のイラストが描かれました。HTTP 面接でよくある質問を 30 個の図で示します。
-
TCP/IP チュートリアル | 初心者向けチュートリアル (runoob.com)。HTTP チュートリアル | 初心者チュートリアル (runoob.com)。
-
「組み込み C 言語の自己修養」では、砂から CPU、エディタからコンパイラ、高レベル C 言語からメモリ管理、GNU からマルチタスク プログラミングまでを話します。
-
Guojitang 先生が [データ構造とアルゴリズム C 言語] について講義します (非常に鋭い)_ Bilibili_bilibili はゆっくりと話します。
-
「アルゴリズムの新しい解釈」オープンソース本、なぜ下線を引いたのでしょうか? 、「ああ!」アルゴリズム"。
おすすめのデータ構造とアルゴリズム学習サイト
-
Code Caprice (programmercarl.com)、推奨、ワンストップ、比較的包括的。
-
SummerLife/DataStructure: 浙江大学の「データ構造」コースの学習ノートと演習、および職場での一般的なデータ構造の構成 (github.com) を記録します。
-
アルゴリズムの基礎の紹介 - OI Wiki (oi-wiki.org)。動的プログラミングセクションの紹介 - OI Wiki (oi-wiki.org)。
-
プログラミングのヒント: 15 の最も有用なデータ構造と 15 の最も重要なアルゴリズム_ロボット技術と設計 - ブレッドボード コミュニティ (eet-china.com)。30 の重要なデータ構造とアルゴリズムの完全な紹介 (お気に入りとして保存することをお勧めします) - クラウド コミュニティ - Huawei Cloud (huaweicloud.com)。
レビュー質問
-
私は何千ドルもかけて 200 エピソードのアルゴリズム面接短期集中コースを購入しましたが、今では成功した面接はすべて Bilibili で無料で共有されています。
-
この記事の最後にある付録: 添付ファイル: アルゴリズムに関する質問の概要。
時間と空間の複雑さ
時間計算量は、最悪の場合、ループ数 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)。