數據結構——查找(三、樹形查找)

一、二叉排序樹(BST)

1、二叉排序樹的定義

構造一棵二叉排序樹的目的并不是排序,而是提高查找、插入和刪除關鍵字的速度

二叉排序樹(也稱二叉搜索樹)或者是一顆空樹,或者是具有以下性質的二叉樹

1、若左子樹非空,則左子樹上所有結點的值均小于根節點的值

2、若右子樹非空,則右子樹上所有結點的值均大于根節點的值

3、左右子樹分別是一顆二叉排序樹

(右子樹所有結點的值均大于左子樹所有結點的值)

對二叉排序樹進行中序遍歷,可以得到一個遞增的有序序列

2、二叉排序樹的查找

二叉排序樹的查找是從根節點開始,是一個遞歸的過程

二叉排序樹的非遞歸查找算法 ,空間復雜度O(1)

//二叉排序樹的結點
typedef struct BSTNode{int key;struct BSTNode *lchild,*rchild;
}BSTNode, *BSTree;//二叉排序樹的非遞歸查找算法 
BSTNode *BST_Search(BSTree T, int key){while(T != NULL && key != T->key){ //若樹空或等于根節點值,則結束循環if(key < T->key){       //小于,則在左子樹上查找T = T->lchild;      //大于,則在右子樹上查找}else{T = T->rchild;}}return T;
}

二叉排序樹的遞歸查找算法 ,空間復雜度O(h)

//在二叉排序樹中查找值為key的結點(遞歸實現)
BSTNode *BST_Search_Recursion(BSTree T, int key){if(T == NULL){return NULL;    //查找失敗}if(key == T->key){return T;       //查找成功}else if(key < T->key){return BST_Search_Recursion(T->lchild, key);//在左子樹中找}else{return BST_Search_Recursion(T->rchild, key);//在右子樹中找}}

?3、二叉排序樹的插入

二叉排序樹是一顆動態樹,在查找過程中,當樹中不存在關鍵字值等于給定值的結點時進行插入。

若關鍵字的值小于根結點,則插入左子樹;反之,插入右子樹;

新插入的結點一定是一個葉節點,且是查找失敗時的查找路徑上訪問的最后一個結點的左孩子或右孩子

如圖,虛線表示查找路徑

在二叉排序樹中插入關鍵值為key的新結點(遞歸實現)

注:樹中存在相同關鍵字的結點會導致插入失敗

//在二叉排序樹中插入關鍵值為key的新結點(遞歸實現)
int BST_Insert(BSTree &T, int k){if(T == NULL){      //原樹為空,新插入的結點為根節點T = (BSTree)malloc(sizeof(BSTNode)); T->key = k;T->lchild = T->rchild = NULL;return 1;       //返回1,插入成功}else if(k == T->key){ //樹中存在相同關鍵字的結點,插入失敗return 0;}else if(k < T->key){   //插入到T的左子樹return BST_Insert(T->lchild, k);}else{                  //插入到T的右子樹return BST_Insert(T->rchild, k);}
}

在二叉排序樹中插入關鍵值為key的新結點(非遞歸實現)

//在二叉排序樹中插入關鍵值為key的新結點(非遞歸實現)
int BST_Insert2(BSTree &T, int key) {BSTNode *newNode = (BSTNode*)malloc(sizeof(BSTNode)); // 創建新節點newNode->key = key;newNode->lchild = newNode->rchild = NULL;if (T == NULL) {  // 如果樹為空,直接插入新節點作為根T = newNode;return 1; // 插入成功}BSTNode *parent = NULL;  // 用來記錄父節點BSTNode *current = T;    // 當前節點從根開始while (current != NULL) {parent = current;  // 記錄當前節點為父節點if (key == current->key) {free(newNode); // 如果樹中已有相同的key,插入失敗,釋放新節點return 0;  // 插入失敗}else if (key < current->key) {current = current->lchild;  // key 小于當前節點,移動到左子樹}else {current = current->rchild;  // key 大于當前節點,移動到右子樹}}// 在遍歷到NULL時,插入新節點if (key < parent->key) {parent->lchild = newNode;  // 插入到父節點的左子樹}else {parent->rchild = newNode;  // 插入到父節點的右子樹}return 1;  // 插入成功
}

4、二叉排序樹的構造

不同的輸入序列會得到不同的二叉排序樹

與二分查找判定樹不同,二分查找僅適用于有序的順序表,這也就意味著,同一個序列判定樹唯一。

//按照str[]中的關鍵字序列建立二叉排序樹
void create_BST(BSTree &T, int str[], int n){T = NULL;       //初始時T為空樹int i = 0;while(i < n){   //依次將每個關鍵字插入到二叉排序樹中BST_Insert(T, str[i]);i++;}
}

5、二叉排序樹的刪除

①若被刪除結點z是葉結點,則直接刪除,不會破壞二叉排序樹的性質;
②若結點z只有一棵左子樹或右子樹,則讓z的子樹替代z的位置;
③若結點z有左、右兩棵子樹,則進行中序遍歷,讓z的直接后繼(或直接前驅)替代z,然后從二叉排序樹中刪去這個直接后繼(直接前驅),這樣就轉換成了第一或第二種的情況。

如圖,刪除76,為第③種情況,找到直接前驅,將直接前驅的值60替代76。而后轉變為刪除60,此時轉變成第②種情況,直接讓60的左子樹(55)替代60,并釋放55即可。

在二叉排序樹中刪除關鍵值為key的結點(遞歸實現)

// 查找二叉樹中的最小結點(即直接后繼)
BSTNode* findMin(BSTree T) {while (T && T->lchild) {T = T->lchild;}return T;
}// 查找二叉樹中的最大結點(即直接前驅)
BSTNode* findMax(BSTree T) {while (T && T->rchild) {T = T->rchild;}return T;
}// 在二叉排序樹中刪除關鍵值為key的結點(遞歸實現)
BSTree BST_Delete(BSTree T, int key) {if (T == NULL) {return T;  // 樹為空,直接返回}// 如果key小于當前結點的key,則在左子樹中刪除if (key < T->key) {T->lchild = BST_Delete(T->lchild, key);}// 如果key大于當前結點的key,則在右子樹中刪除else if (key > T->key) {T->rchild = BST_Delete(T->rchild, key);}// 找到要刪除的結點else {// 1. 刪除的是葉結點if (T->lchild == NULL && T->rchild == NULL) {free(T);  // 直接釋放該結點return NULL;  // 返回NULL,刪除該結點}// 2. 刪除的結點只有一個子樹else if (T->lchild == NULL) {  // 只有右子樹BSTNode* temp = T;T = T->rchild;  // 用右子樹替代free(temp);}else if (T->rchild == NULL) {  // 只有左子樹BSTNode* temp = T;T = T->lchild;  // 用左子樹替代free(temp);}// 3. 刪除的結點有兩個子樹else {// 找到當前結點的直接后繼(右子樹中的最小節點)BSTNode* temp = findMin(T->rchild);T->key = temp->key;  // 用后繼節點替代當前節點T->rchild = BST_Delete(T->rchild, temp->key);  // 刪除后繼結點}}return T;
}

6、二叉排序樹的查找效率分析

二叉排序樹的查找效率取決于樹的高度。

若二叉排序樹左右子樹的高度只差的絕對值不超過1(即平衡二叉樹),它的平均查找長度為O(log_{2}n)成正比。

在最壞的情況下,若輸入序列為有序的,則會形成只有右孩子的單支樹,此時樹高為n,即平均查找長度為(n+1)/2

在查找方面,二叉排序樹和二分查找的性能差不多,但因為二叉排序樹與輸入序列有關,所以同一個序列兩種方法的平均查找長度(即效率)存在不同。

插入刪除結點維護有序性而言,二叉排序樹只需要移動指針,時間復雜度為O(log_{2}n

而二分查找本身為有序順序表,插入或刪除需要移動大量元素,時間復雜度為O(n)

二、平衡二叉樹(AVL)

平衡因子=左子樹高-右子樹高

平衡二叉樹——平衡因子的絕對值不超過1

1、平衡二叉樹的插入

插入一個結點會造成4種情況,處理方法可使用口訣

只有左孩子右上旋,只有右孩子左上旋

LL、RR兒子旋轉一次;LR、RL兒子、孫子各旋轉一次(共兩次)

RR型,右孩子的右子樹插入結點,即兒子右上旋轉

LR型,左孩子的右子樹插入結點,即孫子左上旋轉,兒子右上旋

RL型,右孩子的左子樹插入結點,即孫子右上旋轉,兒子左上旋

注:LR和RL旋轉時,新結點究竟插入C的左子樹還是右子樹不影響旋轉結果。最終保證最底層沒有H+1

2、平衡二叉樹的刪除

  1. 刪除結點(方法同“二叉排序樹”);
  2. 一路向北找到最小不平衡子樹,找不到就結束;
  3. 找最小不平衡子樹下,“個頭”最高的兒子、孫子;
  4. 根據孫子的位置,調整平衡(LL/RR/LR/RL);
  5. 如果不平衡向上傳導,回到第2條。

如圖,紅筆所示為刪除后的替換

  1. 若要刪除55,此時55為葉子結點,直接刪除
  2. 刪除之后一路向北,60仍然平衡,左右子樹均為空;75不平衡,左子樹高為1,右子樹高為3
  3. 找個頭最高的兒子為80,個頭最高的孫子為90
  4. 孫子90位于爺爺80的RR型,只需要兒子進行左上旋
  5. 調整完畢,向北探查,發現50也平衡,調整結束

3、平衡二叉樹的查找效率

假設以n_{h}表示深度為h的平衡樹中含有的最少結點數,則:

n_{0}= 0,n_{1}= 1,n_{2}= 2,并且有n_{h}?= n_{h-1}?+ n_{h-2}?+ 1

含有n個結點的平衡二叉樹的最大深度有遞推式推出,即O(log_{2}n

最小深度即滿二叉樹情況

三、紅黑樹

平衡二叉樹(AVL):在執行插入或刪除操作時,容易破壞其平衡性,因此需要頻繁調整樹拓撲結構。例如,當插入操作導致不平衡時,系統需要先計算平衡因子,定位最小不平衡子樹(這一過程耗時較大),然后執行LL/RR/LR/RL等旋轉操作來恢復平衡。

紅黑樹(RBT):在插入或刪除操作時,通常能夠保持其紅黑特性,因此不需要頻繁調整樹結構。即使需要調整,也往往能在常數時間內完成操作。

在實際使用中,平衡二叉樹適用于以查為主,很少插入/刪除的應用場景;而紅黑樹適用于頻繁插入/刪除的場景,實用性更強。

1、紅黑樹的定義

紅黑樹本質上是二叉排序樹

但是在插入時可以插入重復值

滿足如下性質的二叉排序樹即為紅黑樹:

  1. 滿足 左子樹結點值 ≤ 根節點值 ≤ 右子樹結點值;
  2. 每個結點或是紅色的,或是黑色的;
  3. 根節點是黑色的;
  4. 葉結點(外部結點、NULL結點、失敗結點)均是黑色的;
  5. 不存在兩個相鄰的紅結點(即紅結點的父節點和孩子結點均是黑色);
  6. 對每個結點,從該節點到任一葉結點的簡單路徑上,所含黑結點的數目相同。

左根右,根葉黑,不紅紅,黑路同

紅黑樹的結點定義

struct RBNode{          //紅黑樹的結點定義int key;            //關鍵字的值RBNode* parent;     //雙親結點指針RBNode* lchild;     //左孩子指針RBNode* rchild;     //右孩子指針int color;          //結點顏色,如:可用0/1表示黑/紅,也可以使用枚舉型enum表示顏色
};

1、從某個結點(不包含該結點)出發,到達一個葉結點的任意一個簡單路徑上的黑結點總數稱為該結點的黑高。(由性質6黑路同確定)

2、從根結點到葉結點的最長路徑不大于最短路徑的兩倍。

3、根結點黑高為h,至少2^{h}-1內部結點, 即只有黑結點,并且滿樹的情況。(由性質56確定),最多是2^{2h}-1

4、由于紅結點最多間隔插入黑結點,所以黑高h\geq \frac{h}{2},于是n\geq 2^{h/2}+1

2、紅黑樹的插入

1、先查找,確定插入位置(原理同二叉排序樹),插入新結點
2、新結點是 根——染為黑色
3、新結點 非根——染為紅色

  1. 若插入新結點后依然滿足紅黑樹定義,則插入結束
  2. 若插入新結點后不滿足紅黑樹定義,需要調整,使其重新滿足紅黑樹定義

? ? ? ? ? ? ? ? ? 黑叔:旋轉+染色

? ? ? ? ? ? ? ? ? ? ? ? ? LL型:右單旋,父換爺+染色

? ? ? ? ? ? ? ? ? ? ? ? ? RR型:左單旋,父換爺+染色

? ? ? ? ? ? ? ? ? ? ? ? ? LR型:左、右雙旋,兒換爺+染色

? ? ? ? ? ? ? ? ? ? ? ? ? RL型:右、左雙旋,兒換爺+染色

? ? ? ? ? ? ? ? ? 紅叔:染色+變新

? ? ? ? ? ? ? ? ? ? ? ? ? 叔父爺染色,爺變為新結點

紅黑樹的插入,更多注意不紅紅的情況,而后是根葉黑,至于左根右、黑路同,在插入的時候規則就考慮了。

四、完整代碼實現

1、二叉排序樹部分

#include <iostream>
#include <cstdlib>using namespace std;//二叉排序樹的結點
typedef struct BSTNode{int key;struct BSTNode *lchild,*rchild;
}BSTNode, *BSTree;//二叉排序樹的非遞歸查找算法 
BSTNode *BST_Search(BSTree T, int key){while(T != NULL && key != T->key){ //若樹空或等于根節點值,則結束循環if(key < T->key){       //小于,則在左子樹上查找T = T->lchild;      //大于,則在右子樹上查找}else{T = T->rchild;}}return T;}//在二叉排序樹中查找值為key的結點(遞歸實現)
BSTNode *BST_Search_Recursion(BSTree T, int key){if(T == NULL){return NULL;    //查找失敗}if(key == T->key){return T;       //查找成功}else if(key < T->key){return BST_Search_Recursion(T->lchild, key);//在左子樹中找}else{return BST_Search_Recursion(T->rchild, key);//在右子樹中找}}//在二叉排序樹中插入關鍵值為key的新結點(遞歸實現)
int BST_Insert(BSTree &T, int k){if(T == NULL){      //原樹為空,新插入的結點為根節點T = (BSTree)malloc(sizeof(BSTNode)); T->key = k;T->lchild = T->rchild = NULL;return 1;       //返回1,插入成功}else if(k == T->key){ //樹中存在相同關鍵字的結點,插入失敗return 0;}else if(k < T->key){   //插入到T的左子樹return BST_Insert(T->lchild, k);}else{                  //插入到T的右子樹return BST_Insert(T->rchild, k);}
}//在二叉排序樹中插入關鍵值為key的新結點(非遞歸實現)
int BST_Insert2(BSTree &T, int key) {BSTNode *newNode = (BSTNode*)malloc(sizeof(BSTNode)); // 創建新節點newNode->key = key;newNode->lchild = newNode->rchild = NULL;if (T == NULL) {  // 如果樹為空,直接插入新節點作為根T = newNode;return 1; // 插入成功}BSTNode *parent = NULL;  // 用來記錄父節點BSTNode *current = T;    // 當前節點從根開始while (current != NULL) {parent = current;  // 記錄當前節點為父節點if (key == current->key) {free(newNode); // 如果樹中已有相同的key,插入失敗,釋放新節點return 0;  // 插入失敗}else if (key < current->key) {current = current->lchild;  // key 小于當前節點,移動到左子樹}else {current = current->rchild;  // key 大于當前節點,移動到右子樹}}// 在遍歷到NULL時,插入新節點if (key < parent->key) {parent->lchild = newNode;  // 插入到父節點的左子樹}else {parent->rchild = newNode;  // 插入到父節點的右子樹}return 1;  // 插入成功
}//按照str[]中的關鍵字序列建立二叉排序樹
void create_BST(BSTree &T, int str[], int n){T = NULL;       //初始時T為空樹int i = 0;while(i < n){   //依次將每個關鍵字插入到二叉排序樹中BST_Insert(T, str[i]);i++;}
}// 查找二叉樹中的最小結點(即直接后繼)
BSTNode* findMin(BSTree T) {while (T && T->lchild) {T = T->lchild;}return T;
}// 查找二叉樹中的最大結點(即直接前驅)
BSTNode* findMax(BSTree T) {while (T && T->rchild) {T = T->rchild;}return T;
}// 在二叉排序樹中刪除關鍵值為key的結點(遞歸實現)
BSTree BST_Delete(BSTree T, int key) {if (T == NULL) {return T;  // 樹為空,直接返回}// 如果key小于當前結點的key,則在左子樹中刪除if (key < T->key) {T->lchild = BST_Delete(T->lchild, key);}// 如果key大于當前結點的key,則在右子樹中刪除else if (key > T->key) {T->rchild = BST_Delete(T->rchild, key);}// 找到要刪除的結點else {// 1. 刪除的是葉結點if (T->lchild == NULL && T->rchild == NULL) {free(T);  // 直接釋放該結點return NULL;  // 返回NULL,刪除該結點}// 2. 刪除的結點只有一個子樹else if (T->lchild == NULL) {  // 只有右子樹BSTNode* temp = T;T = T->rchild;  // 用右子樹替代free(temp);}else if (T->rchild == NULL) {  // 只有左子樹BSTNode* temp = T;T = T->lchild;  // 用左子樹替代free(temp);}// 3. 刪除的結點有兩個子樹else {// 找到當前結點的直接后繼(右子樹中的最小節點)BSTNode* temp = findMin(T->rchild);T->key = temp->key;  // 用后繼節點替代當前節點T->rchild = BST_Delete(T->rchild, temp->key);  // 刪除后繼結點}}return T;
}// 在二叉排序樹中刪除關鍵值為key的結點(非遞歸實現)
BSTree BST_Delete2(BSTree T, int key) {BSTNode* parent = NULL;BSTNode* current = T;while (current != NULL && current->key != key) {parent = current;if (key < current->key) {current = current->lchild;} else {current = current->rchild;}}// 如果樹中沒有該結點if (current == NULL) {return T;  // 不刪除任何結點}// 刪除的結點有兩個子樹if (current->lchild != NULL && current->rchild != NULL) {// 找到右子樹中的最小結點作為后繼BSTNode* successorParent = current;BSTNode* successor = current->rchild;while (successor->lchild != NULL) {successorParent = successor;successor = successor->lchild;}// 替換當前結點的值為后繼結點的值current->key = successor->key;// 刪除后繼結點if (successorParent->lchild == successor) {successorParent->lchild = successor->rchild;} else {successorParent->rchild = successor->rchild;}free(successor);}// 刪除的結點沒有左子樹,只有右子樹else if (current->lchild == NULL) {if (parent == NULL) { // 如果刪除的是根結點T = current->rchild;} else if (parent->lchild == current) {parent->lchild = current->rchild;} else {parent->rchild = current->rchild;}free(current);}// 刪除的結點沒有右子樹,只有左子樹else if (current->rchild == NULL) {if (parent == NULL) { // 如果刪除的是根結點T = current->lchild;} else if (parent->lchild == current) {parent->lchild = current->lchild;} else {parent->rchild = current->lchild;}free(current);}return T;
}void inorderTraversal(BSTree T) {if (T != NULL) {inorderTraversal(T->lchild);cout << T->key << " ";inorderTraversal(T->rchild);}
}int main() {BSTree T = NULL;int keys[] = {50, 30, 70, 20, 40, 60, 80};int n = sizeof(keys) / sizeof(keys[0]);// 創建二叉排序樹create_BST(T, keys, n);// 打印樹的中序遍歷cout << "中序遍歷輸出:";inorderTraversal(T);cout << endl;// 查找某個元素int searchKey = 40;BSTNode* result = BST_Search(T, searchKey);if (result != NULL) {cout << "找到節點:" << result->key << endl;} else {cout << "未找到節點" << endl;}// 遞歸查找result = BST_Search_Recursion(T, searchKey);if (result != NULL) {cout << "遞歸查找找到節點:" << result->key << endl;} else {cout << "遞歸查找未找到節點" << endl;}// 刪除一個結點并展示中序遍歷int deleteKey = 70;cout << "刪除結點 " << deleteKey << endl;T = BST_Delete(T, deleteKey);inorderTraversal(T);cout << endl;return 0;
}

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

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

相關文章

八股——Kafka相關

文章目錄1、 消息隊列的作用什么&#xff1f;思&#xff1a;消息隊列是什么?消息隊列的定義消息隊列的工作原理消息隊列的作用消息隊列的常見類型消息隊列的簡單例子2、Kafka 集群的架構是什么樣子的&#xff1f;3、Kafka 消費者組和生產者組是什么&#xff1f;定義與核心作用…

墨者學院SQL手工注入漏洞測試(MySQL數據庫)題目,純手工注入教程

打開練習手工注入的靶場,發現此時為一個登錄頁面,我們先試著登錄看看注入點在不在登錄頁面 使用用戶:or 1=1# 密碼:admin123;嘗試登錄,發現顯示錯誤后直接彈回原頁面,無sql報錯相關語句,這里不存在sql注入點 一:判斷注入點以及猜測是否有注入 此時點擊這里的動態頁面…

[硬件電路-140]:模擬電路 - 信號處理電路 - 鎖定放大器概述、工作原理、常見芯片、管腳定義

一、鎖定放大器概述鎖定放大器&#xff08;Lock-in Amplifier&#xff09;是一種基于相干檢測技術的高靈敏度測量儀器&#xff0c;通過將待測信號與參考信號進行同步處理&#xff0c;從強噪聲中提取微弱信號并精確測量其振幅與相位。其核心優勢包括&#xff1a;信噪比提升&…

下載 | Windows Server 2025官方原版ISO映像!(7月更新、標準版、數據中心版、26100.4652)

? 資源A066_Windows_Server_2025系統映像&#x1f536; Windows Server 2025官方原版ISO映像&#xff0c;7月更新版已放出。提供來自微軟官方每月更新的ISO原版映像&#xff0c;內部包含了標準版和數據中心版&#xff0c;可選擇無GUI界面版或桌面體驗版&#xff0c;滿足不同部…

Go 語言模糊測試 (Fuzz Testing) 深度解析與實踐

學習一個知識&#xff0c;要先了解它的來源 1. 模糊測試的誕生&#xff1a;Barton Miller 的故事 “Fuzz”一詞起源于1988年&#xff0c;由威斯康星大學麥迪遜分校的Barton Miller教授及其研究生團隊在一個高級操作系統課程項目中提出 。這個概念的誕生頗具戲劇性。Miller教授在…

【軟考和軟著】

一、&#x1f4ab; 杭州E類人才政策 在這里插入圖片描述 二、人才認定標準 三、關于軟考 1、什么是軟考&#xff1f; 軟考指的是“計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試”。計算機軟件資格考試是由國家人力資源和社會保障部、工業和信息化部領導下…

「源力覺醒 創作者計劃」開源大模型重構數智文明新范式

起來輕松玩轉文心大模型吧一文心大模型免費下載地址&#xff1a;https://ai.gitcode.com/paddlepaddle/ERNIE-4.5-VL-424B-A47B-Paddle開源大模型的崛起與AI幻覺挑戰&#xff1a;中國AI發展的雙重使命 ——從技術追趕到生態引領的跨越之路一、開源大模型&#xff1a;重構數智文…

政務云數智化轉型:靈雀云打造核心技術支撐能力

政務云數智化轉型進行時&#xff0c;亟需體系升級政務信息化作為政府治理與服務的重要支撐&#xff0c;業務呈現出政策性強、數據敏感度高、系統復雜度高、服務連續性要求嚴等特點&#xff0c;對IT系統提出了極高要求&#xff1a;不僅需支撐高并發、高可用的政務應用&#xff0…

軟件測試自學之路

別找了&#xff01;2025B站最全最細的軟件測試教程&#xff0c;7天從零基礎小白到精通軟件測試&#xff0c;學完即上崗&#xff01;自學軟件測試對于小白來說還是有一定的難度&#xff0c;各種專業術語的不熟悉&#xff0c;各種電腦操作的不熟悉&#xff0c;有時候要安裝一個學…

備案期間老網站有什么要求

老網站的內容必須符合法律法規和互聯網管理規定。這可不是開玩笑的事兒&#xff0c;相關部門對于網站內容的審核可是相當嚴格的。比如說&#xff0c;不能有違法犯罪、色情低俗、虛假信息等不良內容。根據互聯網信息管理專家的建議&#xff0c;網站內容應該積極健康、真實準確。…

Java數組轉換為逗號分隔字符串的方法

Java數組轉換為逗號分隔字符串的方法 在Java中&#xff0c;將數組轉換為逗號分隔的字符串有幾種常用方法&#xff0c;以下是清晰可靠的實現方案&#xff1a; 方法1&#xff1a;使用Arrays.toString() 字符串處理&#xff08;通用型&#xff09; import java.util.Arrays;publi…

抗輻照DCDC與MCU在核環境監測設備中的集成應用

摘要核環境監測設備對保障核設施安全、保護環境與人員健康意義重大&#xff0c;需在復雜惡劣的核環境中穩定運行。電子設備易受核輻射影響產生單粒子效應等故障&#xff0c;選用具備抗輻照能力的DCDC與MCU芯片至關重要。本文結合實際測試數據&#xff0c;深入探討抗輻照DCDC與M…

C語言-指針[指針數組和數組指針]

知識重復變量指針&#xff1a;變量最小的地址值&#xff08;首地址&#xff09;&#xff0c;本質是地址、指針指針變量&#xff1a;存儲指針的變量&#xff0c;本質是變量&&#xff1a;取地址運算符&#xff08;取址符、取地址符&#xff09;&#xff0c;獲取變量、數組等的…

NX982NX984美光固態閃存NX992NY102

NX982NX984美光固態閃存NX992NY102技術革新引領存儲革命——深度拆解美光NX系列固態閃存在數字化浪潮席卷全球的當下&#xff0c;數據存儲已成為支撐人工智能、云計算與物聯網等前沿領域的核心基礎設施。作為行業標桿企業&#xff0c;美光科技推出的NX系列固態閃存產品&#xf…

Elasticsearch 集群管理核心 API 指南:健康、狀態、分片診斷與運維實戰

一、集群健康狀態 API (_cluster/health) 獲取集群的總體健康狀況&#xff0c;是監控的首要指標。 GET http://192.168.130.61:9200/_cluster/health響應字段解析 curl http://192.168.130.61:9200/_cluster/health 2>/dev/null |jq {"cluster_name": "E…

Three.js 與 WebXR:初識 VR/AR 開發

引言 WebXR 是現代 Web 技術的重要組成部分&#xff0c;允許開發者通過瀏覽器創建虛擬現實&#xff08;VR&#xff09;和增強現實&#xff08;AR&#xff09;體驗。結合 Three.js 的強大渲染能力&#xff0c;WebXR 可以輕松構建沉浸式 3D 場景。本文將介紹如何使用 Three.js 和…

Kubernetes架構概覽

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 Kubernetes架構概覽 1.1 Kubernetes簡介 1.2 基本架構 1.3 主要組件 1.4 核心功能 組件架構圖解 2.1 控制平面組件詳解 2.1.1 kube-apiserver 2.1.2 etcd 2.1.3 kube-scheduler 2.1.4 kube-controll…

前端技術棧查缺補漏

前端技術棧涵蓋廣泛&#xff0c;涉及多個領域和技術方向。以下是全面的分類總結&#xff0c;幫助你對前端技術生態有系統化的了解&#xff1a;一、核心基礎HTML/CSS HTML5&#xff08;語義化標簽、Web Components&#xff09;CSS3&#xff08;Flexbox/Grid、動畫、變量、BEM/SM…

文明7|席德·梅爾的文明VII PC/手機雙端 模擬器版(Sid Meier’s Civilization VII)免安裝中文版

網盤鏈接&#xff1a; 文明7|席德梅爾的文明VII 免安裝中文版 名稱&#xff1a;文明7|席德梅爾的文明VII PC/手機雙端 模擬器版 免安裝中文版 描述&#xff1a;這款策略神作重新定義了"歷史蝴蝶效應"&#xff01; 《文明7》的"文明基因"系統讓每個選擇都刻…

C#模式匹配用法與總結

1. 模式匹配概述?? 模式匹配是C# 7.0引入的機制&#xff0c;用于檢查數據的類型、值或結構&#xff0c;并提取信息。通過is表達式、switch語句/表達式實現&#xff0c;顯著簡化條件邏輯&#xff0c;提升代碼可讀性和安全性。 ??核心優勢??&#xff1a; ??簡潔性??&…