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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法与数据结构(part1)--算法简介及大O表示法

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法与数据结构(part1)--算法简介及大O表示法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考


文章目錄

    • 算法與數據結構--基于python
      • 數據結構和算法簡介
      • 算法引入
        • 例題A
        • 算法的概念
        • 例題A的優化
      • 算法效率的衡量
        • 時間復雜度與大O記法
        • 例題A的時間復雜度
        • 如何理解大O記法
        • 最壞時間復雜度
        • 時間復雜度的幾條基本計算規則
        • 常見的時間復雜度


算法與數據結構–基于python


數據結構和算法簡介


  • 什么是數據結構

數據結構就是一些有關系的數據的集合,有順序表,鏈表,棧,隊列,樹,圖等結構,

我們的程序就等于數據結構+算法。


  • 什么是算法

算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制;不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量;算法就是一種思路.


  • 數據結構和算法的用處

    • 寫出的程序可以更高效;

    • 面對一些復雜問題可能無從下手,數據結構和算法可以鍛煉邏輯思維。


算法引入


例題A


如果 a+b+c=1000,且 a2+b2=c2(a,b,c為自然數),如何求出所有a、b、c可能的組合?(不使用數學公式)

枚舉法:

import timestart = time.time()for a in range(1001):# a取完讓b去取for b in range(1001):for c in range(1001):if a + b + c == 1000 and a**2 + b**2 == c**2:print(a,b,c) end = time.time() print('finish') print('程序用時:',(end-start))

運行結果:

0 500 500 200 375 425 375 200 425 500 0 500 finish 程序用時: 829.0995240211487

算法的概念


算法是計算機處理信息的本質,因為計算機程序本質上是用一個算法來告訴計算機確切的步驟,進而執行一個指定的任務。當算法在處理信息時,會從輸入設備或數據的存儲地址讀取數據,把結果寫入輸出設備或某個存儲地址供以后再調用。

算法是獨立存在的一種解決問題的方法和思想,對于算法而言,實現的語言并不重要,重要的是思想,算法有不同的語言實現版本(如C、Java、Python等)


  • 算法的五大特性

    • 輸入: 算法具有0個或多個輸入;

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

    • 有窮性: 算法在有限的步驟之后會自動結束而不會無限循環,并且每一個步驟可以在可接受的時間內完成;

    • 確定性:算法中的每一步都有確定的含義;

    • 可行性:算法的每一步都是可行的.


例題A的優化


import timestart = time.time()for a in range(1001):# a取完讓b去取for b in range(1001 - a):# a,b已經確定了c = 1000 - a - bif a**2 + b**2 == c**2:print(a,b,c) end = time.time() print('finish') print('程序用時:',(end-start))

運行結果:

0 500 500 200 375 425 375 200 425 500 0 500 finish 程序用時: 2.3102197647094727

最直觀的評判算法優劣的標準,就是運行時間,可以看到改進的算法運行時長明顯小于枚舉法,所以改進的算法一定程度上優于枚舉法。



算法效率的衡量


  • 執行時間反應算法效率

實現算法程序的執行時間可以反應出算法的效率,即算法的優劣


  • 單純依據時間衡量可信么?

單純依靠運行的時間來比較算法的優劣并不一定是客觀準確的;

程序的運行離不開計算機環境(包括硬件和操作系統),這些客觀原因會影響程序運行的速度并反應在程序的執行時間上。


時間復雜度與大O記法


假定計算機執行算法每一個基本操作的時間是固定的一個時間單位,那么有多少個基本操作就代表會花費多少時間單位

雖然對于不同的機器環境而言,確切的單位時間是不同的,但是對于算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響,而客觀的反應算法的時間效率。

對于算法的時間效率,我們可以用大O記法來表示。

大O記法:對于單調的整數函數fff,如果存在一個整數函數ggg和實常數c>0c>0c>0,使得對于充分大的n總有f(n)<=c?g(n)f(n)<=c*g(n)f(n)<=c?g(n),就說函數gggfff的一個漸近函數(忽略常數),記為f(n)=O(g(n))f(n)=O(g(n))f(n)=O(g(n))。也就是說,在趨向無窮的極限意義下,函數fff的增長速度受到函數ggg的約束,亦即函數fff與函數ggg的特征相似。

時間復雜度:假設存在函數ggg,使得算法A處理規模為n的問題示例所用時間為T(n)=O(g(n))T(n)=O(g(n))T(n)=O(g(n)),則稱O(g(n))O(g(n))O(g(n))為算法A的漸近時間復雜度,簡稱時間復雜度,記為T(n)T(n)T(n)


例題A的時間復雜度


我們用TTT表示時間復雜度,則對于枚舉法來說,其時間復雜度為T=k(1000?1000?1000)+bT=k(1000*1000*1000)+bT=k(1000?1000?1000)+b,若用nnn代表數據規模,則T=k(n3)+bT=k(n^3)+bT=k(n3)+b,若存在函數g(n)g(n)g(n),使T(n)=k?g(n)+bT(n)=k*g(n)+bT(n)=k?g(n)+b,因為kkkbbb不影響大局,即相比于g(n)g(n)g(n)的形式來說,對時間的影響微不足道,所以我們拋棄kkkbbb,則算法的趨勢為T(n)=O(g(n))T(n)=O(g(n))T(n)=O(g(n))


如何理解大O記法


對于算法進行特別具體的細致分析雖然很好,但在實踐中的實際價值有限。對于算法的時間性質和空間性質,最重要的是其數量級趨勢,這些是分析算法效率的主要部分.

而計量算法基本操作數量的規模函數中那些常量因子可以忽略不計。例如,可以認為3n23n^23n2100n2100n^2100n2屬于同一個量級,如果兩個算法處理同樣規模實例的代價分別為這兩個函數,就認為它們的效率差不多,都為n2n^2n2級.


最壞時間復雜度


分析算法時,存在幾種需要考慮的情況:

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

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

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

我們主要關注算法的最壞情況,亦即最壞時間復雜度


時間復雜度的幾條基本計算規則


  • 基本操作,即只有常數項,認為就是O(1)O(1)O(1)
  • 順序結構,時間復雜度按加法進行計算
  • 循環結構(for),時間復雜度按乘法進行計算
  • 分支結構(if),時間復雜度為分支中的時間復雜度的最大值

剛才的例題A中就存在分支結構(if)和循環結構(for):

for a in range(1001):# a取完讓b去取for b in range(1001):for c in range(1001):if a + b + c == 1000 and a**2 + b**2 == c**2:print(a,b,c)

時間復雜度:T(n)=n?n?n?max(1,0)=n3T(n)=n*n*n*max(1, 0)=n^3T(n)=n?n?n?max(1,0)=n3

當我們的程序遇到if時,可能會執行if語句體里的內容,也可能不執行,所以分支結構if中最多有1次操作,最少為0次,而我們計算時間復雜度時,則用最大操作次數1來計算。


常見的時間復雜度


執行次數函數舉例非正式術語
12O(1)O(1)O(1)常數階
2n+3O(n)O(n)O(n)線性階
3n2+2n+1O(n2)O(n^2)O(n2)平方階
5log2n+20O(logn)O(logn)O(logn)對數階
2n+3nlog2n+19O(nlogn)O(nlogn)O(nlogn)nlognnlognnlogn
6n3+2n2+3n+4O(n3)O(n^3)O(n3)立方階
2^nO(2n)O(2^n)O(2n)指數階

  • 常見時間復雜度之間的關系

所消耗的時間從小到大:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2^n) < O(n!) < O(n^n)

總結

以上是生活随笔為你收集整理的算法与数据结构(part1)--算法简介及大O表示法的全部內容,希望文章能夠幫你解決所遇到的問題。

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