【通識】數據結構

數據結構=邏輯結構+物理結構(存儲結構),數據結構是計算機中存儲、組織數據的方式。
其中物理結構是數據的邏輯結構在計算機中的存儲形式。而存儲器針對內存而言,像硬盤、軟盤、光盤等外部存儲器的數據組織常用文件結構描述。
在這里插入圖片描述

1. 基礎算法

1.1 遞歸Recursion

  1. 函數在定義中使用函數自身的方法,例子是求斐波那契數列。
    long long Fib(int i) {if(i<=1) return i;return Fib(i-1)+Fib(i-2);
    }
    

1.2 分治Divide and Conquer

分治,即分而治之。?將大問題分成幾個小部分計算,最后再將小部分結果合并起來

  1. 要考慮什么時候是基礎情況,很多時候依靠遞歸實現
int RecSum(int l, int r) {int mid = l + r >> 1; // 因為這里是位運算,相當于整數除以2;該寫法常見于二分查找、分治算法等腰計算中間值return RecSum(l,mid)+RecSum(mid+l, r);
}

這段代碼是遞歸求和函數,但因為沒有終止條件會導致無限遞歸和棧溢出(stack overflow)。即沒有處理l==r的情況,修正后

int RecSum(int l, int r) {if (l==r) return l;int mid = 
}

1.3 貪心算法

  1. 基本思想
    1)求解最優化問題的算法包含一系列步驟
    2)每一步都有一組選擇
    3)做出當前最好的選擇
    4)通過局部最優選擇達到全局最優-> 未必達到全局最優
    5)是否能達到最優解需嚴格證明
  2. 產生最優解的條件
    1)最優子結構:
    2)貪心選擇性:

2. 線性表

數據的存儲結構應正確反映數據元素間的邏輯關系
體現為線性表的順序存儲能用數據實現,而元素物理
1)個數有限;2)元素有先后次序;3)數據類型相同;4)討論元素間的邏輯關系
一旦數據被線性表存儲,在邏輯上的相對位置就固定下來了。線性表分為順序表和鏈表。其中鏈式存儲允許存儲空間不連續,但順序表不行。

2.1 跳表

上面的對比中可以看出,鏈表雖然通過增加指針域提升了自由度,但是卻導致數據的查詢效率惡化。特別是當鏈表長度很長的時候,對數據的查詢還得從頭依次查詢,這樣的效率會更低。跳表的產生就是為了解決鏈表過長的問題,通過增加鏈表的多級索引來加快原始鏈表的查詢效率。這樣的方式可以讓查詢的時間復雜度從O(n)提升至O(logn)。
在這里插入圖片描述
1)
2)
3)

3. 棧

3.1 棧

遵守LIFO原則(后進先出)

3.2 隊列

遵守FIFO原則(先進先出)

4. 樹

4.1 二叉樹(Binary Tree)

  1. 特點:除了最后一層外,其他層節點必須完全填滿(每層從左到右沒有空缺),最后一層的節點必須連續集中在左側(允許右側有空缺但左側不能有)
    在這里插入圖片描述
  2. 二叉樹代碼
    在這里插入圖片描述
    此處是鏈式存儲
    typedef struct BiNode {char data;struct BiTNode *lchild, *rchild; // 左右孩子指針
    } BiTNode, *BiTree;
    BiTree root = NULL; // 根節點
    root = (BiTree)malloc(sizeof(BiTNode));
    root -> data = 'A';
    root -> lchild = NULL;
    root -> rchild = NULL;
    // 插入結點B
    BiTNode *BNode = NULL;
    BNode = (BiTNode*)malloc(sizeof(BiTNode));
    BNode->data = 'B';
    BNode->lchild = NULL;
    BNode->rchild = NULL;
    root->lchild = BNode; // 定義了B之后才將A對應的root的左子樹連接到B中
    // 插入結點C
    BiTNode *CNode = NULL;
    CNode = (BiTNode*)malloc(sizeof(BiTNode));
    CNode -> data = 'C';
    CNode -> lchild = NULL;
    CNode -> rchild = NULL;
    root -> rchild = CNode;  
    
  3. 二叉樹

4.2 B+樹

MySQL InnoDB索引(B+樹)作為主要的索引結構,用于主鍵索引(聚簇索引)和輔助索引(二級索引)。B+樹相比于AVL樹、紅黑樹等數據結構,更適合數據庫的大規模數據存儲和磁盤存取優化。

  1. B+:平衡樹(非二叉樹),具有以下特點
    1)每個B+樹的結點中含有n個關鍵字,而B+樹每個節點中關鍵字個數n的取值范圍是?m/2?≤n≤m?m/2?≤n≤m?m/2?nm
    2)所有的葉子節點包含了關鍵字的信息,及指向關鍵字記錄的指針,且葉子節點本身依關鍵字的大小自小而大順序鏈接。
    3)所有非終端節點(非葉子)是索引,結點中僅含有其子樹(根節點)中最大/小的關鍵字

  2. 1

  3. 1

4.3 AVL樹

4.4

5. 圖

5.1 圖的

6. 哈希表

  1. 概念:哈希表指通過哈希函數將鍵值映射到值的數據結構
  2. 哈希沖突:通過哈希查找發現該位置上已有對應的關鍵碼值,發生沖突
  3. 解決沖突的方法:
    1)開發地址法:尋找另一個空閑地址,包括線性探測法和平方探測法
    2)鏈地址法:將所有哈希地址相同的記錄鏈接到同一鏈表中,適用于頻繁插入刪除
    3)再哈希法:使用其他哈希函數計算新的地址
  4. 相關的代碼
// 兩數之和:給定一個整數數組nums和整數目標值target,請在該數組中找出和為目標值target的兩個整數,并返回數組下標
class Solution {
public: vector<int> twoSum(vector<int>& nums, int target) {vector<int> ret;}
}

6.1

7. 堆

用于動態內存管理

7.1

8. 動態規劃

將會定義兩個關鍵:一是動態規劃,二是狀態轉移。
其中狀態定義是把求解過程中所有狀態(子問題)表示出來是動態規劃的難點

8.1 區間dp和樹形dp

8.2

8.3 常見問題

  1. 樸素區間dp:在區間上進行dp,主要思路是通過合并小區間得到大區間的最優解

大區間是cost[i][j][k],其中包含dp[i][j]和dp[j][k],將其合并為區間dp[i][k] = dp[i][j] + dp[j][k] + cost[i][j][k]
動態規劃將會定義兩個關鍵,一是狀態定義二是狀態裝

  1. 破壞成鏈
  2. 經典樹形dp
  3. 樹形背包
  4. 樹形背包優化

9. 排序

9.1 快速排序(三路版)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 三路快速排序(遞歸版本)
void quickSort3Way(vector<int>& nums, int left, int right) {if (left>=right) return; // 遞歸終止條件// 選擇基準值(選擇中間元素)int pivot = nums[left+(right-left)/2];// 初始化三個指針}

10. 并查集

  1. 基礎概念:并查集是一種樹型數據結構用于處理不相交集合(disjoint sets)的合并及查詢問題,常在使用中部用森林表示。
    A?BA-BA?B
  2. 合并方式:
  3. 在這里插入圖片描述

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

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

相關文章

Ubuntu22.04提示找不到python命令的解決方案

Ubuntu22.04提示找不到python命令的解決方案 問題背景 在Ubuntu22.04中按照獲取Openharmony源碼中的如下命令&#xff1a; // 方式一&#xff08;推薦&#xff09;&#xff1a;通過repo ssh下載&#xff08;需注冊公鑰&#xff0c;請參考碼云幫助中心&#xff09;。repo in…

RabbitMQ面試精講 Day 6:消息確認與事務機制

【RabbitMQ面試精講 Day 6】消息確認與事務機制 開篇 歡迎來到"RabbitMQ面試精講"系列的第6天&#xff01;今天我們將深入探討RabbitMQ中確保消息可靠性的兩大核心機制&#xff1a;消息確認與事務機制。這兩個特性是面試中高頻出現的熱點問題&#xff0c;也是生產環…

被困擾的elementplus樣式修改問題:select選擇器修改和el-input修改

一、Select選擇器的原生樣式的本來面貌這是原生的沒有經過任何加工的面貌&#xff1a;這是沒有經過任何加工的選中時出現下拉框的面貌&#xff1a;這是沒有經過加工的懸浮下拉菜單的面貌&#xff1a;這是沒有經過加工的選中時的面貌&#xff1a;二、如何修改Select選擇器&#…

GO 從入門到精通2

Go語言的反射&#xff08;Reflection&#xff09;機制通過 reflect 包實現&#xff0c;允許程序在運行時動態檢查、修改和操作變量的類型信息和值。以下是反射的核心概念、用法及注意事項的詳細解析&#xff1a;一、反射的基本概念reflect.Type 表示變量的類型信息&#xff0c;…

常用設計模式系列(十二)—享元模式

常用設計模式系列&#xff08;十二&#xff09;—享元模式 第一節 前言 昏昏沉沉的兩天過去了&#xff0c;也不知道為什么&#xff0c;突然總覺得很困&#xff0c;可能之前熬夜熬的多了&#xff0c;所以現在可能年紀大了&#xff0c;需要蹦一蹦才能把自己從頹廢的邊緣拉扯回來&…

基于spring boot的醫院掛號就診系統(源碼+論文)

一、開發環境 技術/工具描述MYSQL數據庫1. 體積小&#xff0c;安裝便捷&#xff1a;MySQL數據庫體積小&#xff0c;占用內存小&#xff0c;不影響電腦上其他軟件的運行&#xff0c;并且不需要因為安裝維護MySQL數據庫而重裝系統。2. 適合老舊電腦&#xff1a;作為學習開發的電…

spring-security

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>spring: security: user: name: root password: 123456 這個配置在訪問接口時候根據您提供的Spring Secur…

搭建一個自定義的 React 圖標庫

搭建一個自定義的 React 圖標庫可以讓你在多個項目中復用統一的圖標資源&#xff0c;同時支持按需加載、主題化和靈活的配置。以下是詳細的步驟指南&#xff1a; 1. 設計圖標庫結構 首先規劃圖標庫的目錄結構和功能&#xff1a; my-react-icons/ ├── src/ │ ├── ico…

寶塔面板如何升級OpenSSL

寶塔面板如何升級OpenSSL&#xff08;親測可用&#xff09;目前一些服務器的OpenSSL還是1.0.1e版本&#xff0c;今天進行服務器漏洞檢測出現OpenSSL存在漏洞&#xff0c;那只能升級OpenSSL了。1、登錄SSH&#xff0c;查看OpenSSL版本openssl version2、下載源代碼wget https://…

深入理解 C++ 紅黑樹:從理論到實踐

引言 在計算機科學領域&#xff0c;數據結構是構建高效算法的基石。而在眾多的數據結構中&#xff0c;平衡二叉搜索樹因其優秀的查找、插入和刪除性能而備受關注。紅黑樹&#xff08;Red-Black Tree&#xff09;作為一種自平衡的二叉搜索樹&#xff0c;更是在 C 標準庫&#x…

外星人筆記本裝win11哪個版本好_外星人筆記本裝win11專業版教程

外星人筆記本安裝win11哪個版本好&#xff1f;答&#xff1a;外星人筆記本還是建議安裝win11專業版。Win分為多個版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和專業版&#xff08;Pro&#xff09;是用戶選擇最多的兩個版本。win11專業版在功能以及安全性方面有著明…

自學嵌入式 day37 HTML

HTML:超文本標記語言HyperText Markup Language一種用于創建網頁的標準標記語言HTML 運行在瀏覽器上&#xff0c;由瀏覽器來解析。https://www.runoob.com/html/html-tutorial.html1.格式 <!DOCTYPE html> <html><head><meta charset"utf-8"&g…

【車聯網kafka】Kafka核心架構與實戰經驗(第一篇)

目錄 一、我與kafka的緣分-初識Kafka 二、Kafka深入探討-了解kafka ?編輯2.1 kafka 生產者框架 2.1.1 生產者在生活中的實例 2.1.2 kafka生產者流程及框架 1. 主線程處理階段 2. Sender線程處理階段 設計優勢總結 2.2 kafka 生產者框架中的一些關鍵參數 2.3 kafka 生…

Go 語言變量作用域

Go 語言變量作用域 引言 在編程語言中&#xff0c;變量作用域是定義變量可以使用和不可使用的區域。在Go語言中&#xff0c;理解變量的作用域對于編寫高效且易于維護的代碼至關重要。本文將詳細介紹Go語言中的變量作用域&#xff0c;包括其規則、類型以及實際應用。 一、變量作…

單卡10分鐘部署MiniCPM4-0.5B:輕量級大模型本地運行指南

一、介紹 MiniCPM 4 是一個極其高效的邊緣側大型模型&#xff0c;經過了模型架構、學習算法、訓練數據和推理系統四個維度的高效優化&#xff0c;實現了極致的效率提升。 &#x1f3d7;? 高效的模型架構&#xff1a; InfLLM v2 – 可訓練的稀疏注意力機制&#xff1a;采用可…

CSS變量與Houdini自定義屬性:解鎖樣式編程新維度

在前端開發中&#xff0c;CSS變量和Houdini自定義屬性正在徹底改變我們編寫和管理樣式的方式。這些技術不僅提高了樣式代碼的可維護性&#xff0c;更為CSS帶來了編程語言的強大能力。一、CSS變量&#xff1a;原生樣式的革命 CSS變量&#xff08;CSS Custom Properties&#xff…

Android中PID與UID的區別和聯系(2)

一、核心概念對比特性PID (Process ID)UID (User ID)本質進程唯一標識符應用身份標識符分配時機進程啟動時動態分配應用安裝時靜態分配生命周期進程結束時回收應用卸載時才回收變化性每次啟動都可能不同長期保持不變作用范圍單進程內唯一全設備范圍唯一核心作用系統資源管理&am…

TCPDump實戰手冊:協議/端口/IP過濾與組合分析指南

目錄 一、基礎過濾速查表 1. 協議過濾&#xff08;單協議&#xff09; 2. 端口過濾 3. IP地址過濾 二、組合過濾實戰示例 1. 協議端口組合 2. IP端口組合 3. 復雜邏輯組合 三、高級協議分析示例 1. HTTP請求分析 2. DNS問題排查 3. TCP連接問題分析 四、組合過濾場…

【智能協同云圖庫】智能協同云圖庫第八彈:基于阿里云百煉大模型—實現 AI 擴圖功能

AI 擴圖功能 需求分析 隨著 AI 的高速發展&#xff0c;AI 幾乎可以應用到任何傳統業務中&#xff0c;增強應用的功能&#xff0c;帶給用戶更好的體驗。 對于圖庫網站來說&#xff0c;AI 也有非常多的應用空間&#xff0c;比如可以利用 AI 繪圖大模型來編輯圖片&#xff0c;實現…

2025年Solar應急響應公益月賽-7月筆記ing

應急響應身為顏狗的我是真心覺得lovelymem的ui寫得~~~~【任務1】應急大師題目描述&#xff1a;請提交隱藏用戶的名稱&#xff1f;print打印注冊表&#xff0c;或者開啟環境是就有【任務4】應急大師題目描述&#xff1a;請提交黑客創建隱藏用戶的TargetSid&#xff08;目標賬戶安…