【數據結構】2算法及分析

0

章節

1.4到1.5小節。

掌握算法概念、特性、描述、算法性能時間復雜度和空間復雜度;

理解遞歸含義?

掌握實現遞歸的條件和時機;

應用簡單遞歸問題的算法設計;

重點

算法概念與特征,算法表示;

難點

算法的分析與算法設計;

遞歸算法的理解與使用;

作業或思考題

作業2:算法設計與表達

內容達成以下標準(考核點):

????????理解與陳述算法概念;

????????理解并設計與表達算法:設計算法,使用工具表達,分析算法

算法設計與實現作業

摘要: 本文旨在為求1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和,設計算法,并分別使用自然語言、N-S圖,偽代碼來表示。分析算法的時間和空間效率, 和評價算法,然后使用java 完成算法的實現。

關鍵詞:算法設計;評價;Java實現;

abstract

The purpose of this article is to design an algorithm to calculate the sum of the series 1 + (1+2) + (1+3) + (1+2+4) + (1+3+5) + ... + (1+2+...+2n) + (1+3+5+...+2n-1). The algorithm will be represented using natural language, an N-S diagram, and pseudo?code. The time and space efficiency of the algorithm will be analyzed, and the algorithm will be evaluated. Finally, the algorithm will be implemented in Java.

Keywords: Algorithm Design; Evaluation; Java Implementation

1 實現方法一

1.1算法表示

1.1.1自然語言表示

1.創建一個變量sum并將其初始化為0,用于保存總和。

2.使用for循環從1迭代到n,迭代變量i表示當前迭代的數字。

3.在每次迭代開始時,創建兩個臨時變量s1和s2,分別用于保存奇數項和偶數項的和,并將它們初始化為0。

4.判斷i是否大于1,如果是,則計算s1的值為(i-1) * (i-1) + i,表示從1到2n-1的所有奇數的和,如果不是,則s1保持為0。

5.計算s2的值為i * i,表示從1到2n的所有偶數的和。

6.將s1和s2分別累加到總和sum中。

7.循環結束后,返回總和sum作為最終結果。

1.1.2 N-S圖表示

1.1.3偽代碼表示

輸入:n

輸出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和

????function calculateSum(n):

????sum = 0

????for i from 1 to n:

????????s1 = 0

????????s2 = 0

????????if i > 1:

????????????s1 = (i-1)^2 + i

????????s2 = i^2

????????sum += s1 + s2

????return sum

1.2算法分析

時間復雜度分析:外層循環迭代n次,所以時間復雜度為O(n)。內部計算s1和s2的操作是常數時間的,不會隨輸入規模變化,因此對時間復雜度沒有影響。

空間復雜度分析:算法使用了常數個變量來保存中間結果,所以空間復雜度為O(1),即為常數級別。不會隨輸入規模變化。

1.3算法實現

public class Algorithm {public static int calculateSum(int n) {int sum = 0;for (int i = 1; i <= n; i++) {int s1 = 0;int s2 = 0;if (i > 1){s1 = (i-1) * (i-1) ?+ i;//單獨的和, 偶數項}s2 = i * i;//單獨的和, 奇數項sum += s1 + s2;}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("當n=" + n + "時,sum=" + result);}
}

1.4算法總結

????????該算法是一個簡單直觀的解決方案,它通過循環迭代計算每一項的和,并將其累加到總和中。由于只有一個循環,算法的時間復雜度是線性的,具有較好的效率。同時,算法的空間復雜度也是常數級別的,節省了內存的使用。總體而言,這個算法是一個有效且可行的解決方案。

2實現方法二

2.1算法表示

2.1.1自然語言表示

1.初始化兩個數組s1和s2,長度為n。

2.對于從1到n的每個數i:

如果i大于1,計算s1[i-1]的值為 (i-1) * (i-1) + i。

計算s2[i-1]的值為 i * i。

3.定義變量sum并初始化為0。

4.對于數組s1和s2的每個索引i:

將s1[i]和s2[i]的值累加到sum上。

5.返回sum作為結果。

2.1.2N-S圖表示

2.1.3偽代碼表示

輸入:n

輸出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和

function calculateSum(n):

????s1 = new int[n]

????s2 = new int[n]

????for i = 1 to n:

????????if i > 1:

????????????s1[i-1] = (i-1) * (i-1) + i

????????s2[i-1] = i * i

????sum = 0

????for i = 0 to n-1:

????????sum += s1[i]

????????sum += s2[i]

????return sum

2.2算法分析

時間復雜度分析:該算法的時間復雜度為O(n),其中n是輸入的參數。因為算法包含兩個for循環,兩個循環的迭代次數都是n。

空間復雜度分析:該算法的空間復雜度為O(n),其中n是輸入的參數。因為算法使用了兩個長度為n的數組s1和s2來存儲中間結果。此外,還有幾個整型變量用于計算和累加過程,它們的空間占用可以忽略不計。

2.3算法實現

public class Algorithm {public static int calculateSum(int n) {int[] s1 = new int[n];int[] s2 = new int[n];for (int i = 1; i <= n; i++) {if (i > 1){s1[i-1] = (i-1) * (i-1) + i; // 計算s1的值}s2[i-1] = i * i; // 計算s2的值}int sum = 0;for (int i = 0; i < n; i++) {sum += s1[i] + s2[i]; // 累加s1和s2的值}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("當n=" + n + "時,sum=" + result);}
}

?2.4算法總結

算法優點:?這個算法有效地解決了問題,具有線性時間復雜度,適用于大多數輸入規模。它的實現相對簡單,易于理解。

算法缺點: 該算法使用了額外的空間來存儲兩個數組s1和s2,這可能會在輸入規模很大的情況下導致內存消耗較大。如果對空間效率有更高的要求,可以考慮在計算過程中動態生成s1和s2的值而不存儲它們。

總的來說,這個算法是一個有效的解決方案,適用于大多數情況,但在某些特定情況下,可能需要優化空間復雜度。

總結性分析:

第二個算法的優點在于將括號內部的和分別存放在兩個數組中,方便計算和累加。但是它的缺點在于需要占用較多的空間,且計算s1的時候會產生一定的重復計算。

而第一個算法則沒有使用數組,而是在每次循環的過程中直接計算出s1和s2并進行累加,避免了數組帶來的空間占用和計算重復的問題。但是其缺點在于代碼可讀性不如第一個算法。

參考文獻

[1] 王紅梅, 黨源源, 劉冰. 數據結構--從概念到Java實現[M]. 清華大學出版社, 2019.

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

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

相關文章

【一起學Rust | Tauri2.0框架】基于 Rust 與 Tauri 2.0 框架實現軟件開機自啟

文章目錄 前言 一、準備工作1.1 環境搭建1.2 創建 Tauri 項目1.3 添加依賴 二、實現開機自啟的基本原理2.1 開機自啟的基本概念2.2 Tauri 應用的生命周期 三、Windows 平臺實現3.1 Windows 注冊表機制3.2 實現步驟3.3 注意事項 四、Linux 平臺實現4.1 Linux systemd 服務4.2 實…

一周熱點-OpenAI 推出了 GPT-4.5,這可能是其最后一個非推理模型

在人工智能領域,大型語言模型一直是研究的熱點。OpenAI 的 GPT 系列模型在自然語言處理方面取得了顯著成就。GPT-4.5 是 OpenAI 在這一領域的又一力作,它在多個方面進行了升級和優化。 1 新模型的出現 GPT-4.5 目前作為研究預覽版發布。與 OpenAI 最近的 o1 和 o3 模型不同,…

css中的浮動

在 CSS 中&#xff0c;浮動&#xff08;float&#xff09;是一種定位元素的方式&#xff0c;它允許元素脫離正常的文檔流&#xff0c;并向左或向右移動&#xff0c;直到其邊緣碰到包含塊或者另一個浮動元素的邊緣。下面從多個方面詳細介紹 CSS 浮動&#xff1a; 一&#xff0c…

element-plus中form表單組件的使用

1.如何讓每個表單項對齊&#xff1f; 問題描述&#xff1a;如下圖&#xff0c;每個表單項的輸入框/下拉框/日期選擇器是沒有對齊的&#xff0c;我們希望它們縱向是對齊的。 解決方案&#xff1a;給el-form標簽&#xff0c;加上label-width"100px"即可。意思就是給每個…

線性搜索算法

何時使用線性搜索算法&#xff1f; 當處理一個小數據集時。當搜索存儲在連續內存中的數據集時。 線性搜索算法在什么情況下優于其他搜索算法&#xff1f; 當列表或數組未排序時&#xff0c;或者當輸入的大小相對較小時&#xff0c;首選線性搜索算法。它易于實現&#xff0c;并…

踩坑記錄:yolov5環境版本要求比較嚴苛?

在安裝yolov5環境時&#xff0c;numpy安裝失敗報錯metadata-generation-failed 報錯如下&#xff1a; Collecting numpy1.18.5 (from -r /*****/yolov5-5.0/requirements.txt (line 5))Using cached https://pypi.tuna.tsinghua.edu.cn/packages/01/1b/d3ddcabd5817be02df0e6…

Java設計模式系列:單例模式的7種實現與適用場景

一、單例模式核心價值與實現原則 1. 使用場景 全局配置類(如數據庫連接池)日志記錄器Spring默認Bean作用域硬件設備訪問(如打印機)2. 設計三原則 私有構造器:禁止外部實例化靜態實例持有:全局唯一訪問點延遲加載(可選):避免資源浪費二、七種單例實現方式深度解析 1.…

OpenManus-通過源碼方式本地運行OpenManus,含踩坑及處理方案,chrome.exe位置修改

前言&#xff1a;最近 Manus 火得一塌糊涂啊&#xff0c;OpenManus 也一夜之間爆火&#xff0c;那么作為程序員應該來嘗嘗鮮 1、前期準備 FastGithub&#xff1a;如果有科學上網且能正常訪問 github 則不需要下載此軟件&#xff0c;此軟件是提供國內直接訪問 githubGit&#…

【最新】DeepSeek 實用集成工具有那些?

deepseek 系列github倉庫地址 【主頁】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重點介紹】awesome-deepseek-integration 注意&#xff1a;以下內容來自awesome-deepseek-integration DeepSeek 實用集成&#xff08;awesome-deepseek-integration&#xff09; 將…

開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器

開源&#xff01;速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器 目錄 開源&#xff01;速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器本項目未經授權&#xff0c;禁止商用&#xff01;本項目未經授權&#xff0c;禁止商用&#xff01;本項目未經授權&…

Flink測試環境Standalone模式部署實踐

1.JDK環境 參考官方文檔&#xff1a; https://nightlies.apache.org/flink/flink-docs-release-1.20/release-notes/flink-1.18/ 2.下載Flink&#xff1a;https://flink.apache.org/downloads/ 本次驗證用的是&#xff1a;https://www.apache.org/dyn/closer.lua/flink/flink…

在16卡服務器上使用最新版的CUDA和驅動訓練`llama - 2 - 7b`和`llama - 2 - 70b`模型,并生成訓練指標數據

要在16卡服務器上使用最新版的CUDA和驅動訓練llama - 2 - 7b和llama - 2 - 70b模型&#xff0c;并生成訓練指標數據&#xff0c;你可以按照以下步驟進行&#xff1a; 1. 環境準備 確保你的服務器已經安裝了最新版的CUDA和驅動&#xff0c;并且安裝了必要的Python庫&#xff0…

macOS 終端優化

macOS 安裝、優化、還原、升級 Oh My Zsh 完全指南 &#x1f680; Oh My Zsh 是 macOS 終端增強的利器&#xff0c;它能提供強大的自動補全、主題定制和插件支持&#xff0c;讓你的終端更高效、更炫酷。本文將全面介紹 如何安裝、優化、還原、重新安裝和升級 Oh My Zsh&#x…

計算機網絡--訪問一個網頁的全過程

文章目錄 訪問一個網頁的全過程應用層在瀏覽器輸入URL網址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通過DNS獲取IP地址生成HTTP請求報文應用層最后 傳輸層傳輸層處理應用層報文建立TCP連接傳輸層最后 網絡層網絡層對TCP報文進行處…

CAAC無人機考證備考清單

一、培訓機構內部的考試大綱/備考指南 《機長筆試大綱》 《機長口試大綱》 《教員筆試大綱》 《教員口試大綱》&#xff08;不同機構的文件、命名可能不同&#xff09; 二、培訓機構內部題庫 題庫內容包含(仿照多旋翼題庫制作&#xff09;&#xff1a; 分類 子分…

【BUG】類文件具有錯誤的版本 61.0, 應為 52.0,請刪除該文件或確保該文件位于正確的類路徑子目錄中。

報錯&#xff1a; [ERROR] 類文件具有錯誤的版本 61.0, 應為 52.0 [ERROR] 請刪除該文件或確保該文件位于正確的類路徑子目錄中。 報錯截圖&#xff1a; 原因&#xff1a;Java 版本和 Spring 不兼容&#xff0c;顯示 Spring 版本過高 解決方法 1. 使用更高版本的 J…

卷積神經網絡(筆記01)

視覺處理三大任務&#xff1a;分類、目標檢測、圖像分割 CNN網絡主要有三部分構成&#xff1a;卷積層&#xff08;Convolutional Layer&#xff09;、池化層&#xff08;Pooling Layer&#xff09;和激活函數 一、解釋卷積層中的偏置項是什么&#xff0c;并討論在神經網絡中引…

Django-ORM-prefetch_related

Django-ORM-prefetch_related 模型定義N1 查詢問題示例 使用 prefetch_related 優化查詢處理更復雜的查詢示例&#xff1a;預取特定條件的書籍示例&#xff1a;預取多個關聯字段 性能比較注意事項總結 通過 Author 和 Books 兩個模型來理解 Django 的 prefetch_related 方法。 …

Spring Boot3整合Knife4j(4.5.0)

整體概述 Spring Boot 是用于簡化 Spring 應用開發的框架&#xff0c;通過自動配置和約定大于配置原則&#xff0c;能讓開發者快速搭建和運行 Spring 應用。Knife4j 是基于 Swagger 增強的 API 文檔生成工具&#xff0c;可方便展示和調試 API 接口&#xff0c;生成美觀易用的 …

Java 大視界 -- 區塊鏈賦能 Java 大數據:數據可信與價值流轉(84)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…