算法分析:蠻力法

一、實驗目的

1 掌握蠻力法的設計思想(利用計算機去窮舉所有的可能解,再從中依次找出可行解)
2 掌握蠻力法的具體實現和時間復雜度分析
3 理解蠻力法的常見特性
實驗要求:先用偽代碼描述利用蠻力法解決的算法解決方案,再用程序實現,計算時間復雜度,記錄最終測試數據和測試結果

二、實驗內容

(1)簡短明確地寫出實驗的內容

  • (簡單)實驗內容1:計算一個整數數組中所有元素的差值。如a[0]-a[1]-…-a[n-1]。具體地,實驗通過實現一個 substraction 方法來計算數組中元素的逐步相減,最后輸出計算結果。

  • (中等)實驗內容2:來計算兩個整數的最大公約數(GCD),并將這兩個整數化簡為最簡分數。程序包括輸入驗證,確保用戶輸入有效整數,并使用歐幾里得算法提高計算效率。最后,輸出化簡后的結果。

三、問題分析

(1) 分析要解決的問題,給出你的思路,可以借助圖表等輔助表達。

  • 實驗內容一
    思路分析:
    輸入:我們有一個整數數組 a,長度為 n,即 a = [a[0], a[1], a[2], …, a[n-1]]
    計算過程:
    從數組的第一個元素 a[0] 開始,逐個從數組中每個元素中減去后續的元素。
    可以通過一個簡單的迭代來實現,從 a[0] 開始,接著依次減去 a[1], a[2], …, a[n-1]。
    輸出:輸出最終的計算結果。

  • 實驗內容二
    1.最大公約數計算:如何高效地計算兩個整數的最大公約數。
    利用循環和取余操作,可以高效地計算最大公約數。這種方法相較于簡單遍歷更高效。
    2.分數化簡:如何利用最大公約數將兩個整數化簡為最簡分數。
    通過將兩個整數分別除以它們的最大公約數,得到最簡形式的分數。
    3.用戶輸入處理:如何確保用戶輸入的是有效的整數,并處理可能的錯誤輸入。
    使用 Scanner 讀取用戶輸入,確保輸入為整數。如果輸入無效,提示用戶重新輸入。

(2)其它(你認為需要在此說明的)

邊界條件: 程序需考慮特殊情況,例如輸入為零或負數的情況。可以設置條件使得輸入必須為正整數。

四、問題解決

(1)根據對問題的分析,寫出解決辦法。

  • 實驗內容一
    我們可以通過一個循環來遍歷數組,初始值為第一個元素,然后不斷地從當前值中減去下一個元素。具體步驟如下:
    初始化 result 為數組的第一個元素 a[0]。
    從數組的第二個元素開始,依次減去每個元素,直到最后一個元素。
    輸出最終的 result。

  • 實驗內容二
    1.用戶輸入:提示用戶輸入兩個整數,并對輸入進行有效性檢查。
    2.計算最大公約數(GCD):使用歐幾里得算法來高效計算最大公約數。
    3.化簡分數:用最大公約數化簡輸入的兩個整數,輸出最簡分數形式。
    4.錯誤處理和提示:如果用戶輸入無效(如非整數、負數等),給予明確提示并要求重新輸入。

(2)描述你在進行實現時,主要的函數或操作內部的主要算法;分析這個算法的時間復雜度,并說明你設計的巧妙之處,如有創新,將其清晰的表述。

實驗內容一

1.主要函數:
在這里插入圖片描述

2.時間復雜度:
遍歷數組:我們需要遍歷整個數組 a 一次,計算每個元素的差值。具體來說,遍歷從數組的第一個元素到最后一個元素,執行減法操作。
每次操作的時間:每一次從 result 中減去一個元素,所需的時間是常數時間 O(1),因為減法操作是常數時間操作。
總時間復雜度:因為遍歷數組需要執行 n-1 次減法,其中 n 是數組的長度,因此總的時間復雜度是 O(n),其中 n 為數組的長度。

3.運行結果
在這里插入圖片描述

實驗內容二

主要函數:
在這里插入圖片描述

1.選擇最小值:首先使用三元運算符確定 m 和 n 中的較小值,賦值給 min。
2.循環查找:從 min 開始向下逐一檢查每一個整數 i,判斷 i 是否同時為 m 和 n 的因子(即 m % i == 0 且 n % i == 0)。
3.返回結果:一旦找到這樣的 i,就立即返回它作為最大公約數。如果循環結束仍未找到,則返回1(表示 m 和 n 互質)。
4.
在最壞情況下,當 m 和 n 是互質的(如 8 和 9),函數會遍歷到 min 的值,即 O(min(m, n)) 次。
因此,時間復雜度為 O(min(m, n))。

(3)運行結果截圖以及其它(你認為需要在此說明的)
在這里插入圖片描述

五、實驗結果總結

回答以下問題:

(1)通過實驗敘述你對蠻力法的理解及其優缺點

蠻力法是一種直接且簡單的解決問題的方法,通常通過枚舉所有可能的選項來尋找解決方案。在計算最大公約數時,蠻力法會逐一檢查直至找到最大的共同因子。
優點:
簡單易懂:實現代碼較為簡單,適合初學者理解。
可靠性:在小范圍內能夠保證找到正確答案。
缺點:
效率低:對于大數或復雜問題,時間復雜度較高,導致運行時間長。
資源消耗:可能需要較多的存儲和計算資源,尤其在數據量大時。

(2)請列出對你實驗中算法的改進之處。

1.使用歐幾里得算法:改用歐幾里得算法計算 GCD,可以將時間復雜度降低到 O(log(min(m, n))),提高效率。
2.提前終止:在循環中,可以引入條件,例如如果 i 的平方大于 m 或 n,則可以提前結束查找。
3.緩存計算結果:對于頻繁計算相同數對的情況,可以緩存已計算的 GCD 值,避免重復計算。

(3)列出你在本次實驗中遇到的各種問題

1.輸入驗證:在實驗過程中,遇到了如何處理無效輸入(如負數或零)的問題。
2.邏輯錯誤:在初始實現中可能出現邊界條件處理不當的情況,比如輸入相同數字時未能正確返回該數字作為 GCD。

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

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

相關文章

信息系統運行管理員:臨陣磨槍版

信息系統運行管理員考試 - 全覆蓋詳細背誦大綱 (根據考情分析和原始材料,力求完整覆蓋考點細節) 第一部分:基礎知識與運維概覽 Chapter 1: 信息系統運維概述 (上午題 5分) 信息: 含義:香農 - 減少隨機不確定性的東西&#xff1b…

Linux的進程管理和用戶管理

gcc與g的區別 比如有兩個文件:main.c mainc.cpp(分別是用C語言和C語言寫的)如果要用gcc編譯: gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C標準庫; 區別一: gcc默認只鏈接C庫&#x…

Python 常用模塊(八):logging模塊

目錄 一、引言:日志模塊在項目開發中的重要性二、從 Django 日志配置看 Logging 模塊的核心組成三、logging模塊核心組件詳解3.1 記錄器Logger3.2 級別Level3.3 根記錄器使用3.4 處理器Handler3.5 格式化器Formatter3.6 日志流3.7 日志示例 四、日志模塊總結 一、引…

Servlet原理

Servlet 體系結構的類層次關系 Servlet(接口):定義了 Servlet 的核心生命周期方法(如 init()、service()、destroy()),是所有 Servlet 的頂層規范,任何 Servlet 都需實現該接口。GenericServlet…

數據科學和機器學習的“看家兵器”——pandas模塊 之五

目錄 4.5 pandas 高級數據處理與分析 一、課程目標 二、對數據表格進行處理 (一)行列轉置 (二)將數據表轉換為樹形結構 三、數據表的拼接 (一)merge () 函數的運用 (二)concat () 函數的運用 (三)append () 函數的運用 四、對數據表格的同級運算 五、計算數據表格中數…

組合問題(去重)

40. 組合總和 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used)…

論QT6多線程技術

前言 以前我多線程使用傳統的繼承qthread重寫run()或者繼承qrunable類把對象丟到線程池解決。經過昨天的面試讓我了解到新的技術&#xff0c;我之前看到過只不過沒有詳細的去了解movetotread技術&#xff0c;這個技術是qt5推出的&#xff0c;qt6還在延續使用 代碼結構 以下是…

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端點&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;網絡中的關鍵組件&#xff0c;用于處理 VXLAN 流量的封裝和解封裝。以下以可讀的 Markdown 格式詳細解釋 VTEP 的定義、功能、實現方式以…

antdv3 Tabs.TabPane 右上角增加一個角標Badge

1、Tabs官方說明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角標官方效果圖 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要實現的效果 4、代碼 <Tabs v-m…

淺析 Spring 啟動過程:從源碼到核心方法

淺析 Spring 啟動過程&#xff1a;從源碼到核心方法 一、Spring 注解方式啟動類 Demo二、Spring 啟動過程源碼解析?AnnotationConfigApplicationContext構造函數refresh()方法詳解 三、refresh()的核心方法/步驟obtainFreshBeanFactory() - 獲取Bean工廠prepareBeanFactory(be…

貝葉斯優化Transformer融合支持向量機多變量回歸預測,附相關性氣泡圖、散點密度圖,Matlab實現

貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現 目錄 貝葉斯優化Transformer融合支持向量機多變量回歸預測&#xff0c;附相關性氣泡圖、散點密度圖&#xff0c;Matlab實現效果一覽基本介紹程序設計參考資料…

智慧化系統安全分析報告

智慧化系統的安全背景與現狀 一、政策法規背景 &#xff08;一&#xff09;全球主要國家/地區政策對比 地區政策名稱核心內容實施時間特點中國《生成式人工智能服務管理暫行辦法》明確服務提供者責任&#xff0c;強調數據合法、隱私保護&#xff0c;禁止生成違法內容2023年8…

【學習筆記】點云自動化聚類簡要總結

聚類是將將具有相似特征劃分為相同點集的操作。 基于空間鄰近性的方法 核心思想&#xff1a;依據點的空間距離進行分組 歐式聚類&#xff08;DBSCAN&#xff0c;KD-tree) 原理&#xff1a;基于半徑搜索和最小點數擴展簇。 優點&#xff1a;適應不規則形狀&#xff0c;無需預…

全志F10c200開發筆記——移植uboot

相關資料&#xff1a; &#xff08;二&#xff09;uboot移植--從零開始自制linux掌上電腦&#xff08;F1C200S)&#xff1c;嵌入式項目&#xff1e;-CSDN博客 F1C200S挖坑日記&#xff08;3&#xff09;——Uboot編譯篇_f1c200s uboot-CSDN博客 一、安裝編譯器 Linaro Rele…

常見WEB漏洞----暴力破解

什么是暴力破解 暴力破解 (Brue Force) 是一種攻擊方法 (窮舉法)&#xff0c;簡稱為“爆破”&#xff0c;黑客通過反復猜解和實驗&#xff0c;旨在以暴力手段登入、訪問目標主機獲取服務&#xff0c;破壞系統安全&#xff0c;其屬于 ATT&CK技術中的一種&#xff0c;常利用…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令變體4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…

2.安卓逆向2-adb指令

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

Obsidian Callouts標注框語法

Obsidian 從 0.14 版本開始原生支持 Callouts&#xff1a; 語法基于 Markdown 引用塊&#xff08;>&#xff09;擴展&#xff1a; 語法格式如下&#xff1a; > [!類型] 可選標題 > 內容支持 **Markdown 格式**、[[內部鏈接]] 和嵌入文件。預覽 可選類型一覽&#xf…

nt!MiAllocateWsle函數分析之設置Wsle[WorkingSetIndex]

第一部分&#xff1a; 1: kd> p nt!MiAddValidPageToWorkingSet0xa9: 80a83c13 e8da9afcff call nt!MiAllocateWsle (80a4d6f2) 1: kd> t nt!MiAllocateWsle: 80a4d6f2 55 push ebp 1: kd> dv WsInfo 0x8953a1f8 PointerPte …

docker 命令操作大全

1 Docker Hello World 簡單命令 docker run ubuntu:15.10 /bin/echo "Hello world" docker run&#xff1a;啟動一個新容器。 ubuntu:15.10&#xff1a;使用的 Docker 鏡像&#xff08;Ubuntu 15.10 版本&#xff09;。 Docker 首先從本地主機上查找鏡像是否存在&a…