數據結構與算法學習(1)

#學習自用#

算法性能分析

時間復雜度O()

時間復雜度就是算法計算的次數。

for(int i=0;i<=n;i++)
{ans++;
}
ans++;

這串代碼時間復雜度為O(n),實際時間復雜度為O(n+1)。如果把i++改為i+=2,時間復雜度仍然為為O(n),實際時間復雜度變為O(n/2 +1)。時間復雜度比較像極限里面的抓大頭,實際時間復雜度就是字面意思很好理解。

常見的時間復雜度:如果是有限次數的都是O(1)、O(log n)、O(n*log n)、O(n)、O(n^2)、O(n^2)。

空間復雜度

處理算法時,額外產生的空間。

cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int j=n-1;j>0;j--){for(int i=0;i<n-1;i++){if(a[i]>a[i+1]){swap(a[i],a[i+1]);
}
}
}

在這個冒泡排序算法中,a[i] 是儲存原始數據所需要的數組所以不算在額外空間中,而算法的部分看似沒有額外的變量,實際上是需要一個臨時變量來存儲數據以實現交換的,只需要有限的額外空間,空間復雜度為O(1)。

常見的空間復雜度:O(1)、O(log n)、O(n*log n)

穩定性

通常指的是排序算法的一種特性。在排序算法中,如果兩個相等的元素在排序前后的相對位置保持不變,那么這個算法就是穩定的。

高精度計算

用于處理可能會越界的大數。

高精度加法

這里我們需要用到string和整型數組的特性,string作為字符串變量不管怎么輸入都不會越界,而整型數組可以用每個元素儲存一個數字。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{for (int i = 0; i < s.size(); i++){a[s.size() - 1 - i] = s[i] - '0';//將數字反轉存入數組,目的是將個位對齊。}
}
int main()
{string s1, s2;int a[100] = {}, b[100] = {}, c[100] = {};cin >> s1 >> s2;StrtoInt(s1, a);StrtoInt(s2, b);int la = s1.size(), lb = s2.size();int lc = max(la, lb) + 1;//計算結果可能的最大位數int CarryBit = 0;//設置進位for (int i = 0; i < lc; i++){c[i] = a[i] + b[i]+CarryBit;if (c[i] >= 10){c[i] -= 10;CarryBit = 1;}elseCarryBit = 0;}while (c[lc - 1] == 0 && lc > 1)lc--;for (int i = 0; i < lc; i++){cout << c[lc - 1 - i];}cin.get();
}

將字符1賦值給int類型,本質上是把字符1的ASC碼值賦值給變量,得到整型的數字就需要把數字字符與字符0相減。將數字反轉存放是為了使各個數位上的數字對齊,如果不反轉,需要想辦法在數位更低的數組,在其數字最高位前面補零,相當麻煩 。while (c[lc - 1] == 0 && lc > 1)是為了去除前置零,即最高位為0時,將輸出位數減少。

高精度減法

這里依舊使用string與數組的特性。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{for (int i = 0; i < s.size(); i++){a[s.size() - 1 - i] = s[i] - '0';//將數字反轉存入數組,目的是將個位對齊。}
}
bool MyStrcmp(const string& str1,const string& str2)
{if (str1.size() != str2.size())//位數不同return str1.size() > str2.size();elsereturn str1 > str2;//位數相同
}
int main()
{string A, B;int a[100] = {}, b[100] = {}, c[100] = {};cin >> A >> B;if (MyStrcmp(A, B)){StrtoInt(A, a);StrtoInt(B, b);}else{StrtoInt(B, a);StrtoInt(A, b);cout << '-';}//保證更大的數字賦值給數組a//執行減法int lc = max(A.size(), B.size());for (int i = 0; i < lc; i++){if (a[i] - b[i] >= 0)c[i] = a[i] - b[i];else{a[i + 1] -= 1;c[i] = 10 + a[i] - b[i];}}//反轉輸出,去前置零while (c[lc - 1] == 0 && lc > 1)lc--;for (int i = 0; i < lc; i++)cout << c[lc - 1 - i];cin.get();
}

與加法不同,減法需要考慮從高位退位,以及相減為負數的情況。相減為負數時,負數的值依舊是大數減去小數,而符號我們可以提前輸出,如果不這樣處理,輸出的高位以及輸出中間都可能出現負數。

不管是加法還是減法都記得把在數組定義時初始化,否則數組中全是一些隨機數,如果被減數與減數位數不同,不將數組初始化,c[i]=a[i]-b[i]運行到隨機數出現的地方出錯。

高精度乘法

#include<iostream>
#include<string>
using namespace std;
void StrtoInt(const string&s,int* a)
{for (int i = 0; i < s.size(); i++){a[s.size() - 1 - i] = s[i] - '0';//將數字反轉存入數組,目的是將個位對齊。}
}
int main()
{string A, B;int a[100] = {}, b[100] = {}, c[100] = {};cin >> A >> B;StrtoInt(A, a);StrtoInt(B, b);int la = A.size(), lb = B.size(),lc=la+lb;for(int j=0;j<lb;j++)for (int i = 0; i < la; i++){c[i + j] += a[i] * b[j];}for (int i = 0; i < lc - 1; i++){c[i + 1] += (c[i] / 10);c[i] %= 10;}while (c[lc - 1] == 0 && lc > 1)lc--;for (int i = 0; i < lc; i++)cout << c[lc - 1 - i];cin.get();
}

高精度乘法的關鍵是確定相乘后最多有幾位,這里通過一個例子來理解,結果位數越多代表結果越大,而要得到最大的乘積,兩個乘數也必須是最大的,例如9x9=81,這里乘積的位數是兩個乘數位數之和,通過數學歸納法我們可以知道,乘積的位數最多是兩個乘數位數之和。

高精度除法

準確來說是高精度除以低精度。

#include<iostream>
#include<string>
using namespace std;
void StrtoInt2(const string& s, int* a)
{for (int i = 0; i < s.size(); i++){a[i] = s[i] - '0';}
}
int main()
{string A;int B;int a[100] = {}, c[100] = {};cin >> A;cin >> B;StrtoInt2(A, a);int lc=0;int la = A.size();int temp = 0;//記錄余數for (int i = 0; i < la; i++){c[i]=a[i] / B;temp=(a[i] % B);a[i + 1] += temp * 10;}while (c[lc] == 0 && lc < la)lc++;for (int i = lc; i < la; i++)cout << c[i];cout <<endl<< temp;
}

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

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

相關文章

云原生技術架構詳解

云原生技術最全詳解(圖文全面總結) 容器技術 容器技術&#xff1a;是將應用程序、及其所有依賴項&#xff0c;打包到一個獨立的、可移植的容器中。 如下圖所示: 容器技術的實現&#xff0c;最典型的就是以Docker為代表的。 如下圖所示&#xff1a; 主要解決&#xff1a; 1、…

AI常見名詞盤點(持續更新)

目錄 知識庫 知識庫的定義 知識庫的分類 AI知識庫的特點 小結 Embedding 向量化表示 維度降低 語義關系 小結 提示詞工程&#xff08;Prompt Engineering&#xff09; 定義 目的與應用 關鍵性質 工程化思想 應用示例 小結 RAG 檢索增強生成 定義與重要性 RA…

Ubuntu設置nacos開機以單機模式自啟動

首先&#xff0c;需要安裝jdk Ubuntu 安裝JDK 創建Systemd服務單元文件 sudo vim /etc/systemd/system/nacos.service按i進入編輯模式&#xff0c;寫入下面信息 [Unit] Descriptionnacos server Afternetwork.target[Service] Typeforking Environment"JAVA_HOME/opt/j…

Java8 - Optional 處理可能為空值的容器類

1. 創建一個 Optional 對象 Optional.of、Optional.ofNullable 、Optional.empty是Optional類的三個靜態方法&#xff0c;用于創建Optional對象。 1. Optional.of 方法 Optional.of 方法用于創建一個包含非空值的Optional對象&#xff0c;如果傳入的值為null&#xff0c;則會…

Kafka集群安裝部署

簡介 Kafka是一款分布式的、去中心化的、高吞吐低延遲、訂閱模式的消息隊列系統。 同RabbitMQ一樣&#xff0c;Kafka也是消息隊列。不過RabbitMQ多用于后端系統&#xff0c;因其更加專注于消息的延遲和容錯。 Kafka多用于大數據體系&#xff0c;因其更加專注于數據的吞吐能力…

用freertos后NVIC里系統時鐘部分報錯,如何解決?

&#x1f3c6;本文收錄于《CSDN問答解答》專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&…

百日筑基第十天-重溫Spring

百日筑基第十天-重溫Spring Spring AOP 也就是 Aspect-oriented Programming&#xff0c;譯為面向切面編程&#xff0c;是計算機科學中的一個設計思想&#xff0c;旨在通過切面技術為業務主體增加額外的通知&#xff08;Advice&#xff09;&#xff0c;從而對聲明為**“切點”…

YOLOv8模型調參---數據增強

目錄 1.數據預處理 2.數據增強 2.1 數據增強的作用 2.2 數據增強方式與適用場景 2.2.1離線增強&#xff08;Offline Augmentation&#xff09; 2.2.2 在線增強&#xff08;Online Augmentation&#xff09; 3. 數據增強的具體方法 4. YOLOv8的數據增強 4.1 YOLOv8默認…

Http 實現請求body體和響應body體的雙向壓縮方案

目錄 一、前言 二、方案一(和http header不進行關聯) 二、方案二(和http header進行關聯) 三、 客戶端支持Accept-Encoding壓縮方式,服務器就一定會進行壓縮嗎? 四、參考 一、前言 有時請求和響應的body體比較大,需要進行壓縮,以減少傳輸的帶寬。 二、方案一(和…

《信息記錄材料》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答 問&#xff1a;《信息記錄材料》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。 問&#xff1a;《信息記錄材料》級別&#xff1f; 答&#xff1a;國家級。主管單位&#xff1a;全國磁性記錄材料信息站 主辦單位…

Oracle PL / SQL 函數

FUNCTION是返回值的PL / SQL塊或方法&#xff0c;因此它可以在賦值的右側使用。這里是一個例子&#xff1a; n_value : to_number(123.45); 由于FUNCTION返回一個值&#xff0c;因此也可以在SQL語句中使用它&#xff0c;如下例所示&#xff1a; select to_number(1) from dual;…

社區活動|FlowUs知識庫的發展|先進技術的落地應用|下一代生產力工具你用了嗎

在當今快速發展的數字化時代&#xff0c;技術的進步不斷推動著工作方式和知識管理的革新。FlowUs&#xff0c;作為一款前沿的知識管理和協作平臺&#xff0c;正站在這一變革的浪潮之巔&#xff0c;引領著智能工作的新潮流。 智能化的智能學習引導工具 FlowUs不僅僅是一個工具&…

Windows系統常用工具及命令和bat文件介紹

常用的windos工具 命令工具名稱描述powershellwindows的shell工具eventvwr事件查看器可以查看系統日志taskmgr任務管理器查看已經運行的進程和性能、應用歷史記錄、開機啟動等信息services.msc服務管理可以查看本地的服務regedt注冊表編輯器mstsc遠程桌面連接devmgmt.msc設備管…

昇思25天學習打卡營第7天|深度學習流程全解析:從模型訓練到評估

目錄 構建數據集 定義神經網絡模型 定義超參、損失函數和優化器 超參 損失函數 優化器 訓練與評估 構建數據集 首先從數據集 Dataset加載代碼&#xff0c;構建數據集。 代碼如下&#xff1a; #引入了必要的庫和模塊&#xff0c;像 mindspore 以及相關的數據處理模塊等等。…

Vue2-Vue Router前端路由實現思路

1.路由是什么&#xff1f; Router路由器&#xff1a;數據包轉發設備&#xff0c;路由器通過轉發數據包&#xff08;數據分組&#xff09;來實現網絡互連 Route路由&#xff1a;數據分組從源到目的地時&#xff0c;決定端到端路徑的網絡范圍的進程 | - 網絡層 Distribute分發…

無人機5公里WiFi低延遲圖傳模組,抗干擾、長距離、低延遲,飛睿智能無線通信新標桿

在科技日新月異的今天&#xff0c;我們見證了無數通信技術的飛躍。從開始的電報、電話&#xff0c;到如今的4G、5G網絡&#xff0c;再到WiFi的廣泛應用&#xff0c;每一次技術的革新都極大地改變了人們的生活方式。飛睿智能5公里WiFi低延遲圖傳模組&#xff0c;它以其獨特的優勢…

jQuery入門案例

以下是一些 jQuery 學習的案例&#xff0c;涵蓋了基本的選擇器、事件處理、動畫效果、AJAX 請求以及插件使用。這些案例可以幫助你更好地理解和掌握 jQuery 的核心功能。 案例1&#xff1a;基本選擇器和操作 在這個案例中&#xff0c;我們將使用 jQuery 選擇器選擇頁面中的元…

2024上半年熱門網絡安全產品和工具TOP10

今年上半年&#xff0c;利用生成式人工智能&#xff08;GenAI&#xff09;的網絡安全工具繼續激增。許多供應商正在利用GenAI的功能來自動化安全運營中心&#xff08;SOC&#xff09;的工作&#xff0c;特別是在自動化日常活動方面&#xff0c;如收集威脅信息和自動創建查詢。 …

爬蟲-Python基礎

一、Python環境的安裝 1. 下載Python 訪問Python官網: Welcome to Python.org點擊downloads按鈕&#xff0c;在下拉框中選擇系統類型(windows/Mac OS/Linux等)選擇下載最新版本的Python 2. 安裝Python 雙擊下載好的Python安裝包勾選左下角 Add Python 3.7 to PATH 選項&…

動手學Avalonia:基于SemanticKernel與硅基流動構建AI聊天與翻譯工具

Avalonia是什么&#xff1f; Avalonia是一個跨平臺的UI框架&#xff0c;專為.NET開發打造&#xff0c;提供靈活的樣式系統&#xff0c;支持Windows、macOS、Linux、iOS、Android及WebAssembly等多種平臺。它已成熟并適合生產環境&#xff0c;被Schneider Electric、Unity、Jet…