マインドマップギャラリー データ構造
データ構造の基本概念の主要な内容と論理構造を整理したデータ構造は、知識の理解と記憶に役立ち、試験の復習に最適です。
2024-03-27 14:56:11 に編集されましたデータ構造
導入
データ構造の基本概念
データ
データ要素、データ項目
例を挙げて要約する
データオブジェクト、データ構造
データ型、抽象データ型
3つの要素
論理構造
線状構造
集める
ツリー構造
グラフ構造(メッシュ構造)
非線形構造
物理構造(ストレージ構造)
順次ストレージ
チェーンストレージ
インデックスストレージ
ハッシュストレージ
非順次ストレージ
データ操作
アルゴリズム
基本的な考え方
アルゴリズムとは何ですか
プログラム = データ構造 + アルゴリズム
データ構造は処理される情報です
アルゴリズムは情報を処理するためのステップです
アルゴリズムの5つの特徴
有限性
限られた時間内で実行可能
アルゴリズムは有限です
プログラムは無限にできる
確実
同じ入力からは同じ出力のみが生成されます
実現可能性
既存の基本演算を使用してアルゴリズムを実装可能
入力
処理のためにアルゴリズムにスローされたデータ
出力
アルゴリズム処理の結果
「良い」アルゴリズムの特徴
正しさ
問題を正しく解決できる
可読性
他の人が理解できるようにアルゴリズムを説明する
堅牢性
アルゴリズムはいくつかの異常な状況に対処できる
高効率でストレージ要件が低い
つまり、アルゴリズムの実行により時間とメモリが節約されます。
時間的複雑性と空間的複雑性が低い
アルゴリズムの効率性の尺度
時間の複雑さ
計算方法
① 基本操作(最深ループ)を求める
② この基本演算の実行回数 x と問題サイズ n x = f (n) の関係を解析します。
③x の大きさ O(x) はアルゴリズムの時間計算量 T(n) です
よく使われるテクニック
加算ルール: O( f( n)) × O( g( n)) = O( max( f( n), g( n)))
乗算ルール: O( f( n)) × O( g( n)) = O( ( f( n) × g( n)))
「常に権力の序列を参照せよ」
3 つのレベルの複雑さ
最悪の場合の時間計算量: 入力データの「最悪の」場合を考慮します。
平均時間計算量: すべての入力データが同様に出現する可能性が高い状況を考慮します。
最適な時間複雑さ: 入力データの「最適なケース」を検討します。
空間の複雑さ
メモリのオーバーヘッド
①ストレージ変数
②再帰呼び出し
計算方法
通常プログラム
①占有スペースと問題のサイズに関連する変数を見つける
②占有空間xと問題サイズn x = f (n)の関係を解析する
③x の大きさのオーダー O(x) はアルゴリズム空間複雑さ S(n)
再帰的プログラム
① 再帰呼び出しの深さ x と問題サイズ n x = f(n) の関係を求める
②x の大きさの O(x) はアルゴリズムの空間複雑さです
注: 一部のアルゴリズムでは、関数の層ごとに異なるストレージ スペースが必要であり、分析方法も若干異なります。
よく使われるテクニック
加算ルール: 同時時間計算量
乗算ルール: 同時時間計算量
「常に権力の序列を参照せよ」
第一章
リニアテーブル
線形テーブルの定義と基本操作
意味
線形テーブルには、同じデータ型の n (n>=0) 個のデータ要素の有限シーケンスがあります。ここで、n はテーブルの長さです (n=0 の場合)。 線形リストは空のリストです。
注文
ビット順序は 1 から始まり、配列の添字は 0 から始まります。
テーブルの長さ、空のテーブル
ヘッダー要素とフッター要素
直接の先行者と直接の後継者
最初の要素を除き、すべての要素には直接の先行要素が 1 つだけあります。 最後の要素を除くすべての要素には、直接の後続要素が 1 つだけあります。
注目すべき機能
データ要素は同じタイプで、制限され、順序付けされています。
基本操作
売上の作成、追加、削除、変更、確認
エンプティ判定、ロング判定、印刷出力(カスタムファンクション機能)
その他の注目すべき点
パラメーター参照「&」を渡すタイミングを理解する
関数の名前は読みやすいものでなければなりません
シーケンステーブル(シーケンシャルストレージ)
定義(ストレージ構造)
論理的に隣接するデータ要素は物理的にも隣接します
実現方法
静的にメモリを割り当てる
「静的配列」実装を使用してストレージの最大数を定義する
一度決定したサイズは変更できません
動的にメモリを割り当てる
「動的配列」を利用し、構造体で定義したデータポインタがmallocにより動的にメモリを確保します(ヒープ領域あり)
L.data=(ElemType *)malloc(sizeof(ElemType)*size)
シーケンス テーブルがいっぱいになった場合、malloc を使用してシーケンス テーブルの最大容量を動的に拡張できます。
データ要素を新しい記憶領域にコピーし、free関数を使用して元の領域を解放する必要があります。
使用されるヘッダー #include <stdlib.h>
特徴
ランダムアクセス
O(1) 時間で i 番目の要素を見つけることができます
高いストレージ密度
容量拡張が不便
データ要素の挿入と削除は不便です
操作機能
入れる
時間計算量: 最高 O(1) 最低 O(n) 平均 O(n)
消去
時間計算量: 最高 O(1) 最低 O(n) 平均 O(n)
コードポイント
コードでは、ビット順序 i と添え字の違いに注意する必要があります。
アルゴリズムは堅牢であり、i の合法性に注意を払う必要があります。
引用符の使用
探す
ビット単位の検索
動的に割り当てられたメモリの場合、時間計算量は O(1) です。
値による検索
静的割り当て時間の複雑さ: 最良 O(1) 最悪 O(n) 平均 O(n)
静的と動的は同じです
リンクされたリスト
ヘッドポインタ
列
1. 配列とリンクリストが使用可能
循環リンクリストと循環配列
先頭ポインタと末尾ポインタ、添字
第2章