」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 開發高效演算法 - 使用大 O 表示法測量演算法效率

開發高效演算法 - 使用大 O 表示法測量演算法效率

發佈於2024-07-31
瀏覽:957

演算法設計是發展解決問題的數學過程。演算法分析是預測演算法的效能。前面兩章介紹了經典的資料結構(列表、堆疊、佇列、優先權佇列、集合和映射)並應用它們來解決問題。本章將使用各種範例來介紹用於開發高效演算法的常用演算法技術(動態規劃、分而治之和回溯)。

Big O表示法獲得了一個根據輸入大小衡量演算法時間複雜度的函數。您可以忽略函數中的乘法常數和非支配項。假設兩種演算法執行相同的任務,例如搜尋(線性搜尋與二分搜尋)。哪一個比較好?要回答這個問題,您可以實作這些演算法並運行程式以獲得執行時間。但這種方法有兩個問題:

  • 首先,許多任務在電腦上同時運作。特定程式的執行時間取決於系統負載。
  • 其次,執行時間取決於特定的輸入。例如,考慮線性搜尋和二分搜尋。如果要搜尋的元素恰好是清單中的第一個元素,線性搜尋將比二分搜尋更快找到該元素。

透過測量演算法的執行時間來比較演算法是非常困難的。為了克服這些問題,開發了一種理論方法來分析獨立於計算機和特定輸入的演算法。這種方法近似改變輸入大小的影響。透過這種方式,您可以看到演算法的執行時間隨著輸入大小的增加而增加的速度,因此您可以透過檢查兩個演算法的成長率

考慮線性搜尋。線性搜尋演算法將鍵與陣列中的元素順序進行比較,直到找到鍵或陣列耗盡。如果鍵不在陣列中,則需要對大小為 n 的陣列進行 n 比較。如果鍵在陣列中,則平均需要 n/2 次比較。此演算法的執行時間與數組的大小成正比。如果將陣列大小加倍,則比較次數也會加倍。該演算法以線性速率增長。成長率的數量級為n。計算機科學家使用大 O 符號來表示「數量級」。使用此表示法,線性搜尋演算法的複雜度為 O(n),發音為「n階」。我們將時間複雜度為 O(n) 的演算法稱為線性演算法,並且它呈現線性成長率。

對於相同的輸入大小,演算法的執行時間可能會有所不同,具體取決於輸入。導致執行時間最短的輸入稱為最佳情況輸入,導致執行時間最長的輸入稱為最壞情況輸入。最佳案例分析和
最壞情況分析是分析演算法的最佳情況輸入和最壞情況輸入。最好情況和最壞情況分析不具代表性,但最壞情況分析非常有用。您可以放心,演算法永遠不會比最壞情況慢。
平均情況分析嘗試確定相同大小的所有可能輸入之間的平均時間量。平均情況分析是理想的,但很難執行,因為對於許多問題來說,很難確定各種輸入實例的相對機率和分佈。最壞情況分析比較容易進行,所以一般都是針對最壞情況進行分析。

如果您幾乎總是在尋找清單中已知的內容,則線性搜尋演算法在最壞情況下需要n 次比較,在平均情況下需要n/ 2 次比較。使用 Big O 表示法,兩種情況都需要 O(n) 時間。乘法常數 (1/2) 可以省略。算法分析的重點是成長率。乘法常數對成長率沒有影響。 n/2 或 100_n_ 的成長率與 n 相同,如下表 成長率 所示。因此,O(n) = O(n/2) = O(100n).

Image description

考慮在 n 個元素的陣列中尋找最大數字的演算法。如果n為2,則需要比較一次才能找到最大數;如果n為3,則進行兩次比較。一般來說,需要 n - 1 次比較才能找到 n 個元素清單中的最大數量。演算法分析適用於大輸入量。如果輸入量很小,那麼估計演算法的效率就沒有意義。隨著 n 變大,表達式 n - 1 中的 n 部分在複雜性上占主導地位。大 O 表示法允許您忽略非主導部分(例如,
中的 -1 表達式 n - 1)並反白顯示重要部分(例如,表達式 n - 1 中的 n)。因此,此演算法的複雜度為O(n)。

Big O 表示法根據輸入大小估計演算法的執行時間。如果時間與輸入大小無關,則演算法稱為採用恆定時間,符號為O(1)。例如,檢索數組中給定索引處的元素的方法
需要常數時間,因為時間不會隨著陣列大小的增加而增加。

以下數學求和在演算法分析中通常很有用:

Image description

時間複雜度是使用 Big-O 表示法來衡量執行時間。同樣,您也可以使用 Big-O 表示法來測量空間複雜度空間複雜度衡量演算法使用的記憶體空間量。書中介紹的演算法大多的空間複雜度都是 O(n)。即,它們對輸入大小表現出線性增長率。例如,線性搜尋的空間複雜度為 O(n).

版本聲明 本文轉載於:https://dev.to/paulike/developing-efficient-algorithms-measuring-algorithm-efficiency-using-big-o-notation-1c1h?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-24
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-04-24
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-04-24
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-04-24
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-24
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-04-24
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-04-24
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-04-24
  • 解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    mysql錯誤1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的數據包,用於面對陰謀mysql錯誤1153,同時導入數據capase doft a Database dust?讓我們深入研究罪魁禍首並探索解決方案以糾正此問題。 理解錯誤此錯誤表明在導入過程中...
    程式設計 發佈於2025-04-24
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-24
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    程式設計 發佈於2025-04-24
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-04-24
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-04-24
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-04-24
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-04-24

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3