數據結構:數組:插入操作(Insert)與刪除操作(Delete)

目錄

插入操作(Inserting in an Array)

在紙上模擬你會怎么做?

代碼實現?

復雜度分析

刪除操作(Deleting from an Array)

在紙上模擬一下怎么做?

代碼實現

復雜度分析


插入操作(Inserting in an Array)

我們要講的是:在一個數組中插入一個新元素,在任意合法的位置上,保持其他元素的順序不亂。

給定一個數組:

A = [2, 4, 6, 8, 10]

現在你希望:在第 索引 2(也就是元素 6 之前)插入一個數字 99。

A = [2, 4, 99, 6, 8, 10]

在紙上模擬你會怎么做?

如果你用筆把這些數字排在格子里,加入一個空格,你會發現:

? 第一步:把從第2個位置開始的元素都向后移動一格,為99騰出位置。

[2][4][ ][6][8][10]↑插入位

你需要從右往左這樣搬:

10 → [5] → [6]8 → [4] → [5]6 → [3] → [4]

? 第二步:然后把 99 放到空出的位置上(索引 2)

[2][4][99][6][8][10]

代碼實現?

你在做的是 一個插入操作,其本質邏輯是:

📌 思路:

從最后一個元素開始,逐個后移,直到你騰出目標位置為止,然后放入新元素。

插入操作的本質:

  1. 從插入位置開始,所有后面的元素向后移動一格

  2. 把新元素插入目標位置

  3. 長度 + 1

?假設我們要在數組 A 中,插入 value 到索引 pos:

void insert(int A[], int& length, int pos, int value) {// 1. 從最后一個元素開始,向后搬運for (int i = length - 1; i >= pos; i--) {A[i + 1] = A[i];  // 向后挪一格}// 2. 把新值放進去A[pos] = value;// 3. 長度+1length++;
}

注意事項與邊界處理

細節說明
插入位置是否合法?必須滿足 0 ≤ pos ≤ length
數組是否已滿?如果是靜態數組,你必須預留空間
是否需要手動調整 length?是的,插入后 length+1
插入到尾部?就是 A[length] = value

復雜度分析

時間復雜度分析?

移動次數依賴于插入位置

插入位置 pos向后移動的元素個數最壞的移動數
最前面(pos = 0n 個元素需要后移? 最壞情況 O(n)
中間(pos = n/2n/2 個元素后移平均情況 O(n)
最末尾(pos = n0 個元素移動? 最好情況 O(1)
情況移動次數復雜度
最好情況(末尾插入)0 次移動O(1)
最壞情況(頭部插入)n 次移動O(n)
平均情況≈ n/2 次移動O(n)

?? 因此,插入操作的總體時間復雜度為:O(n)

空間復雜度分析

  • 如果你在原數組中操作(已有多余空間),空間復雜度是 O(1)(只需要一個臨時變量)

  • 如果你在 動態擴容數組 中插入(如 std::vector),插入時如果超容量,可能要分配新內存,空間復雜度變為 O(n)(拷貝新數組)


刪除操作(Deleting from an Array)

在一個數組中刪除某個位置上的元素,并保持其他元素的順序不變。

A = [2, 4, 6, 8, 10]

你希望從中刪除索引為 2 的元素 6,目標是:

A = [2, 4, 8, 10]

在紙上模擬一下怎么做?

你可以把數組想象成一排格子,每個格子裝著一個數:

[2][4][6][8][10]↑ 要刪掉的元素

你不能真正“刪掉”一個格子 —— 因為數組的長度是固定的

你只能“覆蓋”它。

你可以從刪除位置的下一個元素開始,把它們往前搬一格,覆蓋前面的內容:

從后往前搬目標
A[3] = 8 → A[2]覆蓋 6
A[4] = 10 → A[3]覆蓋 8
[2][4][8][10][10]

(最后一個 10 是重復的,可以忽略,或者設置為0、垃圾值)

代碼實現

刪除操作的本質:

刪除數組中某個位置的元素,需要從后往前逐個移動元素來“填空”,最后更新長度。?

刪除過程:

  1. pos+1 開始,把所有元素向前搬一格

  2. 覆蓋掉被刪除的元素

  3. 更新數組長度

void deleteAt(int A[], int& length, int pos) {// 1. 從 pos+1 開始,向前搬一格for (int i = pos + 1; i < length; i++) {A[i - 1] = A[i];}// 2. 長度減 1length--;
}

邊界與注意事項

檢查項說明
刪除位置是否有效?0 ≤ pos < length
是否需要更新數組長度?是的,必須減 1
是否要清空最后一個位置?通常不用,邏輯上長度變短即可

復雜度分析

? 時間復雜度

要移動多少個元素?需要花多少時間?

情況一:刪除第一個元素(pos = 0

你需要移動全部 n?1 個元素(A[1] → A[0], A[2] → A[1], ..., A[n?1] → A[n?2])

所以:移動次數 = n - 1 → 最壞情況

時間復雜度:O(n)?

情況二:刪除中間位置(pos = n/2

你需要移動一半的元素(從 pos+1 到 n?1)

?移動次數 ≈ n/2

時間復雜度仍是 O(n)(常數系數不影響階)?

情況三:刪除最后一個元素(pos = n - 1

你不需要移動任何元素,直接邏輯刪除即可

移動次數 = 0

最好情況:O(1)

平均時間復雜度

如果刪除位置是隨機的,每個位置被刪除的概率相同,那平均要移動:

結論:平均移動次數是 (n - 1)/2

🕒 平均時間復雜度也是 O(n)

? 空間復雜度

  • 你沒有開辟任何新空間

  • 所有操作都是在原數組上完成

空間復雜度:O(1)(常數)

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

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

相關文章

Qt之修改純色圖片的顏色

這里以修改QMenu圖標顏色為例,效果如下: MyMenu.h #ifndef MYMENU_H #define MYMENU_H#include <QMenu>class MyMenu : public QMenu { public:explicit MyMenu(QWidget *parent = nullptr);protected:void mouseMoveEvent(QMouseEvent *event) override; };#endif /…

uni-app實現單選,多選也能搜索,勾選,選擇,回顯

前往插件市場安裝插件下拉搜索選擇框 - DCloud 插件市場&#xff0c;該插件示例代碼有vue2和vue3代碼 是支持微信小程序和app的 示例代碼&#xff1a; <template><view><!-- 基礎用法 --><cuihai-select-search:options"options"v-model&quo…

【機器學習深度學習】 微調的十種形式全解析

目錄 一、為什么要微調&#xff1f; 二、微調的 10 種主流方式 ? 1. 全參數微調&#xff08;Full Fine-tuning&#xff09; ? 2. 凍結部分層微調&#xff08;Partial Fine-tuning&#xff09; ? 3. 參數高效微調&#xff08;PEFT&#xff09; &#x1f538; 3.1 LoRA&…

信刻光盤安全隔離與文件單向導入/導出系統

北京英特信網絡科技有限公司成立于2005年&#xff0c;是專業的數據光盤擺渡、刻錄分發及光盤存儲備份領域的科技企業&#xff0c;專注為軍隊、軍工、司法、保密等行業提供數據光盤安全擺渡、跨網交換、檔案歸檔檢測等專業解決方案。 公司立足信創產業&#xff0c;產品國產安全可…

Python-標準庫-os

1 需求 2 接口 3 示例 4 參考資料 在 Python 中&#xff0c;os&#xff08;Operating System&#xff09;模塊是一個非常重要的內置標準庫&#xff0c;提供了許多與操作系統進行交互的函數和方法&#xff0c;允許開發者在 Python 程序中執行常見的操作系統任務&#xff0c;像文…

OpenCV CUDA模塊設備層-----在 GPU 上執行類似于 std::copy 的操作函數warpCopy()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模塊&#xff08;cudev&#xff09; 中的一個設備端內聯模板函數&#xff0c;用于在 GPU 上執行類似于 std::copy 的操作&#xff…

Vue Router 中$route.path與 params 的關系

1. params 參數的本質&#xff1a;路徑的動態片段在 Vue Router 中&#xff0c;params 參數是通過路由配置的動態路徑片段定義的&#xff0c;例如&#xff1a;// 路由配置{ path: /user/:id, component: User }當訪問/user/123時&#xff0c;/user/123是完整的路徑&#xff0c;…

React 極簡響應式滑塊驗證組件實現,隨機滑塊位置

&#x1f3af; 滑塊驗證組件 (Slider Captcha) 一個現代化、響應式的滑塊驗證組件&#xff0c;專為 React 應用設計&#xff0c;提供流暢的用戶體驗和強大的安全驗證功能。 ? 功能特性 &#x1f3ae; 核心功能 智能滑塊拖拽 – 支持鼠標和觸摸屏操作&#xff0c;響應靈敏隨…

STM32第十六天藍牙模塊

一&#xff1a;藍牙模塊HC-05 1&#xff1a;硬件引腳配置&#xff1a; | 標號 | PIN | 說明 | |------|-------|---------------------------------------| | 1 | START | 狀態引出引腳&#xff08;未連接/連接輸出信號時&#xff09; |…

時序數據庫IoTDB用戶自定義函數(UDF)使用指南

1. 編寫UDF時序數據庫IoTDB為用戶提供了編寫UDF的JAVA API&#xff0c;用戶可以自主實現UDTF&#xff08;用戶自定義轉換函數&#xff09;類&#xff0c;IoTDB將通過類加載機制裝載用戶編寫的類。Maven依賴如果使用Maven&#xff0c;可以從Maven庫中搜索以下依賴&#xff0c;并…

Linux國產與國外進度對壘

Linux國產與國外進度對壘 引言國產Linux的發展現狀國外Linux的發展現狀技術對比國產Linux的挑戰與機遇國外Linux的優勢與局限結論 引言 簡述Linux在全球操作系統市場中的地位國產Linux的發展背景與意義國外主流Linux發行版的現狀 國產Linux的發展現狀 主要國產Linux發行版介…

Jenkins-Email Extension 插件插件

Editable Email Notification Editable Email Notification 是 Jenkins 的 Email Extension 插件的核心功能&#xff0c;用于自定義郵件通知&#xff0c;包括郵件主題、內容、收件人、發件人等 屬性 1.Project From 項目發件人&#xff0c;設置郵件的發件人地址 **注意&…

windows系統下將Docker Desktop安裝到除了C盤的其它盤中

windows系統下安裝docker會自動安裝到C盤&#xff0c;可以采用下面的方法將其安裝到其它盤中1、先下載Docker Desktop安裝程序Docker Desktop Installer.exe&#xff0c;比如你下載到了C:\Users\YourUsername\Downloads 文件夾中。 2、打開 PowerShell 進入C:\Users\YourUser…

視頻工具箱 1.1.1 |小而美的視頻處理工具,支持多種常用功能

VideoTools是一款基于FFmpeg的小而美的視頻處理工具&#xff0c;專為需要快速高效地進行視頻編輯的用戶設計。這款工具無需安裝&#xff0c;體積僅約200KB&#xff0c;提供了視頻壓縮、格式轉換、轉GIF、修改分辨率、加速播放以及音頻提取等多種常用功能。其用戶界面簡潔直觀&a…

無人機集群搜索技術全面解析

無人機集群搜索是指通過多架無人機協同工作&#xff0c;實現對目標區域的高效覆蓋與快速探測。這項技術通過模擬自然界生物群體的集體行為&#xff0c;利用分布式控制和自主決策算法&#xff0c;使無人機集群能夠自組織地完成復雜搜索任務。下面從核心技術、應用場景、算法實現…

【Elasticsearch】深度分頁及其替代方案

深度分頁及其替代方案 1.深度分頁2.為什么不推薦深度分頁2.1 性能問題&#xff08;核心原因&#xff09;2.2 資源消耗對比2.3 實際限制 3.深度分頁的替代方案3.1 方案一&#xff1a;Search After&#xff08;推薦&#xff09;3.1.1 為什么 Search After 性能更高3.1.2 技術原理…

論文閱讀筆記——VGGT: Visual Geometry Grounded Transformer

VGGT 論文 輸入是 N 個 RGB 圖像 I i ∈ R 3 H W I_i\in\mathbb{R}^{3HW} Ii?∈R3HW 的序列 ( I i ) i 1 N (I_i)^N_{i1} (Ii?)i1N?&#xff0c;觀察相同 3D 場景。 VGGT 的 Transformer 是一個映射函數&#xff0c;將此序列映射為一組對應的 3D 標注&#xff0c; f ( …

【嵌入式電機控制#11】PID控制入門:對比例算法應用的深度理解

接下來內容需要數學功底&#xff0c;并且有現成結論的內容不做推導&#xff0c;重在講解工程實踐中的方法論&#xff0c;建議控制類專業或學習過相關理論的人閱讀 一、開閉環系統 &#xff08;1&#xff09;開環控制系統&#xff1a;被控對象輸出對控制器的輸出沒有影響 &…

多視圖幾何:本質矩陣與基礎矩陣

文章目錄 1. 前置知識1.1. 向量叉乘1.2. 混合積1.3. 引理證明 2. 本質矩陣3. 基礎矩陣4. 應用例子 1. 前置知識 1.1. 向量叉乘 假設 a ( a x a y a z ) \mathbf{a} \begin{pmatrix} a_x \\ a_y \\ a_z \end{pmatrix} a ?ax?ay?az?? ? 以及 b ( b x b y b z ) \mat…

Hive集群之間遷移的Linux Shell腳本

新舊 Hive 集群之前數據遷移單表腳本 migrate_hive_single_table.sh #!/bin/bash#配置參數 OLD_NAMENODE"hdfs://<old-namenode>:<old-port>" EXPORT_PATH"/tmp/hive-export/dm" NEW_DB"dm_events" TABLE_NAME"dm_usereventfi…