高度のpython - アルゴリズム

  • アルゴリズム:問題と手順を解決

  • 品質評価アルゴリズム:漸近漸近的時間計算量と空間の複雑さ。

  • O大数字の漸近的時間計算量:

    •  - 一定の時間 - ブルームフィルタ/記憶ハッシュ
    •  - 対数時間複雑 - 二分探索(バイナリサーチ)
    •  - 線形時間 - シーケンシャル検索/ソートバレル
    •  - 対数線形時間複雑さが - (ソート、クイックソートマージ)ソートアルゴリズムを進めました
    •  - 時間の複雑さの正方形 - 単純なソートアルゴリズム(選択ソート、挿入ソート、バブルソート)
    •  - 立方時間複雑 - フロイドアルゴリズム/マトリックス乗算
    •  - 幾何学的時間複雑 - ハノイの塔
    •  - 階乗時間複雑 - 旅行代理店の問題 - NP

ソートアルゴリズム(選択、バブリング及びマージ)及び(シーケンシャルおよびバイナリ)検索アルゴリズム

選択ソート(選択ソート)簡単なソートアルゴリズムです。これは次のように動作します。まず、ソートされていない(大きい)要素の最小の配列を見つける、開始位置は、ソートされた配列に格納され、その後、シーケンスの終わりにソートされていないとソートの残りの要素から最小値(大)要素を検索し続けます。ように、すべての要素がソートされるまで。

機能:

デフselect_sort(origin_items、COMP = ラムダX、Y:X <Y):"" "简单选择排序"""アイテム:= origin_items [] Iため(範囲LEN(アイテム)- min_index:1)= I jについて範囲(I + 1、LEN(アイテム)):もしCOMP(項目[J]、項目[min_index]):min_index = J項目[I]、項目[min_index] =項目[min_index]、項目[i]はリターンアイテム
选择排序例子:
デフselect_sort(アイテム):

Iの範囲内(LEN(アイテム))のために:
min_index =私は、
範囲内のjに対して(I + 1は、(アイテム)LEN):
商品[min_index]>アイテム[j]の場合
min_index = j個の
アイテム[i]は、項目[min_index] =項目[min_index]、項目[I]

プリント( '选择排序后的数组')
Iの範囲内(LEN(アイテム))のために:
プリント( '%D' %項目[I ]、端=」「)

DEFメイン():
商品= [64、25、12、22、11]
select_sort(項目)

場合__name__ == '__main__':
メイン()
バブルソート(バブルソート)も、シンプルで直感的なソートアルゴリズムです。これを繰り返し、彼らが切り替え間違った順序でそれらを置く場合は、列の数は、2つの要素の比較をソートする訪問しました。
コラムの仕事への訪問の数はもはや交換することが必要とされなくなるまで繰り返され、その列の数はすでに完了してソートと言うことです。小さな要素は、列の先頭に「フロート」の交換を通じて、ゆっくりとなるため、アルゴリズムの名前の由来です。
機能:
DEF (bubble_sort origin_items、COMP = ラムダX、:X、Y :> Y)"" "高质量冒泡排序(搅拌排序 """アイテム:= origin_itemsを[] Iため範囲(LEN(アイテム)- 1) :スワップ= Falseのjについてにおける範囲(I、LEN(アイテム)- 1 - I):もしCOMP(項目[J]、項目[J + 1]):商品[J]、項目[J + 1] =商品[J + 1]、項目[j]をスワップ= 真のスワップ場合:スワップ= Falseのjについて範囲(LEN(アイテム)- 2 - 、I、I、- 1):COMP(商品[J場合- 1]、項目[J])を:商品[J]、項目[jは- 1] =項目[J - 1]、項目[j]をスワップ= 真の場合は交換されない:ブレークリターン項目
例子1:
DEF(項目)bubble_sort:
N = LEN(アイテム)
の範囲内のiについて(N)
の範囲内のJ(0、NI-1)のために:
もしアイテム[J]>アイテム[J + 1]:
商品[J]、アイテム[J + 1]アイテムを= [J + 1]、項目[J]
プリント( '冒泡排序后的数组')
Iの範囲内(LEN(アイテム))のために:
プリント( '%D' %項目[ i]は、端=」「)

DEFメイン():
商品= [64,34,25,12,22,11,90]
bubble_sort(項目)

場合__name__ == '__main__':
メイン()
例子2:
DEF(:X> Y origin_items、COMP =ラムダX、Y)bubble_sort 
"" "高质量冒泡排序(搅拌排序)" ""
商品= origin_itemsを[]
の範囲でiについて(LEN(アイテム) - 1) :
= Falseのスワップ
範囲内のjについて(I、LEN(アイテム) - 1 - I):
もしCOMP(項目[J]、項目[J + 1]):
商品[J]、項目[J + 1] =商品[J + 1]、項目[J]
= Trueのスワップ
スワップ場合:
偽=スワップ
範囲のJ(LEN(アイテム) - 2 - 、I、I、-1)の場合:
COMP(商品[J - 1]であれば、アイテム[J]):
商品[J]、項目[J - 1]アイテムを= [J - 1]、項目[j]は
= Trueをスワップ
スワップされていない場合。
ブレーク
アイテムを返す
:DEFメイン()
項目= [64,34,25,12,22,11,90]
bubble_sort(アイテム)
:Iの範囲内(LEN(アイテム))のために
[i]は、印刷( '%D' %アイテム、端=」「)

なら__name__ == '__main__':
メイン()

(英語:ソートマージ、またはマージ)マージソート、効率的なソートアルゴリズムにマージ操作を作成することです。

このアルゴリズムは、非常に一般的なアプリケーションは、分割統治(分割統治)Aを使用しています。

分治法:

  • セグメンテーション:再帰的に半分現在のシーケンスで均等に分割。
  • 統合:配列一体化前のステップで得られた要素の順序を維持しながら、(マージ)。
機能:
デフmerge_sort(項目、COMP = ラムダX、Y:X <= Y):"" "归并排序(分治法 """ 場合でlen(項目)< 2:戻り項目[:]ミッド= LEN(アイテム)// 2左= merge_sort(商品[:中間]、COMP)右= merge_sort(商品[ミッド:]、COMP)リターンマージ(左、右、COMP)
DEF (マージ占める特別項目1、items2、COMP):"" "(順序付きリストに2つの順序付けられたリストをマージ)マージ""項目" = []のインデックス、INDEX2 = 0、0 一方がINDEX1、< LEN(占める特別項目1 )とINDEX2 < LEN(items2):IF COMP(占める特別項目1 [index1の、]、items2 [INDEX2]):items.append(占める特別項目1 [index1の、])index1の、+ = 1。他:items.append(items2 [INDEX2])INDEX2 + = 項目1。+ =占める特別項目1項目[,: index1の] + = items2 [INDEX2:] 戻り商品
例:
DEFのmerge_sort(項目は、COMPはラムダX、Yが=:X <= Y):
"" "マージソート(分割方法)" ""
IF LEN(アイテム)<2:
戻り項目[:]
MID = LEN(アイテム) 2 //
左= merge_sort(商品[:MID]、COMP)
右merge_sort(商品[MID:]、COMP)=
戻りマージ(左、右、COMP)


DEF(占める特別項目1、items2、COMP)マージは
""「マージ"" "(二は、順序付けられたリストの単一の順序付きリストにマージ)
項目= []
index1の,, INDEX2 = 0、0
:一方はINDEX1、<lenの(占める特別項目1)及びINDEX2 <LEN(items2)
COMP(占める特別項目1 [IFインデックス1、]、items2 [INDEX2]):
items.append(占める特別項目1 [index1の、])、
1 + = ,. INDEX1
他:
アイテムを。追加(items2 [INDEX2])
INDEX2 + = 1
アイテム+ =占める特別項目1 [index1の:]
+ = items2アイテム[INDEX2は:]
アイテムを返す

DEFメイン():
商品= [64,34,25,12,22,11,90]
merge_sort(アイテム)
(範囲でiについてLEN (項目)):
プリント( '%のD' %項目[I]、端=」「)

なら__name__ == '__main__':
メイン()

例子2:
DEF(ARR、L、M、R&LT)マージ:
。N1 = M - Lの+ 1
N2 = R&LT -のM

#は、一時的なアレイを作成
L = [0] *(N1)
R&LT = [0] *(N2)

に#コピーデータを一時配列アレイL []及びR&LT []
範囲(0、N1)におけるIの場合:
L [I] = ARR [L + I]

の範囲でJ(0、N2)のために:
R&LT [J] = ARR [M + + J. 1]

一時配列ARR [l..r]マージする#
最初のサブアレイインデックスのI = 0#初期化
第二サブアレイインデックスのJ = 0#初期
K = L位サブアレイ初期インデックスがマージ

しばらく私は<N1及びJ <N2:
IF L [I] <= R&LT [J]:
ARR [K] = L [I]
I + = 1。
他:
ARR [K] = R&LT [J]
。J + = 1
K + = 1つの

#コピーL []保持要素
私は<ながらN1:
ARR [K] = L [I]
I + = 1。
K + = 1。

コピーR&LT []保持要素
一方J <N2:
ARR [K] R&LT [J] =
。J + = 1
K + = 1つの


DEFのマージ(ARR、L、R&LT):
IF L <R&LT:
M = INT((1 +(R&LT - 1))/ 2)

マージ(ARR、L、M)
マージ(ARR、M + 1、R&LT )
ARR、L、M、R&LT)(マージ


ARR = [12 ,. 11であり、13は,. 5 ,. 6 ,. 7]
N- = LEN(ARR)
プリント( "所与のアレイ")
:(N-)の範囲内のIために
プリント( "%D" %ARR [I])

(ARR、0、N - 1)マージ
プリント( "\ N \ Nは、アレイをソートした後")
I範囲(N)のための:
印刷( "%D" %ARR [i])と

注文は、あなたが探してfind'reまで一定値まで、配列内の各要素をチェックする特定の順序を参照して下さい。
機能:
デフseq_search(項目、キー): "" "顺序查找""" インデックス、項目の中の列挙(アイテム):項目場合==キー:リターン・インデックス・リターン- 1 
例子:
seq_search DEF(項目、N-、KEY):
:Iレンジ(0、N-)にするための
IF項目[I] ==キー:
私はリターン
返す-1

DEFメイン():
商品= [64,34,25,12、 22,11]
キー= 22である
N- = LEN(項目)
結果= seq_search(項目、N-、キー)
:IF == -1結果
を印刷( '配列から要素!')
他:
印刷(「配列の要素インデックス」、結果)

__name__ == '__main__' IF:
メイン()

バイナリサーチは、規則的な配列内の特定の要素を見つけるための検索アルゴリズムです。中間要素は、要素がちょうど探している場合、アレイ素子の中央からの検索処理は、検索処理を終了する。
特定の要素は、アレイ内の中間要素が大きいか又は中間要素ルックアップの半分よりも小さいより大きいまたは小さい場合、及びスタートのように真ん中の要素を比較し始めます。
配列は、いくつかの段階で空の場合、それが見つかりません表しています。各比較検索が半分に減少するように、この検索アルゴリズム。
機能:
DEFbin_search(項目、キー):
    "" "折半查找"""開始、終了= 0、LEN(アイテム)- 1 スタートながら<=端は:半ば=(スタート+エンド)// 2 キー場合>商品[中間]:開始=ミッド+ 1 ELIFをキー<項目[中期]:エンド=中旬- 1 他:ミッド返すリターンを- 1
例子:
 
 
ノーリターン-1が存在しない場合#は、ARR xのインデックスを返し
DEF binarySearch(ARR、Lは、R、X):
は、実質的に分析
IF R&LT> = L:
MIDのINT =(1 +(R&LT - L)/ 2)
全体中間位置#のための良好な要素
:ARR [mIDを] == X IF
ミッド返す
要素の中間位置より#要素少なく、要素は、単に再び左の比較
のelif ARR [mIDを]> X:
-戻りbinarySearch(ARR、L、ミッド。1、X)
要素がちょうど再び素子、比較素子の中間位置よりも大きい
他:
binarySearch(ARR ,. 1 + MID、R&LT、X)を返す
:他
#不在
リターン-1

DEFメイン():
テストアレイを
= ARR [2 ,. 3 ,. 4、10、40]
X 10 =
#関数呼び出し
結果= binarySearch(ARR、0、 LEN(ARR) - 1、X)
結果= -1 :! IF
(%結果「配列の要素のインデックスはD%である」)プリント
他:
プリント(「しない配列要素に」)

__name__ ==「__main__」IF:
メイン()
 

 

おすすめ

転載: www.cnblogs.com/wen-hai/p/11100485.html