第1章 算法設計基礎

1-1 什么是算法

見識算法

  • 算法是計算機科學的基石:從古代算術到現代計算機,算法始終是解決問題的核心。

算法的起源
  • 張蒼《九章算術》:創立了機械化算法體系(如“合分術”分數相加算法)。

  • 歐幾里得《幾何原本》:奠定了邏輯演繹體系,為后世算法理論提供嚴密的數學基礎。


1.1.1 算法的定義

  • 算法:對特定問題求解步驟的一種描述,是指令的有限序列。

  • 三要素

    1. 有窮性:算法必須在有限步內終止,防止出現死循環或無限運行,以保證能在實際環境中獲得結果;

    2. 確定性:每一步都有唯一明確定義,避免歧義和不一致,確保重復執行時輸出一致;

    3. 可行性:每一步都能在有限時間和空間資源下執行,保證算法在實際計算環境中可實現。

Problem 與 Instance
  • Problem(問題):規定輸入與輸出之間關系的抽象集合;

  • Instance(實例):具體的輸入數據集合。

  • 排序問題示例

    • 輸入:<31, 41, 59, 26, 41, 58>

    • 輸出:<26, 31, 41, 41, 58, 59>

示例題目
  • 例1.1 設計算法求兩個自然數的最大公約數

    • 思路(質因數分解法)

      1. 找出 m 的所有質因子;

      2. 找出 n 的所有質因子;

      3. 求交集并相乘。

    • 缺陷:分解過程時間復雜度高,因子枚舉不確定,難以擴展大數運算,且分解失敗時無法輸出。

  • 例1.2 歐幾里德算法——輾轉相除法求最大公約數

    • 步驟:

      1. r = m % n

      2. 若 r = 0,則輸出 n;否則 m ← n,n ← r,轉步驟1。

    • 優點:時間復雜度 O(log min(m,n)),保證有窮性和可行性,簡單易實現,確定性強。


1.1.2 算法的描述方法

  1. 自然語言

    • 優點:通俗易懂;缺點:描述不夠嚴密,易產生歧義。

  2. 程序流程圖

    • 優點:結構清晰、直觀;缺點:難表達復雜邏輯,維護和修改成本高。

  3. 偽代碼

    • 優點:兼顧可讀性與嚴密性,可快速轉化為程序;缺點:語法非標準,不同風格可能導致理解成本。

示例偽代碼題目
  • (1)瓶子 A 與 B 液體互換

    1. C ← A

    2. A ← B

    3. B ← C

  • (2)三個數由小到大排序

    1. 若 x > y,則交換;

    2. 若 z < x,則循環交換;否則若 z < y,則交換;

    3. 輸出 x, y, z。

  • (3)在 n 元素集合中查找最大值

    1. max ← a[1];

    2. i ← 2;

    3. 當 i ≤ n 時:若 a[i] > max,則 max ← a[i];i ← i + 1;

    4. 輸出 max。


1.1.3 算法在問題求解中的地位

  1. 分析問題并設計算法;

  2. 編寫程序;

  3. 機器 執行程序,得到結果。

強調算法設計是溝通人和機器的橋梁,決定程序效率與可維護性。


1-2 什么是好算法

1.2.1 如何評價算法

  1. 正確性:算法必須對所有合法輸入產生正確輸出,否則無法信賴;

  2. 健壯性:能識別和處理無效或異常輸入,避免程序崩潰或產生誤導性結果;

  3. 可理解性:清晰的邏輯結構和注釋便于他人閱讀、調試和維護,降低開發成本;

  4. 抽象分級:合理劃分模塊和層次,符合人類認知規律(7±2 原則),提高復用性;

  5. 高效性:兼顧時間復雜度和空間復雜度,使算法在大規模數據或復雜環境中仍能快速運行;

  6. 可擴展性:便于后續功能擴展或性能優化,以適應需求變化。

案例對比:當 n = 103 時,冒泡排序約需 0.01 s;當 n = 10? 時,快速排序僅需約 0.02 s,而冒泡排序則超過 102 s,效率差異隨規模增長指數級放大。


1-3 為什么要學習和研究算法

1.3.1 算法研究推動計算機技術發展

  • 查找問題:二分查找 O(log n),將線性查找 O(n) 降為對數級,大幅提升檢索效率;

  • 圖問題:Dijkstra 算法解決最短路徑,實現地圖導航、網絡路由等核心功能;

  • 組合優化:背包問題、旅行商問題等,影響資源分配與調度系統設計。

多數現代應用(搜索引擎、社交網絡、電子商務)都依賴高效算法來支撐海量數據處理。

1.3.2 算法訓練提升計算思維能力

  • 模型化:將現實問題抽象為數學模型,有助于使用已知算法求解;

  • 抽象思考:在機外表示與機內表示間切換,理解問題核心;

  • 形式化:將解題思路轉化為偽代碼或程序,保證邏輯嚴密性和可執行性。

思維收益:培養分治、貪心、動態規劃等思維模式,提高解決復雜問題的條理性與創造力。

1.3.3 程序員必學算法的程度

Algorithm + Data Structures = Programs

  • 基礎功底:理解算法思想有助合理選擇和組合數據結構;

  • 應用層面:不必精通所有算法,但應熟練掌握常用排序、查找、圖算法等;

  • 高級優化:針對性能關鍵場景,掌握算法優化技巧能顯著提升系統效率。


1-4 如何設計算法

1.4.1 基本數據結構及其作用

  • 集合:無序元素集合,支持高效去重和成員檢測;

  • 線性結構:表、棧(LIFO)、隊列(FIFO),常用于任務調度和歷史記錄;

  • 樹結構:二叉樹、平衡樹,用于層級數據組織與快速查找;

  • 圖結構:鄰接表、鄰接矩陣,靈活表示網絡、依賴關系等。

1.4.2 常見問題類型與典型算法思路

  • 查找:順序查找、二分查找、哈希查找;

  • 排序:冒泡、插入、歸并、快速、堆排序;

  • 圖:遍歷(DFS/BFS)、最短路徑、最小生成樹;

  • 組合優化:動態規劃(背包、LCS)、分支限界;

  • 數學:質數判定、最大公約數、快速冪;

  • 幾何:凸包、掃描線。

1.4.3 算法設計一般流程

  1. 問題分析:明確輸入輸出與性能約束;

  2. 選擇技術:分治、動態規劃、貪心、回溯等;

  3. 算法描述:偽代碼或流程圖;

  4. 手動模擬:驗證正確性,修正邏輯;

  5. 實現編碼:關注可讀性與可維護性;

  6. 復雜度分析:評估時間和空間消耗;

  7. 迭代優化:基于測試與分析,持續改進性能。


1-5 拓展與演練

1.5.1 圖靈獎獲獎者與算法貢獻

  • Edsger Dijkstra:Dijkstra 最短路徑算法;

  • Donald Knuth:《算法藝術》系列與文獻規范;

  • Tony Hoare:快速排序;

  • Stephen A. Cook:NP 完全性理論;

  • Andrew Yao(姚期智):通信復雜度與偽隨機數理論;

  • Leslie Valiant:概率近似正確模型;

  • Yoshua Bengio、Geoffrey Hinton、Yann LeCun:深度學習算法發展。

1.5.2 代碼優化技巧及原因

  1. 常量計算:編譯期計算不變表達式,減少運行時開銷;

  2. 算術優化:用加減或 Horner 法則替代乘除;

  3. 位運算替代:如 x & 1 判斷奇偶,加快計算;

  4. 避免重復:緩存中間結果,減少函數調用;

  5. 共享子表達式:提高編譯器優化機會;

  6. 邏輯短路:提前終止無必要判斷;

  7. 合并循環:減少循環次數,降低控制開銷;

  8. 循環不變式外提:移出循環內不變運算;

  9. 合理條件順序:高概率分支優先,降低分支預測失敗;

  10. 嵌套循環優化:優先減少內層循環次數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78801.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中ArrayList擴容機制的解析

本文將系統地介紹 Java 中 ArrayList 的擴容機制&#xff0c;包括其初始容量的設置、觸發擴容的時機、容量增長算法、擴容的詳細流程以及性能優化建議&#xff0c;幫助讀者從源碼層面深入理解這一關鍵特性&#xff0c;并在實際開發中合理預分配容量以提升性能。 一、ArrayList…

【網絡服務器】——回聲服務器(echo)

作用 實現回聲服務器的客戶端/服務器程序&#xff0c;客戶端通過網絡連接到服務器&#xff0c;并發送任意一串英文信息&#xff0c;服務器端接收信息后&#xff0c;執行數據處理函數&#xff1a;將每個字符轉換為大寫并回送給客戶端顯示。 客戶端&#xff1a;發送字符信息 服…

智能學習空間的范式革新:基于AI驅動的自習室系統架構與應用研究

摘要 在 “互聯網 + 教育” 深度融合的背景下,傳統自習室面臨個性化服務缺失、學習效率低下等瓶頸。本文提出一種基于人工智能技術的 AI 自習室系統架構,通過構建多模態數據感知、個性化學習引擎及智能環境調控模塊,實現學習過程的精準化、智能化與沉浸式體驗。研究結合計算…

HTML01:HTML基本結構

HTML基本結構 <html> <head><meta charset"UTF-8"><title>我的第一個網頁</title> </head> <body>我的第一個網頁 </body> </html><body、</body等成對的標簽&#xff0c;分別叫開發標簽和閉合標簽單獨…

Spring Boot 實現多種來源的 Zip 多層目錄打包下載(本地文件HTTP混合)

需要將一批文件&#xff08;可能分布在不同目錄、不同來源&#xff09;打包成Zip格式&#xff0c;按目錄結構導出給用戶下載。 1. 核心思路 支持將本地服務器上的文件&#xff08;如/data/upload/xxx.jpg&#xff09;打包進Zip&#xff0c;保持原有目錄結構。支持通過HTTP下載…

【Elasticsearch】在kibana中能獲取已創建的api keys嗎?

在 Kibana 中&#xff0c;目前沒有直接的界面功能可以列出或查看已創建的 API 密鑰&#xff08;API keys&#xff09;。API 密鑰的管理和查看主要通過 Elasticsearch 的 REST API 來完成&#xff0c;而不是通過 Kibana 的管理界面。 在 Kibana 中使用 Dev Tools 查看 API 密鑰…

公司項目架構搭建者

公司項目架構搭建者分析 項目架構搭建的核心角色 #mermaid-svg-FzOOhBwW3tctx2AR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FzOOhBwW3tctx2AR .error-icon{fill:#552222;}#mermaid-svg-FzOOhBwW3tctx2AR .err…

《技術馴化情感:AI伴侶、監控與倫理框架的重構挑戰》

技術滲透與情感異化機制 情感計算技術正通過多種核心算法和數據處理方法深入人類生活&#xff0c;其在重構人類情感關系的同時也潛藏情感異化風險。本節從生物特征捕捉、行為模式誘導和認知框架重塑三方面解析情感計算的技術機理&#xff0c;并探討其導致的情感依賴現象。 生物…

32單片機——獨立看門狗

1、IWDG的簡介 IWDG&#xff1a;Independent watchdog&#xff0c;即獨立看門狗 獨立看門狗本質上是一個定時器&#xff0c;該定時器是一個12位的遞減計數器&#xff0c;當計數器的值減到0的時候&#xff0c;就會產生一個復位信號 如果在計數沒減到0之前&#xff0c;重置計數器…

[計算機網絡]數據鏈路層

408考綱(數鏈層部分): 0 概論&#xff1a;數據鏈路層都干什么事&#xff0c;提供啥功能 比物理層再高一層就是數據鏈路層&#xff0c;咱們上一篇講物理層&#xff0c;物理層直接接觸傳輸介質&#xff0c;現在數據鏈路層是使用物理層的傳輸服務&#xff0c;然后實現更多的功能。…

OpenAI大變革!繼續與微軟等,以非營利模式沖擊AGI

今天凌晨2點&#xff0c;OpenAI宣布&#xff0c;將繼續由非營利組織控制&#xff1b;現有的營利性實體將轉變為一家公共利益公司&#xff1b;非營利組織將控制該公共利益公司&#xff0c;并成為其重要的持股方。 這也就是說OpenAI曾在去年提到的由非營利性轉變成營利性公司&am…

庫存怎么管?怎樣才能做到有效的庫存管理?

說到庫存管理&#xff0c;估計大多數老板和管理者都有過“煩心事”。一方面&#xff0c;庫存過多&#xff0c;貨物堆積如山&#xff0c;堆在倉庫里也不動&#xff0c;結果占地方還占用資金&#xff1b;另一方面&#xff0c;又有可能遇到客戶急著要貨&#xff0c;可是庫存卻緊張…

Kotlin-空值和空類型

變量除了能引用一個具體的值之外,還有一種特殊的值,那就是 null, 它代表空值, 也就是不引用任何對象 在Kotlin中, 對空值的處理是非常嚴格的,正常情況下,我們的變量是不能直接賦值為 null 的,否則無法編譯通過, 這直接在編譯階段就避免了空指針問題 Kotlin中所有的類型默認都是…

[特殊字符]算法次元突破:螺旋矩陣的“能量解碼術” vs 超立方體的“維度折疊指南”

&#x1f50d; 引言 如果科幻電影中的能量矩陣是算法的考題&#xff0c;你會用螺旋指針破解它的DNA嗎&#xff1f; 如果《星際穿越》的五維空間變成編程題&#xff0c;你敢用動態規劃丈量時間的褶皺嗎&#xff1f; 今天&#xff0c;我們將化身算法世界的能量解…

高光譜相機賦能煙葉分選:精準、高效與智能化的新突破

煙草產業作為中國重要的經濟支柱&#xff0c;煙葉分選的質量與效率直接影響行業效益。傳統人工分選存在效率低、主觀性強、標準難以統一等問題&#xff0c;而機器視覺技術受限于可見光波段&#xff0c;難以捕捉煙葉深層特征。深圳中達瑞和科技有限公司推出的高光譜相機解決方案…

矩陣求導常用公式解析:標量、向量與矩陣的導數計算

矩陣求導常用公式解析&#xff1a;標量、向量與矩陣的導數計算 矩陣求導常用公式解析&#xff1a;標量、向量與矩陣的導數計算矩陣求導的布局問題1. 分子布局 vs 分母布局對比表2. 布局沖突的典型場景分析3. 混合布局的兼容性處理 一、標量對向量求導1. 線性函數求導2. 二次型函…

NocoDB:開源的 Airtable 替代方案

NocoDB:開源的 Airtable 替代方案 什么是 NocoDB?NocoDB 的主要特點豐富的電子表格界面工作流自動化應用商店程序化訪問NocoDB 的應用場景使用 Docker 部署 NocoDB1. 創建數據目錄2. 運行 Docker 容器3. 訪問 NocoDB注意事項總結什么是 NocoDB? NocoDB 是一款功能強大的開源…

全格式文檔轉 Markdown 工具,Docker 一鍵部署,支持 API 調用

以下是簡要介紹&#xff1a; 這是一款可以快速將任意文檔文件轉markdown格式內容的工具&#xff0c;提供API轉換接口&#xff0c;方便集成與應用原理就是利用libreoffice、pandoc文件轉換工具&#xff0c;把所有文檔類型的文件逐步轉化&#xff0c;最終轉成markdown格式的內容…

MATLAB繪制餅圖(二維/三維)

在數據分析與展示領域&#xff0c;餅圖是一種直觀且高效的可視化工具&#xff0c;能夠在瞬間傳遞各部分與整體的比例關系。今天&#xff0c;我將分享一段 MATLAB 繪制二維及三維餅圖的代碼&#xff0c;助你輕松將數據以餅圖形式呈現于眾人眼前。 無論是二維餅圖的簡潔明了&…

AI筆記-1

Halide Perovskites (HPs) 鹵化物鈣鈦礦 鹵化物鈣鈦礦&#xff08;HPs&#xff09;已被 公認為 光伏和發光器件 中最有前途的材料之一 在本觀點中&#xff0c;我們將探討鈣鈦礦的定義&#xff0c;主要聚焦于由 較重鹵素&#xff08;Cl、Br和I&#xff09;組成的鈣鈦礦亞群&…