數據結構--------堆

目錄

二叉樹

樹的概念與結構

非樹形結構:

注意:

樹的相關術語

樹的表示

孩子兄弟表示法

樹形結構實際運用場景(拓展)

1.?文件系統管理

2.?數據庫與索引

3.?編程語言與數據結構

信息組織與展示

1.?思維導圖

2.?目錄與導航

3.?組織架構圖

網絡與通信

1.?路由算法

2.?XML/JSON 數據格式

二叉樹:

概念與結構

特點:

特殊的二叉樹

滿二叉樹

完全二叉樹?編輯

二叉樹的性質

二叉樹的存儲結構

順序存儲結構

鏈式存儲結構

實現順序結構二叉樹

堆的概念與結構

堆的特性:

?叉樹性質(左右孩子位置)

實現堆的順序結構

堆的結構體

核心函數功能

初始化

打印

交換數據

向上調整法

細節:

入堆

注意:

時間復雜度

判空

向下調整法

帶入實例:

時間復雜度

刪除堆頂元素:

獲取堆頂元素

堆的銷毀

測試代碼(堆排序---向下調整法建堆)

向上調整法建堆

步驟:

代碼實現(完整):

向上向下建堆方法時間復雜度

向下調整法

向上調整法


二叉樹

樹的概念與結構

樹是?種?線性的數據結構,它是由 nn>=0) 個有限結點組成?個具有層次關系的集合。把它叫做樹是因為它看起來像?棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

根節點:有一個特殊的結點,稱為根節點,即A,根節點沒有前驅節點

除根節點外,其余節點被分為互不相交的集合,且每個集合有結構與樹類似的子樹。子樹根節點有且只有一個前驅,有0個或者多個后繼。

非樹形結構:

注意:

1.? 子樹是不相交的
2.? ?除了根結點外,每個結點有且僅有?個父結點
3.? ??棵N個結點的樹有N-1

樹的相關術語

父結點/雙親結點:若?個結點含有子結點,則這個結點稱為其子結點的父結點; 如上圖:A是B的父結點
子結點/孩子結點:?個結點含有的子樹的根結點稱為該結點的子結點; 如上圖:B是A的孩子結點
結點的度:?個結點有幾個孩子,他的度就是多少;比如A的度為6,F的度為2,K的度為0
樹的度:?棵樹中,最大的結點的度稱為樹的度; 如上圖:樹的度為 6
葉子結點/終端結點:度為 0 的結點稱為葉結點; 如上圖: BCHI... 等結點為葉結點
分支結點/非終端結點:度不為 0 的結點; 如上圖: DEFG... 等結點為分支結點
兄弟結點:具有相同?結點的結點互稱為兄弟結點(親兄弟); 如上圖: BC 是兄弟結點
結點的層次:從根開始定義起,根為第 1 層,根的子結點為第 2 層,以此類推;
樹的?度或深度:樹中結點的最大層次; 如上圖:樹的高度為 4
結點的祖先:從根到該結點所經分?上的所有結點;如上圖: A 是所有結點的祖先
路徑:?條從樹中任意節點出發,沿父節點-子節點連接,達到任意節點的序列;比如A到Q的路徑為: A-E-J-Q;H到Q的路徑H-D-A-E-J-Q
子孫:以某結點為根的子樹中任?結點都稱為該結點的子孫。如上圖:所有結點都是A的子孫
森林:由 mm>0) 棵互不相交的樹的集合稱為森林;?

樹的表示

孩子兄弟表示法

struct TreeNode
{struct TreeNode* child;//左邊開始第一個孩子節點struct TreeNode* brother;//指向右邊的下一個兄弟結點int data;//存儲的數據
};

樹形結構實際運用場景(拓展)

1.?文件系統管理
  • 操作系統(如 Windows、Linux)的文件目錄結構是最經典的樹形結構:
    • 根目錄(如C:\/)為 “根節點”;
    • 子文件夾為 “中間節點”;
    • 具體文件為 “葉子節點”。
  • 優勢:通過層級路徑(如/user/doc/report.pdf)快速定位文件,支持遞歸遍歷和批量操作。
2.?數據庫與索引
  • B 樹 / B + 樹:數據庫(如 MySQL)的索引結構,通過多層節點快速定位數據,平衡了查詢效率和磁盤存儲性能。
  • 樹形查詢:用于表示數據庫中的 “父子關系”(如部門與子部門、評論與回復),通過遞歸查詢獲取完整層級數據。
3.?編程語言與數據結構
  • 語法樹(AST):編譯器將代碼解析為樹形結構,用于語法分析和執行(如 Python、Java 的代碼執行過程)。
  • DOM 樹:HTML/XML 文檔的解析結構,每個標簽為節點,支持通過 JavaScript 遍歷或修改頁面元素(如document.getElementById)。
  • 紅黑樹 / AVL 樹:高效的平衡查找樹,用于實現TreeMap(Java)或map(C++)等數據結構,支持 O (log n) 的插入、刪除和查詢。

信息組織與展示

1.?思維導圖
  • 以核心主題為根節點,分支延伸子主題,用于 brainstorming、知識梳理(如 XMind、MindNode 工具)。
2.?目錄與導航
  • 書籍的章節結構、網站的導航菜單(如電商網站的 “商品分類→子分類→商品”),通過層級關系幫助用戶快速定位信息。
3.?組織架構圖
  • 企業或機構的層級關系(如 “CEO→部門經理→員工”),清晰展示上下級隸屬關系。

網絡與通信

1.?路由算法
  • 網絡中的路由表常以樹形結構表示,通過最短路徑算法(如 Dijkstra)在節點間傳遞數據,減少冗余路徑。
2.?XML/JSON 數據格式
  • 半結構化數據的嵌套結構本質是樹形(如 JSON 的{ "a": { "b": "c" } }),便于存儲層級化信息(如配置文件、API 返回數據)。

二叉樹:

概念與結構

在樹形結構中,我們最常?的就是?叉樹,?棵?叉樹是結點的?個有限集合,該集合由?個根結點 加上兩棵別稱為左?樹和右?樹的?叉樹組成或者為空。

特點:

1.二叉樹不存在度大于2的結點

2.二叉樹子樹有左右之分,次序不能顛倒,是有序樹

特殊的二叉樹

滿二叉樹

?個?叉樹,如果每?個層的結點數都達到最?值,則這個?叉樹就是滿?叉樹。

其層數若為n ,則節點數有2^n-1

完全二叉樹

完全?叉樹是效率很高的數據結構,完全?叉樹是由滿?叉樹?引出來的。對于深度為 K 的,有 n 個結點的?叉樹,當且僅當其每?個結點都與深度為K的滿?叉樹中編號從 1 ? n 的結點??對應時稱之為完全?叉樹。要注意的是滿?叉樹是?種特殊的完全?叉樹。
二叉樹的性質
根據滿?叉樹的特點可知:
1)若規定根結點的層數為 1 ,則?棵?空?叉樹的第i層上最多有 2 ^(i?1)?個結點
2)若規定根結點的層數為 1 ,則深度為 h 的?叉樹的最?結點數是 2^?h ? 1
3)若規定根結點的層數為 1 ,具有 n 個結點的滿?叉樹的深度 h = log2 (n + 1) ( log
以2為底, n+1 為對數)

二叉樹的存儲結構

順序存儲結構

順序存儲結構使用數組(或列表)來存儲二叉樹的節點,通過節點在數組中的位置關系來體現二叉

樹的邏輯結構。

?般使?數組只適合表示完全?叉樹,因為不是完全?叉樹會有 空間的浪費,完全?叉樹更適合使?順序結構存儲。

若根節點存儲在數組下標為?i?的位置:

  • 左孩子節點存儲在?2i + 1?的位置
  • 右孩子節點存儲在?2i + 2?的位置

優缺點

  • 優點:訪問節點速度快,通過索引可直接訪問,節省存儲空間(無需存儲指針)
  • 缺點:只適合存儲完全二叉樹,對于非完全二叉樹會浪費大量空間;插入和刪除操作不方便

鏈式存儲結構

用鏈表來表示?棵?叉樹,每個節點包含數據域和指向左右孩子的指針域。

優缺點

  • 優點:空間利用率高,適合存儲各種形態的二叉樹;插入和刪除操作靈活方便
  • 缺點:訪問節點需要通過指針遍歷,訪問效率相對較低;需要額外存儲空間存儲指針

實現順序結構二叉樹

?般使用順序結構的數組來存儲數據,堆是?種特殊的?叉樹,具有?叉樹的特性的同時,還具備其他的特性。

堆的概念與結構

堆的特性:

  • 結構特性:堆是一棵完全二叉樹,即除最后一層外,其他層的節點都被填滿,且最后一層的節點從左到右依次排列
  • 堆序特性
    • 大根堆(Max Heap):每個父節點的值大于或等于其左右孩子節點的值
    • 小根堆(Min Heap):每個父節點的值小于或等于其左右孩子節點的值

堆具有以下性質:
? ? 堆中某個結點的值總是不大于或不小于其父結點的值;
?? ?堆總是?棵完全?叉樹。

?叉樹性質(左右孩子位置)

對于具有 n 個結點的完全?叉樹,如果按照從上至下從左至右的數組順序對所有結點從
0 開始編號,則對于序號為 i 的結點有:
1. i>0 i 位置結點的雙親序號: (i-1)/2 i=0 i 為根結點編號,無雙親結點
2. 2i+1<n 左孩子序號: 2i+1 2i+1>=n 否則無左孩子
3. 2i+2<n 右孩子序號: 2i+2 2i+2>=n 否則無右孩子

實現堆的順序結構

堆的結構體

typedef int HPDataType;  // 堆中存儲的數據類型
typedef struct Heap {HPDataType* arr;    // 存儲堆元素的數組int size;           // 當前堆中元素的數量int capacity;       // 堆的容量
} HP;

核心函數功能

  • HPInit:初始化堆,將數組指針置空,大小和容量設為 0
  • HPDestroy:銷毀堆,釋放動態分配的內存
  • HPPrint:打印堆中的所有元素
  • Swap:交換兩個整數的值
  • AdjustUp:向上調整算法,用于插入元素后維持堆的性質
  • HPPush:向堆中插入元素
  • HPEmpty:判斷堆是否為空
  • AdjustDown:向下調整算法,用于刪除元素后維持堆的性質
  • HPPop:刪除堆頂元素
  • HPTop:獲取堆頂元素的值
void HPInit(HP* php);
void HPDestroy(HP* php);
void HPPrint(HP* php);void Swap(int* x, int* y);
void AdjustUp(HPDataType* arr, int child);
void AdjustDown(HPDataType* arr, int parent, int n);void HPPush(HP* php, HPDataType x);
void HPPop(HP* php);
//取堆頂數據
HPDataType HPTop(HP* php);// 判空
bool HPEmpty(HP* php);
初始化
void HPInit(HP* php)
{php->arr = NULL;php->size = php->capacity = 0;
}
打印
void HPPrint(HP* php)
{for (int i = 0; i < php->size; i++){printf("%d ", php->arr[i]);}printf("\n");
}
交換數據
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}

如果不用指針,直接傳遞變量的值,函數內部的交換操作不會影響到函數外部的變量

向上調整法
void AdjustUp(HPDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){//大堆:>//小堆:<if (arr[child] > arr[parent]){//調整Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}

當新元素被插入到堆的末尾時,可能會破壞堆的性質(父節點值大于子節點值)。AdjustUp?函數通過將新插入的元素(從最后一個位置)向上移動,與父節點比較并交換,直到重新滿足堆的性質。

細節:
  1. 父節點索引計算公式?(child - 1) / 2?是由完全二叉樹的性質決定的

  2. 循環終止條件?child > 0?確保不會越界訪問(根節點沒有父節點)

  3. 若要實現小根堆,只需將比較運算符?>?改為?<

入堆
//入堆
void HPPush(HP* php, HPDataType x)
{assert(php);//判斷空間是否足夠if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)realloc(php->arr, newCapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}php->arr = tmp;php->capacity = newCapacity;}php->arr[php->size] = x;//向上調整AdjustUp(php->arr, php->size);++php->size;
}
  • 新元素先放在數組末尾(對應完全二叉樹的最后一個位置)
  • 調用AdjustUp函數向上調整,確保插入后仍滿足堆的性質
  • 最后更新堆的元素數量
注意:

realloc?的核心作用是重新分配已有的動態內存塊,可以:

  • 當原內存塊后面有足夠空間時,直接在原地擴展,無需復制數據
  • 當空間不足時,自動分配新內存塊并將原數據復制過去
    而?malloc?只能分配全新的內存塊,如果用?malloc?實現擴容,需要手動完成
  • 當堆的內存塊后面有連續的空閑空間時,realloc?可以直接擴展內存,避免數據復制,效率遠高于?malloc?+?memcpy?+?free?的組合。
時間復雜度
  • 擴容操作的時間復雜度:O (n)(最壞情況,需要復制所有元素),但由于采用 2 倍擴容策略,平均下來是 O (1)
  • 向上調整操作的時間復雜度:O (log n)(最多需要調整到根節點,路徑長度為堆的高度)
  • 因此,HPPush操作的平均時間復雜度為 O (log n)。
判空
// 判空
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}
向下調整法
//向下調整算法
void AdjustDown(HPDataType* arr, int parent, int n)
{int child = parent * 2 + 1;//左孩子while (child < n){//大堆:<//小堆:>if (child + 1 < n && arr[child] < arr[child + 1]){child++;}//大堆: >//小堆:<if (arr[child] > arr[parent]){//調整Swap(&arr[child], &arr[parent]);parent = child;child = parent * 2 + 1;}else {break;}}
}
  • HPDataType* arr:存儲堆元素的數組
  • int parent:需要向下調整的起始父節點索引(通常是堆頂元素索引 0)
  • int n:堆中有效元素的個數(調整范圍不超過此值)
  • 關鍵細節

    • 先判斷右孩子是否存在且更大(child + 1 < n確保不越界),目的是找到兩個孩子中的最大值
    • 若子節點大于父節點,交換后繼續向下調整;否則說明已滿足堆性質,停止調整
    • 若要實現小根堆,只需將兩處比較運算符<>分別改為><
帶入實例:

假設大根堆當前狀態為?[60, 50, 40, 30],刪除堆頂元素后,最后一個元素30移到堆頂,數組變為?[30, 50, 40, ...]size減 1 后n=3):

?
時間復雜度

AdjustDown的時間復雜度為O(log n),因為最多需要調整到堆的最底層,路徑長度為堆的高度(完全二叉樹的高度為log2(n+1))。

  1. parent=0child=1(左孩子 50)
  2. 右孩子child+1=2(值 40)存在,50>40,所以child保持 1
  3. 子節點 50 > 父節點 30,交換后數組為?[50, 30, 40]parent=1child=3
  4. child=3不小于n=3,循環終止,調整完成,結果為?[50, 30, 40],滿足大根堆性質
刪除堆頂元素:
void HPPop(HP* php)
{assert(!HPEmpty(php));// 0 php->size-1Swap(&php->arr[0], &php->arr[php->size - 1]);--php->size;//向下調整AdjustDown(php->arr, 0, php->size);
}
  • 時間復雜度:O (log n),主要由AdjustDown操作決定
  • 空間復雜度:O (1),僅使用常數級額外空間
獲取堆頂元素
//取堆頂數據
HPDataType HPTop(HP* php)
{assert(!HPEmpty(php));return php->arr[0];
}
堆的銷毀
void HPDestroy(HP* php)
{if (php->arr)free(php->arr);php->arr = NULL;php->size = php->capacity = 0;
}

測試代碼(堆排序---向下調整法建堆)

void arrPrint(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}
void BubbleSort(int* arr, int n)
{for (int i = 0; i < n; i++){for (int j = 0; j < n - i - 1; j++){if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}}
}//堆排序
void HeapSort1(int* arr, int n)
{HP hp; //——————借助數據結構堆來實現堆排序HPInit(&hp);for (int i = 0; i < n; i++){HPPush(&hp, arr[i]);}int i = 0;while (!HPEmpty(&hp)){int top = HPTop(&hp);arr[i++] = top;HPPop(&hp);}HPDestroy(&hp);
}void HeapSort(int* arr, int n)
{//建堆——向下調整算法建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(arr, i, n);}//堆排序int end = n - 1;while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}}void test01()
{HP hp;HPInit(&hp);HPPush(&hp, 56);HPPush(&hp, 10);HPPush(&hp, 15);HPPush(&hp, 30);//HPPush(&hp, 70);//HPPush(&hp, 25);HPPrint(&hp);HPPop(&hp);HPPrint(&hp);HPPop(&hp);HPPrint(&hp);HPPop(&hp);HPPrint(&hp);HPPop(&hp);HPPrint(&hp);HPDestroy(&hp);
}void test02()
{HP hp;HPInit(&hp);HPPush(&hp, 56);HPPush(&hp, 10);HPPush(&hp, 15);HPPush(&hp, 30);HPPrint(&hp);while (!HPEmpty(&hp)){int top = HPTop(&hp);printf("%d ", top);HPPop(&hp);}HPDestroy(&hp);
}int main()
{//test01();//test02();int arr[6] = { 19,15,20,17,13,10 };printf("排序之前:");arrPrint(arr, 6);//堆排序HeapSort(arr, 6);printf("排序之后:");arrPrint(arr, 6);return 0;
}

向上調整法建堆

將元素逐個插入堆中,每次插入后通過 “向上調整” 操作,確保新元素與父節點的關系符合堆的性質(最小堆中父節點值小于等于子節點值;最大堆中父節點值大于等于子節點值)。

步驟:

  1. 插入新元素:將新元素暫時放在堆的末尾(數組的最后一個位置)。
  2. 向上調整:比較新元素與其父節點的值,若不符合堆的性質(如最大堆中,新元素 >?父節點),則交換兩者位置。
  3. 重復調整:繼續將新元素與其新的父節點比較,直到新元素的父節點符合堆的性質,或新元素成為根節點(此時無法再向上調整)。

代碼實現(完整):

#include <stdio.h>// 交換兩個元素
void Swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 向上調整算法(用于建堆)
// 假設構建的是最大堆
void AdjustUp(int* arr, int child) {int parent = (child - 1) / 2;// 當子節點索引大于0且子節點值大于父節點值時,需要調整while (child > 0) {if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;} else {// 符合最大堆性質,無需繼續調整break;}}
}// 向下調整算法(用于堆排序過程中維持堆性質)
// 假設構建的是最大堆
void AdjustDown(int* arr, int parent, int n) {int child = 2 * parent + 1; // 左孩子索引while (child < n) {// 選擇左右孩子中值較大的那個if (child + 1 < n && arr[child + 1] > arr[child]) {child++;}// 如果父節點值小于子節點值,交換它們if (arr[parent] < arr[child]) {Swap(&arr[parent], &arr[child]);parent = child;child = 2 * parent + 1;} else {// 符合最大堆性質,無需繼續調整break;}}
}// 堆排序函數
void HeapSort(int* arr, int n) {if (arr == NULL || n <= 1) {return; // 空數組或只有一個元素無需排序}// 建堆----向上調整法建堆for (int i = 0; i < n; i++) {AdjustUp(arr, i);}// 堆排序int end = n - 1;while (end > 0) {// 將堆頂元素(最大值)與末尾元素交換Swap(&arr[0], &arr[end]);// 調整剩余元素為最大堆AdjustDown(arr, 0, end);end--;}
}// 測試函數
int main() {int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};int n = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");HeapSort(arr, n);printf("排序后: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

改變點:

向上向下建堆方法時間復雜度

向下調整法

相關計算:

T (h) = 2 0 ? (h ? 1) + 2 1 ? (h ? 2) + 2 2 ? (h ? 3) + 2 3 ? (h ? 4) + .. + 2 h?3 ? 2 + 2 h?2 ? 1
② 2 ? T (h) = 2 1 ? (h ? 1) + 2 2 ? (h ? 2) + 2 3 ? (h ? 3) + 2 4 ? (h ? 4) + ... + 2 h?2 ? 2 + 2 h?1 ? 1
② ? ① 錯位相減:
T (h) = 1 ? h + 2 1 + 2 2 + 2 3 + 2 4 + .. + 2 h?2 + 2 h?1T (h) = 2 0 + 2 1 + 2 2 + 2 3 + 2 4 + . + 2 h?2 + 2 h?1 ? h
T (h) = 2 h ? 1 ? h
根據?叉樹的性質: n = 2 h ? 1 h = log2 (n + 1)
T (n) = n ? log2 (n + 1) ≈ n
則向下調整法時間復雜度為o(n)

向上調整法

先將元素插?到堆的末尾,即最后?個孩子之后
插?之后如果堆的性質遭到破壞,將新插?結點順著其雙雙親往上調整到合適位置即可

第1層, 2^?0 個結點,需要向上移動0層
第2層, 2 ^1 個結點,需要向上移動1層
第3層, 2 ^2 個結點,需要向上移動2層
第4層, 2 ^3 個結點,需要向上移動3層
......
第h層, 2 ^(h?1)?個結點,需要向上移動h-1層
相關計算:
向上調整算法建堆時間復雜度為: O(n ? log2 n)

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

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

相關文章

VSCode Cursor 大模型 插件擴展 Kilo Code 配置

1.1 概述 Kilo Code 是一個 VSCode Cursor 插件擴展&#xff0c;提供了對多種 AI 模型的支持&#xff0c;包括 Claude Code 和 Qwen3。通過正確配置 Kilo Code&#xff0c;可以在開發過程中獲得更好的 AI 輔助編程體驗。 Kilo使用文檔&#xff1a;https://kilocode.ai/docs/zh-…

深入解析:Unity、Unreal Engine與Godot引擎中的Uniform變量管理

在現代游戲開發中&#xff0c;Uniform變量是實現高質量圖形渲染的關鍵元素。不同游戲引擎對Uniform變量的管理方式有所不同&#xff0c;了解這些差異可以幫助開發者在選擇引擎時做出更明智的決策。本文將深入探討Unity、Unreal Engine和Godot引擎中Uniform變量的管理方式&#…

遨游旅游天地,開啟探索未知的夢幻之旅

你是否也懷揣著一顆對世界充滿好奇的心&#xff0c;渴望踏上探索旅游世界的奇妙旅程&#xff1f;旅游&#xff0c;是一場與未知的邂逅&#xff0c;是心靈的一次自由翱翔。想象一下&#xff0c;你置身于神秘莫測的撒哈拉沙漠。當夕陽的余暉灑在連綿起伏的沙丘上&#xff0c;那金…

SConscript 腳本入門教程

第一章&#xff1a;什么是 SCons 和 SConscript&#xff1f;核心概念SCons 是一個現代化的構建工具&#xff0c;用于自動化軟件構建過程&#xff0c;類似于 Make 但功能更強大、語法更簡潔。SConstruct&#xff1a;是 SCons 的主配置文件&#xff0c;通常在項目根目錄&#xff…

【深度學習】PyTorch從0到1——手寫你的第一個卷積神經網絡模型,AI模型開發全過程實戰

引言本次準備建立一個卷積神經網絡模型&#xff0c;用于區分鳥和飛機&#xff0c;并從CIFAR-10數據集中選出所有鳥和飛機作為本次的數據集。以此為例&#xff0c;介紹一個神經網絡模型從數據集準備、數據歸一化處理、模型網絡函數定義、模型訓練、結果驗證、模型文件保存&#…

云計算核心技術之容器技術

一、容器技術 1.1、為什么需要容器 在使用虛擬化一段時間后&#xff0c;發現它存在一些問題&#xff1a;不同的用戶&#xff0c;有時候只是希望運行各自的一些簡單程序&#xff0c;跑一個小進程。為了不相互影響&#xff0c;就要建立虛擬機。如果建虛擬機&#xff0c;顯然浪費就…

微信小程序通過uni.chooseLocation打開地圖選擇位置,相關設置及可能出現的問題

前言 uni.chooseLocation打開地圖選擇位置&#xff0c;看官方文檔介紹的比較簡單&#xff0c;但是需要注意的細節不少&#xff0c;如果沒有注意可能就無法使用該API或者報錯&#xff0c;下面就把詳細的配置方法做一下介紹。 一、勾選位置接口 ①在uniapp項目根目錄找到manif…

從財務整合到患者管理:德國醫療集團 Asklepios完成 SAP S/4HANA 全鏈條升級路徑

目錄 挑戰 解決方案 詳細信息 Asklepios成立于1985年&#xff0c;目前擁有約170家醫療機構&#xff0c;是德國大型私營診所運營商。Asklepios是希臘和羅馬神話中的醫神。 挑戰 Asklepios希望進一步擴大其作為數字醫療保健集團的地位。2020年9月&#xff0c;該公司與SNP合作…

高頻PCB廠家及工藝能力分析

一、技術領先型廠商&#xff08;適合高復雜度、高可靠性設計&#xff09;這類廠商在高頻材料處理、超精密加工和信號完整性控制方面具備深厚積累&#xff0c;尤其適合軍工、衛星通信、醫療設備等嚴苛場景&#xff1a;深南電路&#xff1a;在超高層板和射頻PCB領域是行業標桿&am…

AJAX 與 ASP 的融合:技術深度解析與應用

AJAX 與 ASP 的融合:技術深度解析與應用 引言 隨著互聯網技術的不斷發展,AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)技術逐漸成為構建動態網頁和應用程序的重要工具。本文將深入探討AJAX與ASP的融合,分析其原理、應用場景以及在實際開發中的優…

MuMu模擬器Pro Mac 安卓手機平板模擬器(Mac中文)

原文地址&#xff1a;MuMu模擬器Pro Mac 安卓手機平板模擬器 MuMu模擬器 Pro mac版&#xff0c;是一款MuMuPlayer安卓模擬器&#xff0c;可以暢快運行安卓游戲和應用。 MuMu模擬器Pro搭載安卓12操作系統&#xff0c;極致釋放設備性能&#xff0c;最高支持240幀畫面效果&#…

Oracle維護指南

Part 1 Oracle 基礎與架構#### **1.1 概述** - **Oracle 數據庫版本歷史與特性對比** - **版本演進**&#xff1a; - Oracle 8i&#xff08;1999&#xff09;&#xff1a;支持 Internet 應用&#xff0c;引入 Java 虛擬機&#xff08;JVM&#xff09;。 - Oracle 9i&#…

如何為PDF文件批量添加騎縫章?

騎縫章跨越多頁文件的邊緣加蓋&#xff0c;一旦文件被替換其中某一頁或順序被打亂&#xff0c;印章就無法對齊&#xff0c;能立刻發現異常。這有效保障了文件的完整性和真實性。它是純凈免費&#xff0c;不帶廣告&#xff0c;專治各類PDF蓋章需求。用法極簡&#xff1a;文件直接…

組合時代的 TOGAF?:為模塊化企業重新思考架構

隨著企業努力追求敏捷性和創新性&#xff0c;組合性正逐漸成為一項基礎性的設計原則。組合思維改變了企業交付能力的方式 —— 更傾向于采用模塊化、獨立的組件&#xff0c;這些組件可以快速組裝和重組。本文探討了長期以來作為企業架構框架的TOGAF標準如何演進以支持組合架構。…

電子元器件-電阻終篇:基本原理,電阻分類及特點,參數/手冊詳解,電阻作用及應用場景,電阻選型及實戰案例

目錄 一、基本原理 1.1 介紹 1.2 計算公式?編輯 1.3 單位 1.4 標稱值 二、分類及特點 2.1電阻分類及特點介紹 2.2常用電阻器件詳細介紹 三、參數/數據手冊解讀 3.1 阻值 3.2 封裝&功率 3.3 精度 3.5 額定電壓 3.6 溫度系數(TCR) 3.7 擴展 四、作用與使用場…

【軟件測試】電商購物項目-各個測試點整理(六)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、優惠券測試點 …

心路歷程-啟動流程的概念

我們之前已經安裝過系統&#xff0c;其實興奮的內心已經無以言表&#xff1b; 記得剛開始的那份喜悅是沒辦法演說的&#xff1b;可是高興之余&#xff0c;好像突然又心情EMO了&#xff1b; 為何呢&#xff1f;因為系統裝完了&#xff0c;你也不知道能夠干什么&#xff1b; 所以…

Kubernetes Ingress實戰:從環境搭建到應用案例

目錄 一、概述 版本對比圖 二、 Ingress應用案例 2.1 環境準備 2.2 驗證-NodePort模式 設置Http代理 2.3 驗證-LoadBalancer模式 修改ARP模式&#xff0c;啟用嚴格ARP模式 搭建metallb支持LoadBalancer 普通的service測試 ingress訪問測試&#xff1a; 一、概述 Ser…

項目發布上線清單

說明&#xff1a;博主想整理一份項目發布上線的清單&#xff0c;在每次發布上線前&#xff0c;對照清單一一核對&#xff0c;避免遺漏&#xff08;往事不堪回首&#xff09;&#xff0c;歡迎大家補充。 前端是否有與后端協同發布的接口&#xff1f; 如果有&#xff0c;先發前端…

HTB Information Gathering - Web Edition最后的測驗

因為它沒有DNS解析,,所以不要嘗試去使用dns枚舉所有枚舉出來的子域,馬上修改hosts文件,與ip和域名填好,因為它不依賴dns通過vhost子域爆破 爬蟲登場 w*****.inlanefreight.htb:32508爬到之后不要去理會那個api,除了填答案,,,其他任何用處都沒有,不要浪費時間后面就不能劇透了,可…