注アルゴリズム

(パイソン)アルゴリズム:

1.概念の導入は:

如果a+b+c=1000,且a^2+b^2=c^2(a,b,c为自然数),如何求出a,b,c的组合?

枚举法:

ワークロードは、時間の無駄が大きすぎます

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)
#T(n)=n*n*(1+max(1,0))=n^2*2=O(n^2)
#或者:
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)
#时间复杂度:T=1000*1000*1000*2
#T(n)=n**3*2
#T(n)=k* (n**a)函数的走势决定力量是n**a,而k是决定函数的陡峭,决定不了函数的走向
#渐进函数:T(n)=g(n)=n**a,g(n)大O表示法,忽略系数     

アルゴリズム:

問題解決のコンピュータは本質的アルゴリズム正確であるので、アイデアや方法、情報のコンピュータ処理の性質は、情報のコンピュータ処理は、入力装置またはデータであろうと、一般的に、特定のタスクを実行するためにレビン高速コンピュータステップアドレスデータを格納することは、出力装置、又は後でリコールのためのメモリアドレスに書き込まれた結果を読み出しています。

一つのアルゴリズムは、問題やアイデアに依存しないソリューションであります

実装言語は重要ではなく、重要なのはアイデアです

ファイブ機能アルゴリズム:

  • 入力:アルゴリズム、特にゼロ以上の出力
  • 出力:出力少なくとも一つのアルゴリズムまたは複数の出力
  • 有限性:アルゴリズムが自動的に無限ループすることなく、ステップの有限数の後に終了する、各ステップは、時間内に受信完了することができます
  • 不確実性は:アルゴリズムの各ステップは、明確な意味を持っている、あいまいな表示されません。
  • 実現可能性:アルゴリズムの各ステップは、実行の限られた数のために十分なすべてのステップが完了したことを意味し、実行可能です

測定するためのアルゴリズムの効率:

反応時間アルゴリズムの実行効率は絶対に信憑性はありません。

時間計算:

時間計算量は同じ問題が、異なるアルゴリズムを解決することができるされ、アルゴリズムの利点の品質プログラムにアルゴリズムの効率に影響を与えます。(番号基本演算を行う、コードの各行の実行頻度)

コンピュータサイエンスでは、アルゴリズムの複雑さを残すアルゴリズムの値を表す入力文字列の長さの関数であるアルゴリズムの実行時間の彼の定性的記述の関数である。一般的に、シンボリック表現O大きな時間複雑さのために使用されます、低次の項の係数と第一の機能を備えていない。このようにして使用した場合、彼はサイズの入力値が無限大に近づく場合を考慮した場合、時間計算量は、緩やかであることができます。

アルゴリズムの複雑さ:

  • 時間の複雑さは:アルゴリズムの実行に必要な(基本的な)計算努力を指し、
  • 宇宙複雑さは:必要に応じて、このアルゴリズムのメモリ空間の実装を指します。

ランダウの記号:

数学記号の関数の漸近的振る舞いを記述するために使用します。むしろ、それは機能を説明するために、他の(一般的にシンプルな)関数である大きさの漸近的に結合しました。数学では、一般的に切り捨て特徴づけるために使用され、無限級数、漸近シリーズの特に残存期間を、コンピュータサイエンスでは、アルゴリズムの複雑さの解析に非常に有用です。

最悪時間計算量:

どのように多くの基本的な動作アルゴリズムはそれが最適な時間複雑で、完了した作業の最小量を必要とします。

作業が完了したどのように多くの基本的な算術演算取る、それは最悪時間計算量です。

どのように多くの基本的な算術演算平均で作業を完了するために、平均時間の複雑さという。

  • 最適な時間計算のために、その値は、任意の有用な情報、理想状態の反応、なし基準値を提供しないではありません。
  • 最悪の場合の時間の複雑さのために、保証を提供するために、ある程度の基本的な操作におけるアルゴリズムは、この行うことができることを示しています。
  • 平均時間の複雑さのために、総合的な評価アルゴリズム、アルゴリズムの性質に完全に包括的な対応は、他の一方で、このトレードオフはないすべてのコンピュータは、平均的なケースのために、この基本的な操作内に完了することができることを保証するものではありませんコンピューティングは、アプリケーションインスタンスが均一アルゴリズムを分散されないこともあるため計算することは困難です。
  • したがって、我々は唯一の最悪の場合のアルゴリズムに焦点を当て、それが最悪時間計算量です。

いくつかの基本的なルールを計算する時の複雑さ:

  1. 基本的な操作:つまり、のみ定数項、そのOの時間複雑度(1)
  2. シーケンス構造:加算して計算時間複雑
  3. ループ構造:時間の複雑さを乗じて算出されます
  4. 条件構造:最大時間の複雑さを取ります
  5. アルゴリズムの効率を決定する際に、多くの場合、項目だけの数の最高レベルを操作する上で、第二期に焦点を当てる必要があると定数項を無視することができます。
  6. 特別な指示がない場合には、我々はアルゴリズムの時間計算量は最悪時間計算量で分析しました。

組み込み型のPythonのパフォーマンス分析:

timeitモジュール:

timeitモジュールは、短いテストするために使用することができpython、コードの実行速度を。

  • class timeit.Timer(stmt = 'pass',setup='pass',timer=<timer function>)
  • Timerコードの実行速度の小片は、クラスの尺度であります
  • stmtステートメントをテストするためのパラメータのコードでは、タイプが文字列、引用符で直接配置渡された関数名()であることに注意しました
  • setupパラメータは、コードを実行するために必要な設定です
  • コードを実行するときに、セットアップパラメータセットが必要です
  • timerパラメータは、プラットフォームに関係なく、タイマー機能です。
  • timeit Timer.timeit(number = 1000000)

テストクラスステートメントタイマパラメータにオブジェクトの実行速度の方法は、試験コード、デフォルト1,000,000 .NUMBERテストの数である。この方法は、コード、フロート秒のタイプを実行する平均時間を返します。

運用テストのリスト:

import timeit 
#生成列表的四种方式:
#列表的加法生成新的列表
li1 = [1,2]
li2 = [3,4]
li = li2+li1


li = [i for i in range(10000)]#列表生成器


li = list(range(10000))#把可迭代对象直接生成列表

#空列表追加形式生成列表
li = []
for i in range(10000):
    li.append(i)
from timeit import Timer 

def test1():
    li = []
    for i in range(10000):
        li.append(i)

def test2():
    li = []
    for i in range(10000):
        li +=[i]
        
def test3():
    li = [i for i in range(10000)]
    
def test4():
    li = list(range(10000))
    
def test5():
    li = []
    for i in range(10000):
        li.extend([i]) #列表或可迭代对象
        
 def test6():
    li = []
    for i in range(10000):
        li.insert(0,i)
        
        
#注意不能直接把函数名直接传进来,是一个字符串的形式
t1  = Timer('test1()','from __main__ import test1')
print('append',t1.timeit(number = 1000),'seconds')
t2 = Timer('test2()','from __main__ import test2')
print('+',t2.timeit(number = 1000),'seconds')  
t3 = Timer('test3()','from __main__ import test3')
print('列表生成器',t3.timeit(number = 1000),'seconds') 
t4 = Timer('test4()','from __main__ import test4')
print('可迭代对象直接生成列表',t4.timeit(number = 1000),'seconds') 
t5 = Timer('test5()', 'from __main__ import test5')
print('列表extend:', t5.timeit(number=1000), 'seconds')
t6 = Timer('test6()', 'from __main__ import test6')
print('列表insert:', t6.timeit(number=1000), 'seconds')


#由结果可以看出:可迭代对象生成新列表时间最短,其次是列表生成器的时间,再次就是加法生成新列表的时间,最后是追加形式的时间最长,insert要比append慢的太多,extend是对列表或者可迭代对象的插入

1565249384561

from timeit import Timer
x = list(range(2000000))

pop_zero = Timer('x.pop(0)','from __main__ import x')
print('pop_zero耗时:',pop_zero.timeit(number=1000),'seconds')


y = list(range(2000000))

pop_end = Timer('y.pop()','from __main__ import y')
print('pop_end耗时:',pop_end.timeit(number=1000),'seconds')

1565249877790

データ構造:

  • DSA =Data Structure + Algorithm
  • 度量:測定するために、あなたはそれを測定することができないならば、あなたはそれを改善することができない、知っていることです

チューリングマシン:

  • テープ:均一に分裂する細胞順次、それぞれが文字でマークされたが、デフォルトでは「#」であります
  • アルファベット:文字の種類
  • ヘッド:常に文字が読み、書き換え可能であり、ビートの後、細胞を合わせ、左または右の隣接セルを回し
  • 状態:TMは常に、ビートによる有限状態のいずれか、それぞれにある別の状態を操縦可能。

遷移関数:(Q、C、D、L / R、P)

  • 現在の状態がPであり、現在の文字がC、Dに現在文字である場合、左折またはグリッドOの右側、Pステート転送。「H」の特定の状態に入ると、それは停止します。

チューリングマシンの例:

  • (<、1,0、L、<)----左、1-> 0
  • (<、0,1、R、>)---ターン、0-> 1
  • (<、#1、R>)---
  • (>、0,0、R、>)
  • (>、#、#、L、H)

モデルのRAM:ランダム・アクセス・マシン

ランダムアクセス機械モデルは、理論解析と計算でシリアル計算アルゴリズムの複雑さのための重要なモデルであり、単にRAMと呼ばれます。

一个RAM有:
    k个变址器/1,/2,/3,....,/k.
    无穷多个普通寄存器R0,R1,R2,...,
    和一个有穷长的程序组成.
#变址器也是寄存器,每个寄存器中可以存放一个自然数,但只有变址器的内容可以作为间接地址.
RAM的程序使用两种形式地址:
    1.直接地址:形式/j(j=1,2,...,k)或Ri(i=0,1,2...)
    2.间接地址:/j(j=1,2,3,...,k)
        3.如果/j中的存自然数为i,则/j代表地址Ri.
RAM的指令形式解读:
    1.A<-a,表示将地址A的内容改为自然数a.
    2.A<-B,表示将地址A的内容改为地址B的内容.
    3.A<-B*C,表示把地址B中的内容和地址C的内容作运算*之后,送入地址A中.
    4.A<-F(B<C),此时F是一个可以用多带图灵机器在多项式空间和对数多项式的巡回中实现的变换,A,B,C可以是直接地址也可以是间接地址,A为写入地址,B,C是读出地址.
    RAM除了可以用以上的指令编程序外,还可以判断某个寄存器或变址器的内容是否为0,实现条件转移.
    IF R[i] = 0 GOTO 1
    IF R[i] > 0 GOTO 1
    GOTO 1   (绝对转向)
    STOP     (终止语句)

アルゴリズム分析:

その正しさと複雑さ

複雑さ:不要な本当の基本的な命令RAMアルゴリズムは、実行回数を累積された統計を行います。

この方法の複雑さ:
  • イテレーション:総和
  • 再帰:再帰再帰的スキームの追跡+
  • +認証をゲス
シリーズ:

等差数列:最後の項目と同程度の正方形
$$
。T(N)= 3.1 + 2 + + \ + N-cdots = \ {N-FRAC(N-+ 1)} = {2} O(^ N-2)
$$

直列電源合計:
$$
\ sum_ Kが= {0}} ^ {N-D} = {K ^ \ INT_ {0}} ^ {X ^ N-DDX = \ {FRAC 1 1} + {D} ^ {X } 1 + D |。_} {0} = ^ {N- \ FRAC 1 {{。}} N-Dの+ 1 1 + ^} = {D O(N-D ^ {+} 1)
$$

$$
T(N)。1 ^ = ^ 2 + 2 + 2 + ... + 2 3 ^ 2 = N-N- ^(N + 1)(2N個の+ 1)/ = O. 6(N ^ 3)
$$
収束シリーズ、高調波シリーズ、対数進行

例:

非極端な要素を取ります

问题:给定整数子集S,|S|=n>=3,找出元素a 属于 S,a!=max(s)且a!=min(s)
算法:从s中任取三个元素{x,y,z}
//若s以数组形式给出,不妨取前三个
//由于S是集合,这三个元素必互异
确定排除最大最小者
//不妨设 x =max{x,y,z},y=min{x,y,z}
输出剩下的元素

#起泡排序
#问题:算法必然结束?至多迭代多少次
不变性:经过k轮扫描交换后,最大的元素必将就位
单调性:经过k轮交换后,问题的规模缩减至n-k.
正确性:经过至多n次扫描,算法必然会终止,且能给出正确答案
#封底估计:测量地球周长



1565344727653

おすすめ

転載: www.cnblogs.com/Zhao159461/p/11329092.html