それはあなたのPythonでの最初の主要なデータ構造が単純であることを学ぶのですか?

序文

学校は、基本的な言語構文を終えた後に、データ構造は、人々の次の大きなものの頭蓋骨を学ばなければならない、と学生がコンピュータサイエンスのデータ構造である場合、一般的に2年生でこのコース学期であり、確かに学習しますCまたはC ++でバージョンを実装します。非常に重要なツールでC言語のデータ構造はポインタですが、学校で誰もが疑問があるノックしていない、私のデータ構造は白の学校ものでCは、あまりにも、私、確かに頭痛であるポインタを参照してくださいコード。私は、Pythonのデータ構造を学んだ前に、それを達成するために思考し、何のポインタはこの事ああ、どのようにC言語はリンクリストとして実装されていないように、バイナリツリーデータ構造が格納されているPythonのノードアドレスこれらのニーズでしたか?

データ構造とは何ですか

上記の疑問にこの問題を解決する前に、我々は最初のデータ構造であるかを理解しなければなりませんか?ああ、いわゆるデータ構造法をまとめた組み合わせとデータ間の関連性を研究して、これらの構造で使用されるデータの便利な構造と組織、より効率的な方法を見つけることです。そのような線形テーブル、バイナリツリーなどのデータの形式との間の関係を意味し、データ構造は、コンピュータに格納されたデータは、我々は、これらのデータの効率的な使用を表す方法、およびどのように、データ間の図との関係で表されます。もちろん、私は非常に、私たちは本を見ることができ、特定の事柄を詳細に話すことはできません。

なぜデータ構造を調べます

ここでは、私だけで類推ハは、戦場に比べて書かれた手順場合は、私たちのプログラムの猿の将軍の指導者と戦う、と私たちは兵士や武器そのコードを記述しています。だから、どのようなデータ構造でこれらの事?私は戦争の芸術を承認したいと思います!
それは我々が勝つかもしれない行くので、私たちは、戦場での戦争の芸術をバヨネットない場合、それは勝利が重い価格を支払うことになる場合でも、失敗する可能性があります。私たちは時々 、この問題を解決するための方法を考えるが、問題を解決するために多くの方法が、ありますが、プログラムは同じです記述しますが、パフォーマンスの低下が生じ、時間とコスト効率プログラムを認識しないかもしれません。時々でいるがこれらのツールは、効率性の問題を解決するために他の人が開発していますが、どのような検索暴力を知っているとき、遭遇した他の問題を解決する方法がわかりません。
私たちは、戦争でその後、レッスンの信頼を戦争の芸術を知っていれば、私たちは同じデータ構造を学ぶ場合は、コードを書く問題の原因を見つけることが容易にできるようになります。
我々は唯一の戦争の芸術を知っていると私は、実際の状況は、紙の上にクオになることも知っていない場合はもちろん、;同様に、我々は唯一の学校に行き、彼のデータ結果を使用しない場合は、実用上の問題を解決するのではなく、タイトルを磨いていない、ない書き込みのコードを実行します最後に、それは無用です。ちょうど私たちのプログラマの基本的なスキルのデータ構造は、ローマは一日にして成らず、蓄積するために懸命に仕事を継続する必要があります。

時間の複雑さと空間の複雑さ

時間複雑

時間の複雑さは、彼の時間の複雑性が高く、高速の時間を実行するためのいくつかのコードの順序の速度を実行しているタイムコードを意味し、いくつかのランタイム・コードが遅い、そして彼の時間の複雑性が低いです。直感的に、タイムコードの複雑さを説明しているコードの次のセクションを参照:A + B + C = 1000、A 2 + B 2 = C 2解く、B、Cの全ての値のためのそのような要求を満たします。

import time
start_time = time.time()
for a in range(0, 1001):
    for b in range(0, 1001):
        for c in range(0, 1001):
            if a + b + c == 1000 and a**2 + b**2 == c**2:
                print("a, b, c:%d, %d, %d" % (a, b, c))
end_time = time.time()
print("%d" % (end_time - start_time))
print("finished")

それは仮想マシン内で実行されているので、私は少し遅かったので、私たちは、それを解決しなければならない、、、当然のことながら、実行している時間は548sであること秒程度の通常の9世代i7プロセッサーの数十を誇張を見ることができます。
ここに画像を挿入説明
私たちはこのコードを書くための方法を変更した場合は何の反応ですか?

import time
start_time = time.time()
for a in range(0, 1001):
    for b in range(0, 1001):
        c = 1000 - a - b
        if a**2 + b**2 == c**2:
            print("a, b, c:%d, %d, %d" % (a, b, c))
end_time = time.time()
print("%d" % (end_time - start_time))
print("finished")

ここに画像を挿入説明
私達はちょうど場合は、1000年以内にこちらからお願いし、それがいかに重要であるか548sの前で、コードは少しだけビットを変更し、実行している時間が唯一の1秒で、ここを参照してください、しかし、数百回の走行時間差、コード効率が示すことができます数十またはコードの後ろにさらに大きな数字は、より良好なコントラスト一目あります。これは、我々がああのデータ構造の重要性を学ぶものです!効率的なデータフォーム組成、反応時間は、あなたが常に存在秒の何百も動かないのを待っている、と右のユーザーであることうちのアプリケーションの後の開発にはしたくない、非常に待ち時間を短縮、何百回も保存することができます。

ルールの計算時間複雑

  • その時間複雑度はO(1)であることが、唯一の定数項である基本的な動作、。
  • シーケンシャル構造、添加することにより算出した時間複雑。
  • 環状構造、乗算で計算時間複雑。
  • 分岐構造は、最大時間の複雑さを取ります。
  • アルゴリズムの効率を決定するとき、しばしばエントリのみ、他のマイナーな項目と定数項を無視することができるの最大数を動作させるに焦点を当てる必要があります。
  • 特別な指示ん、我々は計算の複雑される最悪の時間を分析します。

共通の時間複雑

例えば、機能を実行します 時間複雑
12 O(1)
2N + 3 O(N)
3N 2 + 2N + 3 O(N 2
5lg2n + 20 O(LOGN)
2N + 3nlgn + 100 O(nlogn)
3N 3 + 2N + 3 O(N 3
2 N O(2 N

ここに画像を挿入説明
。このグラフは明らかに時間の複雑さをソートする速度が感じることができる:O(1)<O(logN個)<O(N)<O(nlogn)<O(N 2)<O(N 3)< O(2 N-)。

時間再帰アルゴリズムの複雑さ

実際には、ループのほとんどの時間複雑さはありませんここで、それは解決することができ、簡単な再帰的なアルゴリズムと見られますが、比較的単純なことができます。再帰的アルゴリズムは典型的には、以下のモードがあります。

def recur(n):
    if n == 0:
        return g(...)
    somework
    for i in range(a):
        x = recur(n/b)
        somework
    somework

即ち、N-0は、直接得られる結果である、または主要な問題は、2つの定数aおよびbは、特定の問題によって決定されるN / B下位問題の大きさに帰着します。さらに、いくつかの作業を行うことが本層再帰必要で、O(Nに関するN個の時間複雑であってもよいsomework表現と上記のようにK)。これはまた、定数kであるべきで、K = 0は、作業の一部は、nとは無関係であることを示しています。したがって再帰式を得る:T(N)= O(N- K)* T + A(N / b)は
以下の結論を有します。

  • A> BであればK、次いでT(N)= O(N- (logba) )。
  • もしB = A K、次いでT(N)= O(N- K logN個)。
  • A <BであればK、次いでT(N)= O(N- K)。
    これらの結論は、状況の再帰的に定義されたアルゴリズムの時間計算量の大部分をカバーすることができます。
    これは、Bを必要とするため、kは定数であり、それによって結論は問題はサイズの縮小された行列式の再帰的アルゴリズムを扱うNであることはできないことに留意されたいN N-1は、規模の問題です。

宇宙複雑

プログラム内のオブジェクトのいずれかのタイプを使用することはスペースを取るために、スペース、タプルの確立のための要素の少なくとも数を支払わなければなりません。問題のリニアスケールに関連したテーブル内の要素の数は、少なくともO(n)の(要素が新しい場合、だけでなく、要素自体のストレージオーバーヘッドを考慮)で有料に彼のスペースを確立する場合。
相対的に言って、リストやタプルは、比較的単純なデータ構造です。高速クエリや他の操作をサポートするために辞書が必要で、その構造は、辞書が含まn個の要素は、少なくともO(n)の記憶空間を占有する必要があり、より複雑です。
注:
Pythonのデータ・オブジェクトの様々な組み合わせは、要素の予め設定された最大数を持っていないことが、実際の使用では、これらの構造は自動的に要素の数に応じて、体積増加を展開することができます。見た目の占有スペースの観点から、データの存在中の実際のストレージ容量は大きくなるかもしれないが、通常は自動的に(後の要素が非常に小さくなっても)縮小しません。例えば、リストを作成するプログラムを想定し、その後の要素は、より大きなテーブルにつながる添加続け、その後、要素を削除していき、要素のテーブルが不足しているが、ストレージスペースが低減されません。
しかし、時間のアプローチのためのハードディスク容量の大容量の発展と近代的な時代は、価値がある、良いでしょうに、私たちの現在の研究では、時間の複雑さは、すべての後に、と考えることができない、私たちは、コードを書きますメモリにつながるだろうされていません十分ではありませんが、それは、何気なくビッグブラインドとハードあなたの選択や小さな構造の複雑さのために知られている方法ということではありません。

遂に

今日では、記録上そんなに、およびフォローアップ更新していきます!

公開された17元の記事 ウォン称賛94 ビュー7967

おすすめ

転載: blog.csdn.net/qq_43779324/article/details/104924045