日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python数据结构与算法分析_数据结构和算法分析

發布時間:2024/7/23 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python数据结构与算法分析_数据结构和算法分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題引出

假設有一道題目:有一組N個數而要確定其中第k個最大者,我們稱之為選擇問題,那么這個程序如何編寫?最直觀地,至少有兩種思路:

1、將N個數讀入一個數組中,再通過某種簡單的算法,比如冒泡排序法,以遞減順序將數組排序,則第k個位置上的元素就是我們需要的元素

2、稍微好一些的做法,將k個元素讀入數組并以遞減順序排序,接著將接下來的元素再逐個讀入,當新元素被讀到時,如果它小于數組中的第k個元素則忽略之,否則將其放到數組中正確的位置上,同時將數組中的一個元素擠出數組,當算法終止時,位于第k個位置上的元素作為答案返回

這兩種算法都很簡單,但是假設我們有一千萬個元素的隨機文件和k=5000000進行模擬將發現,兩個算法盡管最終都可以給出正確答案,但是在合理時間內均無法結束。因此,這兩種算法都不能被認為是好的算法,因為從實際角度出發,它們無法在合理的時間內處理輸入的數據。

數據結構和算法分析的提出

在許多問題中,一個很重要的觀念是:寫出一個工作程序并不夠。如果這個程序在巨大的數據集上運行,那么運行時間就變成了重要的問題,我們將在接下來的文章中看到對于大量的輸入如何估計程序的運行時間,尤其是如何在未具體編碼的情況下比較兩個程序運行的時間。我們還將看到徹底改進程序速度以及確定程序瓶頸的方法,這些方法將使得我們能夠發現需要我們集中精力努力優化的那些代碼段。

那么,首先,先了解一下什么是數據結構和算法分析(特別指出,后文的例子均以Java代碼編寫)。

數據結構

數據結構是計算機存儲、組織數據的方式,是指數據相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率(這就是為什么我們要研究數據結構的原因),數據結構往往同高效的檢索算法和索引技術相關。

常見的數據結構有數組、棧、隊列、鏈表、樹、散列等,這些數據結構將是本數據結構的分類中重點研究的對象。

算法分析

算法是為求解一個問題需要遵循的、被清楚指定的簡單指令的集合。對于一個問題,一旦某種算法給定并且(以某種方式)被確定是正確的,那么重要的異步就是確定該算法將需要多少注入時間或空間等資源量的問題。如果:

1、一個問題的求解算法竟然需要長達一年時間,那么這種算法就很難有什么用處

2、一個問題需要若干個GB的內存的算法,在當前大多數機器上也是無法使用的

數學基礎

無論是數據結構還是算法分析,都用到了大量的數學基礎,下面將這些數學的基礎簡單總結一下:

1、指數

(1)XAXB = XA+B

(2)XA/XB = XA-B

(3)(XA)B = XABsi

(4)XN + XN = 2XN ≠ X2N

(5)2N + 2N = 2N + 1

2、對數

(1)XA = B當且僅當logxB = A

(2)logAB = logCB / logCA

(3)logAB = logA + logB,A>0且B>0

3、級數

(1)∑2i = 2N+1 - 1

(2)∑Ai = (AN+1 - 1) / (A - 1),若0i ≤ 1 / (1 - A)

4、模運算

如果N整除A、N整除B,那么就說A與B模N同余,記為A≡B(mod N)。直觀地看,這意味著無論是A還是B被N去除,所得余數都是相同的,于是假如有A≡B(mod N),則:

(1)A + C ≡ B + C(mod N)

(2)AD ≡ BD (mod N)

時間復雜度

在計算機科學中,算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。這是一個關于代表算法輸入值的字符串的長度的函數,時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數,使用這種方式時,時間復雜度可被稱為是漸進的,他考察當輸入值大小趨近無窮時的情況。

那么首先先看一個簡單的例子,這里是計算Σi3的一個簡單程序片段:

1 public static void main(String[] args) 2 { 3 System.out.println(sum(5)); 4 } 5 6 public static int sum(int n) 7 { 8 int partialSum; 9 10 partialSum = 0;11 for (int i = 0; i <= n; i++)12 partialSum += i * i * i;13 14 return partialSum;15 }

對這個程序片段的分析是簡單的:

1、聲明不記入時間

2、第10行和都14行各占一個時間單元

3、第12行每次執行占用4個時間單元(兩次乘法、一次加法和一次賦值),而執行N次共占用4N個時間單元

4、第11行在初始化i,測試i≤n和對i的自增都隱含著開銷,所有這些總開銷是初始化1個時間單元,所有的測試為N+1個時間單元,所有自增為N個時間單元,共2N+2個時間單元

忽略調用方法和返回值的開銷,得到總量是6N+4個時間單元,按照最開始的定義不包括這個函數的低階項和首項系數,因此我們說該方法的時間復雜度是O(N)。繼而,我們順便得出若干個一般法則:

法則一----for循環

一個for循環的運行時間至多是該for循環內部那些語句(包括測試)的運行時間乘以迭代的次數,因此假如一個for循環迭代N次,那么其時間復雜度應該為O(N)

法則二----嵌套for循環

從里向外分析這些循環,在一組嵌套循環內部的一條語句總的運行時間為該語句的運行時間乘以該組所有的for循環的大小的乘積,因此假如有以下代碼:

1 public static int mutliSum(int n) 2 { 3 int k = 0; 4 for (int i = 0; i < n; i++) 5 { 6 for (int j = 0; j < n; j++) 7 { 8 k++; 9 }10 }11 12 return k;13 }

則其時間復雜度應為O(N2)

法則三----順序語句

將各個語句的運行時間求和即可,比如有以下代碼:

1 public static int sum(int n) 2 { 3 int k = 0; 4 5 for (int i = 0; i < n; i++) 6 k++; 7 for (int i = 0; i < n; i++) 8 { 9 for (int j = 0; j < n; j++)10 {11 k++;12 }13 }14 15 return k;16 }

第一個for循環的時間復雜度為N,第二個嵌套for循環的時間復雜度為N2,綜合起來看sum方法的時間復雜度為O(N2)

常見的時間復雜度與時間效率的關系有如下的經驗規則:

O(1) < O(log2N) < O(N) < O(N * log2N) < O(N2) < O(N3) < O(N!)

至于每種時間復雜度對應哪種數據結構和算法,后面都會講到,從上面的經驗規則來看:前四個算法效率比較高,中間兩個差強人意,最后一個比較差(只要n比較大,這個算法就動不了了)。

總結

以上是生活随笔為你收集整理的python数据结构与算法分析_数据结构和算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。