基礎知識
データ構造とアルゴリズムを学びます。基本的な知識が必要です。
1.アルゴリズムとは
algorithm
「アルゴリズム」(英語)という言葉は中国語で広範で深遠であり、会計の方法を意味し、戦略的計画を意味することもあります。コンピュータ技術でそれはどういう意味ですか?
名前が示すように、コンピュータはコンピューティングに使用されるマシンです。コンピュータサイエンスのアルゴリズムは次のように説明できます。コンピュータは入力命令を受け取り、プロセスを実行し、最後に計算結果を出力します。
この入力プロセスの処理出力は、人間の行動パターンを使用すると簡単に理解できます。たとえば、母がXiaomingに醤油を再生するように依頼しました。醤油を再生するコマンドが入力されました。Xiaomingは、販売されている醤油を販売しているコミュニティの周りに5つのショップがあることを発見しました。Juanjuanスーパーマーケットは自宅に最も近く、Zilongの食料品店は最も遠くにありますが、醤油は非常に安いです。お金を節約するために、Xiao Mingは一番遠いZilongの食料品店に醤油を買いに行った後、スムーズに家に戻り、母親にそれを渡しました。醤油を購入する過程が加工で、お母さん用の醤油が出ます。
Xiaomingが最寄りのJuanjuanスーパーマーケットに行って、最も遠いZilong食料品店に行かなかったのはなぜですか?これはXiaomingの頭を考えた後に出てくる最高の計画です。もちろん、テイクアウトソフトウェアを介して醤油を購入できるようになりました。XiaomingはMeituanテイクアウトソフトウェアを開いて、キーワード「醤油」を検索し、クリックしてフィルターします。自宅から最も近くて安い醤油を選択し、最も安い醤油を選択して注文します。
醤油を購入するプロセス= Meituanテイクアウトソフトウェアを注文するプロセス。
数千年の人類の進化の中で、彼らは数値演算を実行し、自分の興味をトレードオフすることができ、それから彼らは機械を作り、自分の行動パターンを機械に与え、そして自分自身を解放します。人間が人間の脳ニューロンの情報伝達プロセスを本当に理解していれば、自意識のある機械を作成することさえできますが、このようなシーンはまだSF映画でしか見ることができません。
したがって、この論理プロセスまたは動作パターンは、コンピューターのアルゴリズムにマップされます。
より正確な説明:アルゴリズムは、有限,确定,有效
コンピュータープログラムで実装するのに適した方法であり、問題の解決に使用されます。まず問題があり、それを解決する方法があり、これをアルゴリズムと呼びます。
アルゴリズムが限られている、すなわち、アルゴリズムのステップが限られ、実行時間が制限されており、限られた時間で結果を得ることができる。アルゴリズムが決定されます。つまり、アルゴリズムが何回実行されても、計算結果は同じです。アルゴリズムは効果的です。つまり、計算結果は問題の解決に役立ちます。
しかし、アルゴリズムの定義は常に更新されており、機械学習の出現により、機械学習アルゴリズムのステップは無限であり、大規模で大規模なデータに基づいて常に計算できます。トレーニングのしきい値を増やすと、トレーニング中に取得されたパラメーターが設定されたしきい値を超えてすぐに計算を停止しますが、上記の定義も満たしています。
人間が作った機械は強度が低いため、アルゴリズムは限られた時間で完了する必要があり、人間の負担になります。なんで?アルゴリズムのステップが制限されている場合でも、実行時間が特に長くなる可能性があるためです。
ヒンドゥー教の神聖な場所であるベナレス神殿の下にある本「From One to Infinity」の3本の宝石針と同じように、ヒンドゥー教の神フェンティアンは、最初の宝石針の64個の金片を2番目の宝石針に通すことができると言いました3番目のルートには、有名なハノイのアルゴリズムである、燃えている塔、寺院、そしてバラモンが灰に還元されます。
ハノイの塔の問題は次のように説明できます。
極は3つあり(番号はA、B、C
)、A
下から上に向かって64
金のプレートが下から上に順に配置されます(下図を参照)。ゲームの目標:ポールのA
すべての金のプレートC
をポールに移動し、元の順序を折りたたみます。
操作ルール:一度に移動できるプレートは1つだけで、3つのプレートは常に大きなプレートを下に、小さなプレートを上に保ち、プレートは操作中にA、B、C
任意のバーに配置できます。
私たちは自然にアルゴリズムについて考えます:
- まず、
C
ロッドを使用して、ロッドのA
前N-1
にあるプレートをロッドに移動し、B
次にロッドA
の残りのプレートを直接C
ロッドに移動します。これはA
空です。 - 次に、
A
ロッドの助けを借りて、ロッドB
のN-1
プレートをロッドに移動しC
、タスクが完了します。
非常にシンプルなアイデア、私たちはプログラミング言語を使用して以下を実現します
package main
import "fmt"
var total = 0
// 汉诺塔
// 一开始A杆上有N个盘子,B和C杆都没有盘子。
func main() {
n := 4 // 64 个盘子
a := "a" // 杆子A
b := "b" // 杆子B
c := "c" // 杆子C
tower(n, a, b, c)
// 当 n=1 时,移动次数为 1
// 当 n=2 时,移动次数为 3
// 当 n=3 时,移动次数为 7
// 当 n=4 时,移动次数为 15
fmt.Println(total)
}
// 表示将N个盘子,从 a 杆,借助 b 杆移到 c 杆
func tower(n int, a, b, c string) {
if n == 1 {
total = total + 1
fmt.Println(a, "->", c)
return
}
tower(n-1, a, c, b)
total = total + 1
fmt.Println(a, "->", c)
tower(n-1, b, a, c)
}
帰納法によりTotal(N)
、動きの数の関係は、Total(N)=2*Total(N-1)+1
追加のプレートごとに、動きの数が2倍になり、1ずつ増えることを知ることができます。関連する系列の数学的方法によって知ることができます。Total(N)=2^N-1
つまり、動きの数は指数方程式であり、2的N次方
インデックスはプレートに等しいです。数量。
2^64-1=18446744073709551615
人が1秒間に1度、昼も夜も動くことを知ることができると計算すると、18446744073709551615/3600/24/365/100000000=5849
この問題が完了するまでに5,849億年かかることになります。
コンピュータサイエンスでは、すべてのアルゴリズムが人間が定義したルールであるため、ルールは無効になっています。学習しないことを心配する必要はありません。これらのアルゴリズムを学ぶと、すごい、すべてがとても簡単だと感じるでしょう。
第二に、データ構造は何ですか
データ構造は、名前が示すように、データを格納する構造であり、データを格納するコンテナと見なすこともできます。たとえば、1000の数値の最大値を求めたい場合、最初にいくつかのカードに1000の数値を記録し、次にカードを並べ替える必要があります。
ほとんどのアルゴリズムはデータを整理する必要があるため、データ構造が生成されます。コンピュータのデータ構造は、主にさまざまなアルゴリズムの基礎を実現するために使用されますが、データ構造自体もアルゴリズムの一部です。
基本的なデータ構造は、リンクリスト、スタックとキュー、ツリーとグラフです。
リンクリストは、データをリンクして相互に関連付けることです。データノードは、本質的に鉄の鎖のような別のデータノードを指します。ほとんどのデータ構造は、リンクリストのいくつかのバリアントによって表されます。
各プログラミング言語では、配列は基本的なデータ型として提供され、配列は連続したメモリ記憶領域であり、配列の指定された位置のデータは、添え字0、1、および2を介してすばやく取得できます。リンクリストは配列を使用して実装することもできますが、一般に配列は連続的であるため、リンクリストがノードを追加および削除するときに冗長性が発生しやすく、効果はよくありません。リストのような異なるプログラミング言語で実装されているように:
C、C++
達成するためのポインタ、Java
それは、クラスによって実装され、Golang
構造を参照して達成されます。スタックとキューは主に複数のデータを格納するために使用されますが、1つは先入れ先出しです。たとえば、スタックをプッシュダウンすると、スタックに最初に置かれたデータが最後に出てきます。私たちがよく知っているキューの場合、最初にキューに入れられた人が間違いなく最初にサービスを取得します。
2つ目は、ツリーとグラフです。ツリーには、データを格納するルートノードがあります。その下には多くの子ノードがあり、データも格納されます。ツリーと同じ性質です。マップは、実際のマップと比較できます。複数のポイントは複数のポイントをポイントし、ポイント間に1つ以上のエッジがあります。これらのポイントはデータを格納し、エッジは距離などのデータも格納できます。
これらのタイプのデータ構造にはいくつかの拡張機能があり、さらに高度な高度なデータ構造を形成するためのソートおよび検索ロジックもいくつかあります。
データ構造は、アルゴリズムの実装を支援するものであり、データの構造をより効率的に編成するため、データ構造とアルゴリズムは実際には密接に関連しており、明確に分ける必要はありません。データ構造をアルゴリズムと同一視することができます。
第三に、優れたデータ構造と優れたアルゴリズムとは
アルゴリズムを学習する理由は、優れたアルゴリズムはリソースを節約できるが、適切なアルゴリズムを選択することが難しいためです。何が良いのかを知るためには、複雑な数学的分析を行う必要があり、コンピューターでは、この数学的分析アルゴリズム分析と呼んでいます。
優れたデータ構造と優れたアルゴリズムとは何ですか?
计算机资源是有限
はい、そのため、より少ないコンピュータリソースを消費するデータ構造とアルゴリズムが優れています。人的生命是有限的
はい、待機時間は許容範囲内であるため、プログラムが作業を完了するのを支援できるデータ構造とアルゴリズムが高速であればあるほど、優れています。
したがって、理論があります。時間と空間のアルゴリズムの複雑さの理論です。
プログラムの実行中、時間のスペース、または時間のスペースのいずれか、スペースは、メモリ使用量などのコンピュータリソースと見なすことができます。時間は人間の知覚の4番目の次元であり、遅いか速いかに関係なく、2つは一般に両方を持つことができません両方がある場合は、より優れたアルゴリズムを発明することです。
コンピュータサイエンスの開発の40年または50年の間に、リソースを節約し、時間を節約するような発明は、データ圧縮アルゴリズムなどのように比較的少数です。オンラインでビデオを見るときに発明された超効率的なロスレスデータ圧縮アルゴリズムのため、どちらもゆがみではなく、速くて良い歪み。これはアルゴリズムと呼ばれます。
現在、量子コンピューティングと呼ばれる新しいタイプの計算方法があり、非常に小さなスペースで非常に大量のデータを計算でき、短時間で非常に少ないリソースを使用できます。大量生産が成功する日を楽しみにしてみましょう。 、人間の生産性は大幅に解放されます。
4.まとめ
一般に、プログラミングは多くの人によって考慮されています=データ構造+アルゴリズム。
データ構造とアルゴリズムを学び、より高速でより良いコードを記述して、効率を高めます。
調査を行ったため、ゼロから設計する必要がなく、作業効率が向上します。
私たちは各データ構造とアルゴリズムの複雑さと適用可能なシナリオを知っており、組み合わせを自由に選択できるため、私たちが作成するコードはより高速になり、必要なリソースが少なくなります。
したがって、一般的なデータ構造とアルゴリズムを研究して理解する必要があります。
残りの章へようこそ。
シリーズ記事エントリー
私は、スター陳思い、私が個人的に書かれているようこそ(Golangが達成)のデータ構造とアルゴリズムの記事で始まる、より親しみやすいGitBookを読むために。
- データ構造とアルゴリズム(Golang実装)(1)Golang-Prefaceの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(2)Golangパッケージ、変数、関数の簡単な紹介
- データ構造とアルゴリズム(Golang実装)(3)Golangフロー制御ステートメントの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(4)Golang構造とメソッドの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(5)Golangインターフェースの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(6)Golang並行性、コルーチン、チャネルの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(7)Golang標準ライブラリの簡単な紹介
- データ構造とアルゴリズム(Golang実装)(8.1)基本的な知識-序文
- データ構造とアルゴリズム(Golang実装)(8.2)基本的な知識-分割と征服と再帰
- データ構造とアルゴリズム(Golang実装)(9)基本的な知識アルゴリズムの複雑さとプログレッシブシンボル
- データ構造とアルゴリズム(Golang実装)(10)基本知識-アルゴリズムの複雑さの主な方法
- データ構造とアルゴリズム(Golang実装)(11)一般的なデータ構造-序文
- データ構造とアルゴリズム(Golang実装)(12)一般的なデータ構造にリンクされたリスト
- データ構造とアルゴリズム(Golang実装)(13)一般的なデータ構造-可変長配列
- データ構造とアルゴリズム(Golang実装)(14)一般的なデータ構造-スタックとキュー
- データ構造とアルゴリズム(Golang実装)(15)一般的なデータ構造-リスト
- データ構造とアルゴリズム(Golang実装)(16)一般的なデータ構造-辞書
- データ構造とアルゴリズム(Golang実装)(17)一般的なデータ構造ツリー
- データ構造とアルゴリズム(Golang実装)(18)ソートアルゴリズム-序文
- データ構造とアルゴリズム(Golang実装)(19)ソートアルゴリズム-バブルソート
- データ構造とアルゴリズム(Golang実装)(20)ソートアルゴリズム選択ソート
- データ構造とアルゴリズム(Golang実装)(21)ソートアルゴリズム挿入ソート
- データ構造とアルゴリズム(Golang実装)(22)ソートアルゴリズム-ヒルソート
- データ構造とアルゴリズム(Golang実装)(23)ソートアルゴリズム-マージソート
- データ構造とアルゴリズム(Golang実装)(24)ソートアルゴリズム-優先度キューとヒープソート
- データ構造とアルゴリズム(Golang実装)(25)ソートアルゴリズム-迅速なソート
- データ構造とアルゴリズム(Golang実装)(26)ルックアップアルゴリズム-ハッシュテーブル
- データ構造とアルゴリズム(Golang実装)(27)検索アルゴリズム-バイナリ検索ツリー
- データ構造とアルゴリズム(Golang実装)(28)検索アルゴリズム-AVLツリー
- データ構造とアルゴリズム(Golang実装)(29)検索アルゴリズム-2-3ツリーと左寄りの赤黒ツリー
- データ構造とアルゴリズム(Golangによって実装)(30)検索アルゴリズム-2-3-4ツリーと通常の赤黒ツリー