復雜度和順序表(雙指針方法)

目錄

目錄

目錄

前言:

一、時間復雜度和空間復雜度

1.1概念

1.2規則

二、順序表

2.1靜態順序表

2.2動態順序表

三、雙指針法

四、總結


前言:

????????時間復雜度和空間復雜度是用于判斷算法好壞的指標,程序性能的核心指標。時間復雜度主要衡量?個算法的運?快慢,?空間復雜度主要衡量?個算法運?所需要的額外空間。

一、時間復雜度和空間復雜度

1.1概念

? ? ? ? 時間復雜度:算法的時間復雜度是?個函數式T(N)。T(N)=執行次數,而時間復雜度就是表示執行次數的增長量。而我們復雜度的表?通常使??O的漸進表?法。遞歸算法時間度=單次遞歸的時間復雜度*遞歸次數(這里遞歸過程中函數創建是沒有執行次數的,只有計算過程才會執行,我們算的就是計算次數也就是執行次數。而我們可以用遞歸次數來等效替換執行次數,因為遞歸了多少次,那就要算多少次)

? ? ? ? 空間復雜度:空間復雜度指的是該算法所需要開辟的空間(這里開辟的空間指的是需要的算法開辟空間,而外部函數不算里面)。

以上是復雜度函數圖。?\log _{2}^{}\textrm{n}或者其他在復雜度圖中都是以logn或者lg表示。

1.2規則

? ? ? ? 1.在T(N)表示式中,T(N)=N^{2}+N+1,時間復雜度只會取最具有影響的參數,這里保留最高階項,在這里最高是N^{2},所以復雜度為O(N^{2})。

? ? ? ? 2.如果最高階項數不是1,以1來算,因為到后面最高階項數對最高階項影響越來越小了。如T(N)=\frac{1}{2}N^{2}+N+1,最終時間復雜度為O(N^{2})。

? ? ? ? 3.如果在T(N)表示式中只有常數,T(N)=1000,那么統一時間復雜度為O(1)。注意:這里無論是多少萬甚至多少億,統一時間復雜度都為O(1),這里時間復雜度就是表示增長量,而不是數量多少。

? ? ? ? 4.對于不確定的因素統一以最高來算,這里不確定因素主要是不確定T(N)表達式的確定值,可能受到外界變量影響(受元素大小影響,如排序這些),可能T(N)=\frac{1}{2}N^{2}也可能為\frac{_{1}}{4}N^{2},也可能為N^{2},還有可能為N,那就以最高來算也就是時間復雜度為O(N^{2})。

空間復雜度和時間復雜度規則一模一樣,因為都是根據一個函數來計算的,函數數據是一樣的。

void unc(int n)
{int cnt = 1;while (cnt < n){cnt *= 2;}
}

?這里根據規律得:O(N)=\log _{2}^{}\textrm{n}

二、順序表

2.1靜態順序表

????????順序表底層原理就是數組,因此物理結構上和邏輯結構上都是線性的。,靜態數組是有確定的空間,不能改變空間。

2.2動態順序表

? ? ? ? 而動態順序表,可以擴容空間,可以根據需求,擴容空間以達到想要的效果。

接下來可以根據我們對于動態順序表進行初始化:

//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

擴容:

//擴容空間
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size)//擴容條件{int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//防止空間為0,用三目操作符來擴容加判斷SLDateType* tmp = realloc(ps->arr, newcapacity * sizeof(SLDateType));//擴容if (tmp == NULL){perror("realloc");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}

尾插:

//尾插
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);//防空//空間不夠SLCheckCapacity(ps);//空間夠ps->arr[ps->size++] = x;
}

頭插:

//頭插
void SLPushFront(SL* ps, SLDateType x)
{assert(ps);//空間不夠SLCheckCapacity(ps);//空間夠for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}

?任意插:

//任意插
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//空間不夠SLCheckCapacity(ps);//空間夠for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

尾刪:

//尾刪
void SLPopBack(SL* ps)
{assert(ps);ps->size--;
}

?頭刪:

//頭刪
void SLPopFront(SL* ps)
{assert(ps&& ps->size != 0);for (int i = 0; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

任意刪:

//任意刪
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

三、雙指針法

????????一般遇到算法題,我們會選擇暴力解題,這是最簡單的方法,而對于有時間復雜度要求的題目我們也可以使用用空間換時間(創建新數組來換),而有一種方法是既可以將時間復雜度降下來,也不用使用空間換時間。這種方法就是雙指針法

用一道題來舉例:26. 刪除有序數組中的重復項 - 力扣(LeetCode)

int removeDuplicates(int* nums, int numsSize) {int dest = 0; int src = dest + 1;while (src != numsSize){if(nums[dest]!=nums[src]&&++dest != src)//既能++,也能避免重復交換根據&&短路{nums[dest] = nums[src];}src++;}return dest+1;
}

?這個雙指針,可以用于需要對比,并且還需要篩選不同的數據。該方法能夠用2個變量來降低復雜度。

四、總結

順序表在這樣的結構中,可以便捷地在數組上執行數據的增加、刪除、查找以及修改等操作。通過這種連續存儲的特性,順序表能夠高效地訪問元素,尤其是在已知索引的情況下,可以迅速獲取對應位置的數據。

?復雜度是評判算法好壞的指標

雙指針法、空間換時間和暴力,雙指針的好處,用于數據對比加數據保留,一般用于數組內對比并刪除數據常見。

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

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

相關文章

flutter 專題 六十四 在原生項目中集成Flutter

概述 使用Flutter從零開始開發App是一件輕松愜意的事情&#xff0c;但對于一些成熟的產品來說&#xff0c;完全摒棄原有App的歷史沉淀&#xff0c;全面轉向Flutter是不現實的。因此使用Flutter去統一Android、iOS技術棧&#xff0c;把它作為已有原生App的擴展能力&#xff0c;…

Java高階程序員學習計劃(詳細到天,需有一定Java基礎)

??致敬讀者 ??感謝閱讀??笑口常開??生日快樂?早點睡覺??博主相關 ??博主信息??博客首頁??專欄推薦??活動信息文章目錄 Java高階程序員學習計劃(詳細到天,需有一定Java基礎)第一階段(30天)Java基礎:Java生態工具鏈:設計模式與編碼規范:第二階段(15天…

JS自動化獲取網站信息開發說明

一、自動獲取信息的必要性 1. 提高效率與節省時間 批量處理&#xff1a;自動化可以快速抓取大量數據&#xff0c;比人工手動操作快得多。 24/7 運行&#xff1a;自動化工具可以全天候工作&#xff0c;不受時間限制。 減少重復勞動&#xff1a;避免人工反復執行相同的任務&am…

Android Kotlin 依賴注入全解:Koin appModule 配置與多 ViewModel 數據共享實戰指南

一、基礎配置與概念 1. 什么是 appModule appModule 是 Koin 依賴注入框架中的核心配置模塊&#xff0c;用于集中管理應用中的所有依賴項。它本質上是一個 Koin 模塊&#xff08;org.koin.core.module.Module&#xff09;&#xff0c;通過 DSL 方式聲明各種組件的創建方式和依…

學習記錄:DAY21

我的開發日志&#xff1a;類路徑掃描、DI 容器與動態代理 前言 我失憶了&#xff0c;完全不記得自己早上干了什么。 日程 早上 10 點左右開始&#xff0c;學了一早上&#xff0c;主要是類路徑掃描相關的調試。 晚上 8 點了&#xff0c;真不能再摸&#x1f41f;了。 學習記錄 計…

【Agent】MCP協議 | 用高德MCP Server制作旅游攻略

note MCP (Model Context Protocol) 代表了 AI 與外部工具和數據交互的標準建立。MCP 的本質&#xff1a;它是一個統一的協議標準&#xff0c;使 AI 模型能夠以一致的方式連接各種數據源和工具&#xff0c;類似于 AI 世界的"USB-C"接口。 它能夠在 LLM/AI Agent 與外…

使用 Spring Data Redis 實現 Redis 數據存儲詳解

使用 Spring Data Redis 實現 Redis 數據存儲詳解 Spring Data Redis 是 Spring 生態中操作 Redis 的核心模塊&#xff0c;它封裝了 Redis 客戶端的底層細節&#xff08;如 Jedis 或 Lettuce&#xff09;&#xff0c;提供了統一的 API 來操作 Redis 的數據結構。以下是詳細實現…

Qt5與現代OpenGL學習(四)X軸方向旋轉60度

把上面兩張圖像放到D盤1文件夾內&#xff1a; shader.h #ifndef SHADER_H #define SHADER_H#include <QDebug> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QString>class Shader { public:Shader(const QString& verte…

【Machine Learning Q and AI 讀書筆記】- 02 自監督學習

Machine Learning Q and AI 中文譯名 大模型技術30講&#xff0c;主要總結了大模型相關的技術要點&#xff0c;結合學術和工程化&#xff0c;對LLM從業者來說&#xff0c;是一份非常好的學習實踐技術地圖. 本文是Machine Learning Q and AI 讀書筆記的第2篇&#xff0c;對應原…

using var connection = connectionFactory.CreateConnection(); using var 是什么意思

在 .NET 中&#xff0c;??垃圾回收&#xff08;Garbage Collection, GC&#xff09;?? 確實是自動管理內存的機制&#xff0c;但它 ??僅適用于托管資源&#xff08;Managed Resources&#xff09;??&#xff08;如類實例、數組等&#xff09;。然而&#xff0c;對于 ?…

Multicore-TSNE

文章目錄 TSNE使用scikit-learn庫使用Multicore-TSNE庫安裝方法基本使用方法采用不同的距離度量 其他資料 TSNE t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一種高維數據的降維方法&#xff0c;由Laurens van der Maaten和Geoffrey Hinton于2008年提出&#xff0…

SI5338-EVB Usage Guide(LVPECL、LVDS、HCSL、CMOS、SSTL、HSTL)

目錄 1. 簡介 1.1 EVB 介紹 1.2 Si5338 Block Diagram 2. EVB 詳解 2.1 實物圖 2.2 基本配置 2.2.1 Universal Pin 2.2.2 IIC I/F 2.2.3 Input Clocks 2.2.4 Output Frequencies 2.2.5 Output Driver 2.2.6 Freq and Phase Offset 2.2.7 Spread Spectrum 2.2.8 快…

Spring AI應用系列——基于OpenTelemetry實現大模型調用的可觀測性實踐

一、項目背景與目標 在AI應用日益復雜的今天&#xff0c;大模型服務&#xff08;如語言理解和生成&#xff09;的性能監控和問題排查變得尤為關鍵。為了實現對大模型調用鏈路的可觀測性&#xff08;Observability&#xff09;管理&#xff0c;我們基于 Spring Boot Spring AI…

Spyglass:官方Hands-on Training(一)

相關閱讀 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是對Spyglass Hands-on Training中第一個實驗的翻譯&#xff08;有刪改&#xff09;&#xff0c;Lab文件可以從以下鏈接獲取。Spyglass Hands-on Traininghttps:…

PCB設計工藝規范(三)走線要求

走線要求 1.走線要求2.固定孔、安裝孔、過孔要求3.基準點要求4.絲印要求 1.走線要求 印制板距板邊距離:V-CUT 邊大于 0.75mm&#xff0c;銑槽邊大于0.3mm。為了保證 PCB 加工時不出現露銅的缺陷&#xff0c;要求所有的走線及銅箔距離板邊:V-CUT邊大于 0.75mm&#xff0c;銑槽邊…

抓取工具Charles配置教程(mac電腦+ios手機)

mac電腦上的配置 1. 下載最新版本的Charles 2. 按照以下截圖進行配置 2.1 端口號配置&#xff1a; 2.2 https配置 3. mac端證書配置 4. IOS手機端網絡配置 4.1 先查看電腦上的配置 4.2 配置手機網絡 連接和電腦同一個wifi&#xff0c;然后按照以下截圖進行配置 5. 手機端證書…

【CSS】精通Flex布局(全)

目錄 1. flex布局體驗 1.1 傳統布局 與 flex布局 1.2 初體驗 2. flex布局原理 2.1 布局原理 3. flex布局父項常見屬性 3.1 常見父項屬性 3.2 屬性值 3.3 justify-content 設置主軸上的子元素排列方式 3.4 flex-wrap設置子元素是否換行 3.5 align-items 設置側軸上的…

力扣第447場周賽

這次終于趕上力扣的周賽了, 賽時成績如下(依舊還是三題 )&#xff1a; 1. 統計被覆蓋的建筑 給你一個正整數 n&#xff0c;表示一個 n x n 的城市&#xff0c;同時給定一個二維數組 buildings&#xff0c;其中 buildings[i] [x, y] 表示位于坐標 [x, y] 的一個 唯一 建筑。 如…

AI中常用概念的理解

1. RAG&#xff08;檢索增強生成&#xff09; 通俗理解&#xff1a;就像你寫作業時&#xff0c;先查課本 / 百度找資料&#xff0c;再根據資料寫答案&#xff0c;而不是純靠記憶瞎編。 AI 模型&#xff08;比如 ChatGPT&#xff09;回答問題時&#xff0c;先去 “數據庫 / 互聯…

SQLServer多版本兼容Java方案和數據采集

Maven引入 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><dependency><groupId>net.sourceforge.jtds</groupId><ar…