python資料結構與演算法 day01

2021-10-07 09:09:19 字數 1966 閱讀 7224

(1)演算法的概念

演算法是計算機處理資訊的本質,因為電腦程式本質上是乙個演算法來告訴計算機確切的步驟來執行乙個指定的任務。一般地,當演算法在處理資訊時,會從輸入裝置或資料的儲存位址讀取資料,把結果寫入輸出裝置或某個儲存位址供以後再呼叫。

對於演算法而言,實現的語言並不重要,重要的是思想。

(2)演算法的五大特性

輸入: 演算法具有0個或多個輸入

輸出: 演算法至少有1個或多個輸出

有窮性: 演算法在有限的步驟之後會自動結束而不會無限迴圈,並且每乙個步驟可以在可接受的時間內完成

確定性:演算法中的每一步都有確定的含義,不會出現二義性

可行性:演算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完成

(1)執行時間反應演算法效率

我們假定計算機執行演算法每乙個基本操作的時間是固定的乙個時間單位,那麼有多少個基本操作就代表會花費多少時間單位。算然對於不同的機器環境而言,確切的單位時間是不同的,但是對於演算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響而客觀的反應演算法的時間效率。

對於演算法的時間效率,我們可以用「大o記法」來表示

(2)如何理解「大o記法」

對於演算法進行特別具體的細緻分析雖然很好,但在實踐中的實際價值有限。對於演算法的時間性質和空間性質,最重要的是其數量級和趨勢,這些是分析演算法效率的主要部分。而計量演算法基本運算元量的規模函式中那些常量因子可以忽略不計。例如,可以認為3n2和100n2屬於同乙個量級,如果兩個演算法處理同樣規模例項的代價分別為這兩個函式,就認為它們的效率「差不多」,都為n2級。

(3)分析演算法時,存在幾種可能的考慮:

演算法完成工作最少需要多少基本操作,即最優時間複雜度

演算法完成工作最多需要多少基本操作,即最壞時間複雜度

演算法完成工作平均需要多少基本操作,即平均時間複雜度

對於最壞時間複雜度,提供了一種保證,表明演算法在此種程度的基本操作中一定能完成工作。我們主要關注演算法的最壞情況,亦即最壞時間複雜度。

(4)時間複雜度的幾條基本計算規則:

注意:這兩段**每層迴圈的數量級為n

我們如何用python中的型別來儲存乙個班的學生資訊? 如果想要快速的通過學生姓名獲取其資訊呢?

實際上當我們在思考這個問題的時候,我們已經用到了資料結構。列表和字典都可以儲存乙個班的學生資訊,但是想要在列表中獲取一名同學的資訊時,就要遍歷這個列表,其時間複雜度為o(n),而使用字典儲存時,可將學生姓名作為字典的鍵,學生資訊作為值,進而查詢時不需要遍歷便可快速獲取到學生資訊,其時間複雜度為o(1)。

我們為了解決問題,需要將資料儲存下來,然後根據資料的儲存方式來設計演算法實現進行處理,那麼資料的儲存方式不同就會導致需要不同的演算法進行處理。我們希望演算法解決問題的效率越快越好,於是我們就需要考慮資料究竟如何儲存的問題,這就是資料結構。

1.python給我們提供了很多現成的資料結構型別,這些系統自己定義好的,不需要我們自己去定義的資料結構叫做python的內建資料結構,比如列表、元組、字典。

而有些資料組織方式,python系統裡面沒有直接定義,需要我們自己去定義實現這些資料的組織方式,這些資料組織方式稱之為python的擴充套件資料結構,比如棧,佇列等。

2.程式 = 資料結構 + 演算法

演算法是為了解決實際問題而設計的,資料結構是演算法需要處理的問題載體

3.抽象資料型別(abstract data type)

抽象資料型別(adt)即把資料型別和資料型別上的運算捆在一起,進行封裝。

最常用的資料運算有五種:

插入刪除

修改查詢

排序

python資料結構與演算法

coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...

資料結構與演算法 python

元類 基礎 冒泡 它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名氣泡排序。def bubble sort alist ...

python演算法與資料結構

若n1 n2 n3 1000,且n1平方 n2平方 n3平方 n1,n2,n3為自然數 求出所有n1 n2 n3可能的組合?n1 0 n2 0 n3 0 判斷n1 n2 n3是否等於1000,之後變n3 1,n3 2,n3 3,然後再變n2 那如果變為 n1 n2 n3 2000 了呢?思路1 實現...