楽しいPythonプログラミング(4.データ構造とアルゴリズム入門)

データ構造とアルゴリズムはプログラミングにおいて非常に重要です。データ構造はデータを整理して保存する方法であり、アルゴリズムは問題を解決するための方法と手順です。あなたが挑戦したいブルーブリッジカップは、実際に問題を解決するためのアルゴリズムを設計することです。実は、さまざまなプログラミング言語は単なるツールであり、プログラムの核となるのはデータ構造+アルゴリズムです。武道の練習と同じように、データ構造やアルゴリズムは内部スキルであり、さまざまなプログラミング言語はまさに剣、銃、棒に過ぎず、ニーズに応じてさまざまな状況に便利な武器を選択してください。

序文

さまざまな Python の本を読んでみましたが、それらは純粋に知識ポイントを教え込むものであるか、子供向けの絵やゲームのタスクが多すぎて、プログラミングを体系化するには知識ポイントがあまりにも些細なものであることがわかりました。 (その方法が悪いというわけではなく、効果が限定的で、それを実感するには何年もかかるかもしれないというだけです)。これは、この一連のチュートリアルがこれまでのところコード行を開始していない理由でもあります。最初に知識の背景を導入することによってのみ、その後の学習をより効果的にすることができます。

生徒たちに質問する習慣を奨励します。明代の教育者朱熹は、「学び、疑いを知ることが大切である。小さな疑いは小さな進歩につながり、大きな疑いは大きな進歩につながる。」と述べています。学習の過程において、疑問や混乱があるのは正常であり、必要なことですらあります。劣等感を感じたり、批判を恐れたりする必要はありません。なぜなら、特定の知識点について疑問がある場合にのみ、徹底的に調査して答えを見つけ、それを真に理解して習得できるからです。 「読書に何の疑問も持たない人には疑いを持つように教えられなければならないし、疑問を持っている人には決して疑問を抱かないようにする必要がある。これが進歩への唯一の方法である。」 この言葉は『Zhu Zi Yu Lei・Xue Wu・Reading Methods』より引用パート2"。

Pythonを学ぶには、ただPythonを学ぶだけではだめで、まずは全体像を理解して背景や基礎を埋めないと、「現地にいるだけで廬山の素顔が分からない」ということになってしまいがちです。この山。」 (少なくとも、コンピュータの歴史と基礎を理解する必要があります。結局のところ、初心者はコンピュータ サイエンスを専攻する大学生とは異なります。彼らはオペレーティング システム、データ構造アルゴリズム、プログラミング言語の基礎コースを持っており、教えることを始めることができます)パイソン)。

作文を書くのと同じように、どうすれば良い作文を書くことができるでしょうか?

スタイルについて書きたい場合、スタイルについてだけ書くことはできません。湖の波紋、雲の流れ、砂が舞う場所、軒に吊るされた鐘の音、船や竹いかだの波紋、人々の服の角や端のことを書かなければなりません。従わない髪、捕まえられない風船について書きます。

雪について書きたい場合、雪についてだけ書くことはできません。世界のあらゆるものの冷たさ、明るさ、広さ、悲しみについて書きましょう。夜を覚ますために地面に吹く北風と寒い冬の月について書く必要があります。袁池の蝋人形と山中で踊る銀の蛇について書きます。橋の下で氷ができていることと、道を歩いている人々について書きます。梅の花の傲慢と決意 千の山を飛び交う鳥たち 歩くたびに消えていく人々 最後まで熟考して君の言葉を書き綴った 白い頭は離れない、そして寺院の雪はお互いを見つめます。

その月について書きたい場合、その月についてだけ書くことはできません。陰清と書くには丸く欠けて書きます。透明な光に覆われた傷と孤独について書きます。鹿が深い森の中で動いており、影がまばらで斜めであることを書く必要があります。夜に鳴る雪の強い悲しみについても書きたいと思います。渓流の松のゆるやかな風とピアノの音についての歌を書き、また、香を作るために水が流れることと古い寺院の扉が閉まることについての歌を書きます。今までペンを置いたら、一言も言及せず、どこにでもあります。

雨について書きたいのに、雨についてだけ書くことはできません。八角と羅斧について書きたいと思います。世間では見抜けない別れと出会いについて書きます。バシャンの夜と梅が黄色くなる頃のことを書きます。恋の病気と残刑について紙の山に書きます。夕暮れ時に窓の外から滴る音を、まるで鳳凰の木にささやくように書きます。それから私は、僧侶の家の階段の前の寺院はすでに星空であり、悲観主義は常に無慈悲であると書きました。最後になって初めて、私は突然ペンをたたみ、詩の後半にあなたを書きました。悲しみだけが残ってしまいます。

雲について書きたい場合、雲についてだけ書くことはできません。自然について書き、風に従ってください。世界の浮遊と飛行について書きます。服が美しく、顔が美しく、敷居が陽にさらされていると書く必要があります。沈む夕日が金を溶かすことを書いてください、人々はどこにいますか?永遠に続く深い愛の苦いことと証拠の欠如について書きます。この錦の本を書き終えたら、送るのをやめます 悲しみは人を悲しくします。書いているときもあなたがいなくて、夕暮れになるとあなたがいなくて寂しいです。それから、鳥が高く飛んでいること、雪が降っていること、葦から煙が立ち上っていることについて書きます。 Chao Sixi Ji Tiは最後まで、ChushanとQinshanはすべて白い雲であり、White Cloud部門の責任者はあなたに従っていると書きました。

夏について書きたいのに、夏についてだけ書くことはできません。暑さを書きたいなら蝉の鳴き声を書けばいい。世間では見抜けない憧れや出会いについて書きます。夕暮れに吹くオレンジ色の風と、荒々しい夏の夜のことを書きたいと思います。蝉の鳴き声がうるさく、夜風も涼しくない。バラのロマンスと奔放さがいっぱい。川辺に吹くそよ風と、いつもそばにある明るい月明かりについて書きます。それから約10マイルの緑の木々や蓮の花、そして長い夏のことを書きます。

秋について書きたいのに、秋についてだけ書くことはできません。憧れと別れ、この世界にある終わりのない恋と悩みについて書きたいと思っています。三日月をフックに見ながら、一人で無言で西館に上がった話を書きたい。袖にはほのかな香りがあり、その人は黄色い花よりも細いと書かれています。毎月の期待と要望を書き留めます。バナナの木を襲う霧雨について書き、排水溝に流れていく夢中になったことについて書きます。次に、かすかな鐘の音が聞こえる古蘇市郊外の古代青漢寺院について書きます。

Python を学びたいと思ったら、ただ Python を学べば良いわけではなく、ある程度のコンピューターの歴史と基本的なコンピューター知識を理解する必要があります。データ構造、オペレーティング システム、コンピュータ ネットワーク、データベースなどを含む、特定のコンピュータ基盤が必要です。この方法によってのみ、Python 言語をよりよく習得し、応用することができ、学習をより効率的に行うことができます。

データ構造とアルゴリズムの概要

プログラミングでは、データ構造とアルゴリズムが非常に重要です。 「プログラム=データ構造+アルゴリズム」ということは、データ構造とアルゴリズムの重要性を示しています。データ構造はプログラムの基礎であり、データの保存方法と操作方法を定義します。アルゴリズムはプログラムのロジックであり魂であり、問​​題を解決するためにプログラムがデータを処理する方法を定義します。データ構造とアルゴリズムの概念を最初に理解することが重要であり、これは将来のプログラミングにおいて非常に重要です。

データ構造とアルゴリズムに関する知識だけでも一冊の本を書くのに十分ですが、それでもいくつか言及する必要があります。 「マスターがドアを導き、実践は個人にある。」ということわざにあるように、実際、データ構造とアルゴリズムはプログラミング プロセス全体に存在します。場合によっては、それらを使用するだけで注意を払わないことがあります。

データ構造

データ構造は、効率的にアクセス、検索、変更できるようにデータを編成する方法です。データ構造が異なればパフォーマンス特性も異なります。たとえば、配列は要素にランダムにアクセスでき、リンク リストは要素を効率的に挿入および削除でき、二分探索ツリーは log(n) 時間で検索を完了できます。適切なデータ構造を選択すると、プログラムの効率と読みやすさに大きく影響します。

後で説明する Python の配列、文字列、リスト、タプル、辞書は実際にはデータ構造であり、データの保存と整理に使用でき、それぞれの型には独自の特性と用途があります。リストとタプルは線形データ構造ですが、辞書は非線形データ構造です。

線形データ構造とは、データ要素間に線形関係がある、つまり、任意の 2 つのデータ要素間に 1 対 1 の関係があるデータ構造を指します。

一般的な線形データ構造には、線形リスト、スタック、キュー、両端キュー、文字列 (文字列)、およびリンク リストが含まれます。​  

非線形データ構造とは、データ要素間に線形関係がないデータ構造を指します。つまり、任意の 2 つのデータ要素間に多対 1 または 1 対多の関係が存在する可能性があります。一般的な非線形データ構造には、ツリー、バイナリ ツリー、ヒープ、グラフなどがあります。

線形データ構造の特徴は、要素間に線形の関係があり、データ要素へのアクセスや操作は特定の順序で行うことができますが、挿入や削除の操作が難しく非効率であることです。

非線形データ構造の特徴は、要素間に明らかな線形関係が存在せず、複雑な階層構造や関係を表現できることですが、データ要素へのアクセスと操作の順序は特定の操作パスに依存するため、十分に直観的ではありません。一部のシナリオでは、非線形データ構造に対する挿入および削除操作の方が効率的です。

- 配列: 同じタイプのデータ要素のコレクションを保存し、アクセスするために使用されます。

- String: テキスト データの保存と操作に使用されるデータ型。

- リスト: 任意のタイプのデータ要素を保存およびアクセスするために使用される順序付けされたコレクション。

- タプル: 任意のタイプのデータ要素の保存とアクセスに使用される順序付きコレクションですが、タプルは不変です。

- 辞書: キーと値のペアのデータを保存およびアクセスするために使用されるデータ型。

もちろん、データ構造をカスタマイズすることもできます。カスタム データ構造は、クラス定義を通じて Python で作成できます。クラスとは何ですか?オブジェクトとは何ですか?初心者には最初はわかりにくいかもしれませんが、使っていくうちに自然と理解できるようになります。ここでは、事前の印象を得るために簡単に紹介し、後で使用するときに説明します。

クラスとは何ですか?

クラスはデータ構造の抽象化、つまり現実世界の抽象化であり、オブジェクトの作成に使用されるモデルであり、オブジェクトのプロパティとメソッドを定義します。

オブジェクトとは何ですか?

オブジェクトはクラスのインスタンスであり、クラスによって定義されたプロパティとメソッドを持ちます。クラスはオブジェクトの設計図であり、その特性と動作を記述します。オブジェクトはクラスの具体的なインスタンスであり、クラスの特性と動作の具体的な実装を持っています。

クラスとオブジェクトは、オブジェクト指向プログラミングにおける重要な概念です。クラスとオブジェクトを通じて、コードをより適切に編成および管理できるため、コードの再利用性と保守性が向上します。

クラス属性はクラスのメンバー変数であり、クラス関連の情報を格納するために使用され、クラスの任意のメソッドで使用できます。クラス メソッドはクラスのメンバー関数であり、クラスの動作を定義するために使用され、クラスのプロパティにアクセスして変更できます。クラスの属性とメソッドはクラスのコンポーネントであり、クラスの特性と動作を記述するために使用されます。

車の例を挙げて、クラスとは何か、オブジェクトとは何かについて話しましょう。

車について話すとき、車は同じ特性と動作 (車輪があり、走行し、笛を吹く乗り物) を持つオブジェクトのクラスを表すクラスですが、それがどのような種類の車なのかはわかりません。それがどのような特徴を持っているかを大まかに知るだけです。しかし、車のことを知っているだけでは、それを直接運転することはできません。特定の車の実体を見つける必要があります。私の車などの特定の車は、車クラスのオブジェクトであり、その車クラスには、クラス。 。クラスは抽象的であり、オブジェクトは具象的です。クラスはオブジェクトのテンプレートであり、オブジェクトはクラスのインスタンスです。

動物について話すとき、動物はクラスであり、同じ特性と行動を持つオブジェクトのクラスを表します。私のペットの犬などの特定の動物はこのクラスのオブジェクトであり、このクラスで定義された特性と動作の特定のインスタンスを持っています。クラスは抽象的であり、オブジェクトは具象的です。クラスはオブジェクトのテンプレートであり、オブジェクトはクラスのインスタンスです。

プログラミングにおいて、クラスとオブジェクトの重要性は何ですか?

クラスとオブジェクトはオブジェクト指向プログラミングにおける重要な概念ですが、もちろん、これらを使用せずに直接手続き型プログラミングを行うこともできます。これまでの単純なプログラミング タスクの中には、基本的にこの側面を含まないものもありますが、将来プログラミングをさらに深く掘り下げていくと、クラスとオブジェクトが必ず使用されるようになります。

ただし、これらを使用すると、現実世界の優れたシミュレーションが可能になり、コードを整理および管理する方法が提供されるという利点もあります。クラスとオブジェクトの存在には次の意味があります。

 1. モジュール化: クラスとオブジェクトによってプログラムをモジュールに分割でき、各モジュールが独自のクラスとオブジェクトを持つため、プログラムの複雑さが軽減され、コードの保守性と再利用性が向上します。​  

2. 抽象化: クラスとオブジェクトは、特定の問題を抽象データ型に抽象化し、内部実装の詳細を隠し、必要なインターフェイスのみを公開することで、プログラムの複雑さを軽減し、コードの読みやすさと理解やすさを向上させることができます。​  

3. カプセル化: クラスとオブジェクトは、データと関数を一緒にカプセル化して独立したユニットを形成し、任意の外部アクセスや変更からデータを保護し、プログラムのセキュリティと安定性を向上させることができます。​  

4. 継承: クラスとオブジェクトは継承を通じてクラス間の関係を確立できるため、コードの共有と再利用が実現し、コードの冗長性が削減され、コードのスケーラビリティと保守性が向上します。

つまり、クラスとオブジェクトはオブジェクト指向プログラミングにおける重要な概念であり、コードの保守性、再利用性、拡張性、可読性、理解性、セキュリティおよび安定性を向上させ、プログラムの複雑さを軽減し、プログラミング効率を向上させることができます。

アルゴリズム

アルゴリズムもプログラミングに不可欠な部分ですが、その存在に気づかない場合もあります。アルゴリズムは、問題を解決したり、特定のタスクを完了したりするための一連の明示的な指示です。あなたが行うさまざまなプログラミング作業は、実際には、問題を解決するためのアルゴリズムの設計とみなすことができます。

アルゴリズムは、問題を解決するための一連の明確な指示であり、入力を出力にマッピングするように設計されています。アルゴリズムは通常、計算、データ処理、自動推論などのタスクを実行するために使用されます。アルゴリズムは、自然言語、フローチャート、擬似コード、コンピューター プログラミング言語など、さまざまな方法で表現できます。アルゴリズムの選択は、問題の性質、必要な計算リソース、およびターゲット出力の形式によって異なります。アルゴリズムの一般的な例には、ソート アルゴリズム (バブル ソートやクイック ソートなど)、検索アルゴリズム (線形検索やバイナリ検索など)、暗号化アルゴリズム (対称キー アルゴリズムや公開キー アルゴリズムなど) があります。アルゴリズムはコードから独立して存在でき、自然言語、フローチャート、疑似コード、コンピューター プログラミング言語など、さまざまな方法で表現できます。アルゴリズムは、特定のプログラミング言語に依存せずに存在できます。

たとえば、デビューの質問をして、1から100まで足したらどうしますか?実装は単純なアルゴリズムと呼ぶこともできます。

一般的なアルゴリズムは何ですか?

一般的なアルゴリズムには、ソート アルゴリズム (バブル ソート、挿入ソート、クイック ソートなど)、検索アルゴリズム (線形検索、バイナリ検索など)、暗号化アルゴリズム (対称キー アルゴリズム、公開キー アルゴリズムなど)、最短パス アルゴリズム (ダイクストラアルゴリズム)、グラフアルゴリズム(深さ優先探索アルゴリズム、幅優先探索アルゴリズムなど)など。

スタンフォード大学がどのようにして学生に二分探索アルゴリズムについて教え、その後「本を引き裂く」行為を行ったのかについてお話しましょう。経験豊富な外国人講師による講義は生き生きとしており、本の中から単語を探す場合を例に、目的の単語を素早く見つけるにはどうすればよいでしょうか?まず本の半分を開いて、見つからない場合は半分をちぎって、もう半分の本を開いて、見つかるまで探します。何千ページもある分厚い本の中から単語を見つけるのに、ほんの数ステップしかかからないと思いますか?おそらく十数ステップで見つけたのですが、十分に速かったです。本の半分を一度に分割し、本の半分から特定の単語を見つけるこの方法は、アルゴリズムと呼ぶことができます。

要約する

データ構造とアルゴリズムはコンピューター サイエンスの基礎です。データ構造とアルゴリズムを理解すると、プログラマがプログラムの動作とパフォーマンスをより深く理解し、より効率的で保守しやすいコードを作成できるようになります。さらに、データ構造とアルゴリズムもコンピューター サイエンスの中核概念であり、複雑なソフトウェアを作成し、現実世界の問題を解決するために重要です。

その他のリソース

参考リンク

おすすめ

転載: blog.csdn.net/qq8864/article/details/134499230