數據結構的樹存儲結構

數據結構的樹存儲結構

之前介紹的所有的數據結構都是線性存儲結構。本章所介紹的樹結構是一種非線性存儲結構,存儲的是具有“一對多”關系的數據元素的集合。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ?(A) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(B)?

圖 1 樹的示例


圖 1(A) 是使用樹結構存儲的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意圖。對于數據 A 來說,和數據 B、C、D 有關系;對于數據 B 來說,和 E、F 有關系。這就是“一對多”的關系。

將具有“一對多”關系的集合中的數據元素按照圖 1(A)的形式進行存儲,整個存儲形狀在邏輯結構上看,類似于實際生活中倒著的樹(圖 1(B)倒過來),所以稱這種存儲結構為“樹型”存儲結構。

樹的結點

結點:使用樹結構存儲的每一個數據元素都被稱為“結點”。例如,圖 1(A)中,數據元素 A 就是一個結點;

父結點(雙親結點)、子結點和兄弟結點:對于圖 1(A)中的結點 A、B、C、D 來說,A 是 B、C、D 結點的父結點(也稱為“雙親結點”),而 B、C、D 都是 A 結點的子結點(也稱“孩子結點”)。對于 B、C、D 來說,它們都有相同的父結點,所以它們互為兄弟結點

樹根結點(簡稱“根結點”):每一個非空樹都有且只有一個被稱為根的結點。圖 1(A)中,結點 A 就是整棵樹的根結點。

樹根的判斷依據為:如果一個結點沒有父結點,那么這個結點就是整棵樹的根結點。

葉子結點:如果結點沒有任何子結點,那么此結點稱為葉子結點(葉結點)。例如圖 1(A)中,結點 K、L、F、G、M、I、J 都是這棵樹的葉子結點。

子樹和空樹

子樹:如圖 1(A)中,整棵樹的根結點為結點 A,而如果單看結點 B、E、F、K、L 組成的部分來說,也是棵樹,而且節點 B 為這棵樹的根結點。所以稱 B、E、F、K、L 這幾個結點組成的樹為整棵樹的子樹;同樣,結點 E、K、L 構成的也是一棵子樹,根結點為 E。

注意:單個結點也是一棵樹,只不過根結點就是它本身。圖 1(A)中,結點 K、L、F 等都是樹,且都是整棵樹的子樹。

知道了子樹的概念后,樹也可以這樣定義:樹是由根結點和若干棵子樹構成的。

空樹:如果集合本身為空,那么構成的樹就被稱為空樹。空樹中沒有結點。

補充:在樹結構中,對于具有同一個根結點的各個子樹,相互之間不能有交集。例如,圖 1(A)中,除了根結點 A,其余元素又各自構成了三個子樹,根結點分別為 B、C、D,這三個子樹相互之間沒有相同的結點。如果有,就破壞了樹的結構,不能算做是一棵樹。

結點的度和層次

對于一個結點,擁有的子樹數(結點有多少分支)稱為結點的度(Degree)。例如,圖 1(A)中,根結點 A 下分出了 3 個子樹,所以,結點 A 的度為 3。

一棵樹的度是樹內各結點的度的最大值。圖 1(A)表示的樹中,各個結點的度的最大值為 3,所以,整棵樹的度的值是 3。

?

結點的層次:從一棵樹的樹根開始,樹根所在層為第一層,根的孩子結點所在的層為第二層,依次類推。對于圖 1(A)來說,A 結點在第一層,B、C、D 為第二層,E、F、G、H、I、J 在第三層,K、L、M 在第四層。

一棵樹的深度(高度)是樹中結點所在的最大的層次。圖 1(A)樹的深度為 4。

如果兩個結點的父結點雖不相同,但是它們的父結點處在同一層次上,那么這兩個結點互為堂兄弟。例如,圖 1(A)中,結點 G 和 E、F、H、I、J 的父結點都在第二層,所以之間為堂兄弟的關系。

有序樹和無序樹

如果樹中結點的子樹從左到右看,誰在左邊,誰在右邊,是有規定的,這棵樹稱為有序樹;反之稱為無序樹。

在有序樹中,一個結點最左邊的子樹稱為"第一個孩子",最右邊的稱為"最后一個孩子"。

拿圖 1(A)來說,如果是其本身是一棵有序樹,則以結點 B 為根結點的子樹為整棵樹的第一個孩子,以結點 D 為根結點的子樹為整棵樹的最后一個孩子。

森林

由 m(m >= 0)個互不相交的樹組成的集合被稱為森林。圖 1(A)中,分別以 B、C、D 為根結點的三棵子樹就可以稱為森林。

前面講到,樹可以理解為是由根結點和若干子樹構成的,而這若干子樹本身是一個森林,所以,樹還可以理解為是由根結點和森林組成的。用一個式子表示為:

Tree =(root,F)

其中,root 表示樹的根結點,F 表示由 m(m >= 0)棵樹組成的森林。

樹的表示方法

除了圖 1(A)表示樹的方法外,還有其他表示方法:


? ? ? ? ? (A) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (B)

圖2 樹的表示形式
?

圖 2(A)是以嵌套的集合的形式表示的(集合之間絕不能相交,即圖中任意兩個圈不能相交)。

圖 2(B)使用的是凹入表示法(了解即可),表示方式是:最長條為根結點,相同長度的表示在同一層次。例如 B、C、D 長度相同,都為 A 的子結點,E 和 F 長度相同,為 B 的子結點,K 和 L 長度相同,為 E 的子結點,依此類推。

最常用的表示方法是使用廣義表的方式。圖 1(A)用廣義表表示為:

(A , ( B ( E ( K , L ) , F ) , C ( G ) , D ( H ( M ) , I , J ) ) )

總結

樹型存儲結構類似于家族的族譜,各個結點之間也同樣可能具有父子、兄弟、表兄弟的關系。本節中,要重點理解樹的根結點和子樹的定義,同時要會計算樹中各個結點的度和層次,以及樹的深度。

什么是二叉樹(包含滿二叉樹和完全二叉樹)

簡單地理解,滿足以下兩個條件的樹就是二叉樹:

  1. 本身是有序樹;
  2. 樹中包含的各個節點的度不能超過 2,即只能是 0、1 或者 2;


例如,圖 1a) 就是一棵二叉樹,而圖 1b) 則不是。


?

二叉樹示意圖


圖 1 二叉樹示意圖

二叉樹的性質

經過前人的總結,二叉樹具有以下幾個性質:

  1. 二叉樹中,第 i 層最多有 2i-1?個結點
  2. 如果二叉樹的深度為 K,那么此二叉樹最多有 2K-1 個結點。
  3. 二叉樹中,終端結點數(葉子結點數)為 n0,度為 2 的結點數為 n2,則 n0=n2+1

性質 3 的計算方法為:對于一個二叉樹來說,除了度為 0 的葉子結點和度為 2 的結點,剩下的就是度為 1 的結點(設為 n1),那么總結點 n=n0+n1+n2
同時,對于每一個結點來說都是由其父結點分支表示的,假設樹中分枝數為 B,那么總結點數 n=B+1。而分枝數是可以通過 n1?和 n2?表示的,即 B=n1+2*n2。所以,n 用另外一種方式表示為 n=n1+2*n2+1。
兩種方式得到的 n 值組成一個方程組,就可以得出 n0=n2+1。


二叉樹還可以繼續分類,衍生出滿二叉樹和完全二叉樹。

滿二叉樹

如果二叉樹中除了葉子結點,每個結點的度都為 2,則此二叉樹稱為滿二叉樹。


?

滿二叉樹示意圖


圖 2 滿二叉樹示意圖


如圖 2 所示就是一棵滿二叉樹。

滿二叉樹除了滿足普通二叉樹的性質,還具有以下性質:

  1. 滿二叉樹中第 i 層的節點數為 2n-1?個。
  2. 深度為 k 的滿二叉樹必有 2k-1 個節點 ,葉子數為 2k-1。
  3. 滿二叉樹中不存在度為 1 的節點,每一個分支點中都兩棵深度相同的子樹,且葉子節點都在最底層。
  4. 具有 n 個節點的滿二叉樹的深度為 log2(n+1)。

完全二叉樹

如果二叉樹中除去最后一層節點為滿二叉樹,且最后一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。

完全二叉樹示意圖


圖 3 完全二叉樹示意圖


如圖 3a) 所示是一棵完全二叉樹,圖 3b) 由于最后一層的節點沒有按照從左向右分布,因此只能算作是普通的二叉樹。

完全二叉樹除了具有普通二叉樹的性質,它自身也具有一些獨特的性質,比如說,n 個結點的完全二叉樹的深度為 ?log2n?+1。

?log2n? 表示取小于 log2n 的最大整數。例如,?log24? = 2,而 ?log25? 結果也是 2。

對于任意一個完全二叉樹來說,如果將含有的結點按照層次從左到右依次標號(如圖 3a)),對于任意一個結點 i ,完全二叉樹還有以下幾個結論成立:

  1. 當 i>1 時,父親結點為結點 [i/2] 。(i=1 時,表示的是根結點,無父親結點)
  2. 如果 2*i>n(總結點的個數) ,則結點 i 肯定沒有左孩子(為葉子結點);否則其左孩子是結點 2*i 。
  3. 如果 2*i+1>n ,則結點 i 肯定沒有右孩子;否則右孩子是結點 2*i+1 。

二叉樹的順序存儲結構(看了無師自通)

二叉樹的存儲結構有兩種,分別為順序存儲和鏈式存儲。本節先介紹二叉樹的順序存儲結構。

二叉樹的順序存儲,指的是使用順序表(數組)存儲二叉樹。需要注意的是,順序存儲只適用于完全二叉樹。換句話說,只有完全二叉樹才可以使用順序表存儲。因此,如果我們想順序存儲普通二叉樹,需要提前將普通二叉樹轉化為完全二叉樹。

有讀者會說,滿二叉樹也可以使用順序存儲。要知道,滿二叉樹也是完全二叉樹,因為它滿足完全二叉樹的所有特征。

普通二叉樹轉完全二叉樹的方法很簡單,只需給二叉樹額外添加一些節點,將其"拼湊"成完全二叉樹即可。如圖 1 所示:


?


圖 1 普通二叉樹的轉化


圖 1 中,左側是普通二叉樹,右側是轉化后的完全(滿)二叉樹。

解決了二叉樹的轉化問題,接下來學習如何順序存儲完全(滿)二叉樹。

完全二叉樹的順序存儲,僅需從根節點開始,按照層次依次將樹中節點存儲到數組即可。


?


圖 2 完全二叉樹示意圖


例如,存儲圖 2 所示的完全二叉樹,其存儲狀態如圖 3 所示:


?


圖 3 完全二叉樹存儲狀態示意圖


同樣,存儲由普通二叉樹轉化來的完全二叉樹也是如此。例如,圖 1 中普通二叉樹的數組存儲狀態如圖 4 所示:


?


圖 4 普通二叉樹的存儲狀態


由此,我們就實現了完全二叉樹的順序存儲。

不僅如此,從順序表中還原完全二叉樹也很簡單。我們知道,完全二叉樹具有這樣的性質,將樹中節點按照層次并從左到右依次標號(1,2,3,...),若節點 i 有左右孩子,則其左孩子節點為 2*i,右孩子節點為 2*i+1。此性質可用于還原數組中存儲的完全二叉樹,也就是實現由圖 3 到圖 2、由圖 4 到圖 1 的轉變。

二叉樹的鏈式存儲結構(C語言詳解)

本節我們學習二叉樹的鏈式存儲結構。

普通二叉樹示意圖


圖 1 普通二叉樹示意圖


如圖 1 所示,此為一棵普通的二叉樹,若將其采用鏈式存儲,則只需從樹的根節點開始,將各個節點及其左右孩子使用鏈表存儲即可。因此,圖 1 對應的鏈式存儲結構如圖 2 所示:


?

二叉樹鏈式存儲結構示意圖


圖 2 二叉樹鏈式存儲結構示意圖


由圖 2 可知,采用鏈式存儲二叉樹時,其節點結構由 3 部分構成(如圖 3 所示):

  • 指向左孩子節點的指針(Lchild);
  • 節點存儲的數據(data);
  • 指向右孩子節點的指針(Rchild);

二叉樹節點結構


圖 3 二叉樹節點結構


表示該節點結構的 C 語言代碼為:

 
  1. typedef struct BiTNode{
  2. TElemType data;//數據域
  3. struct BiTNode *lchild,*rchild;//左右孩子指針
  4. struct BiTNode *parent;
  5. }BiTNode,*BiTree;


圖 2 中的鏈式存儲結構對應的 C 語言代碼為:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TElemType int
  4. typedef struct BiTNode{
  5. ??? TElemType data;//數據域
  6. ??? struct BiTNode *lchild,*rchild;//左右孩子指針
  7. }BiTNode,*BiTree;
  8. void CreateBiTree(BiTree *T){
  9. ??? *T=(BiTNode*)malloc(sizeof(BiTNode));
  10. ??? (*T)->data=1;
  11. ??? (*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));
  12. ??? (*T)->lchild->data=2;
  13. ??? (*T)->rchild=(BiTNode*)malloc(sizeof(BiTNode));
  14. ??? (*T)->rchild->data=3;
  15. ??? (*T)->rchild->lchild=NULL;
  16. ??? (*T)->rchild->rchild=NULL;
  17. ??? (*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
  18. ??? (*T)->lchild->lchild->data=4;
  19. ??? (*T)->lchild->rchild=NULL;
  20. ??? (*T)->lchild->lchild->lchild=NULL;
  21. ??? (*T)->lchild->lchild->rchild=NULL;
  22. }
  23. int main() {
  24. ??? BiTree Tree;
  25. ??? CreateBiTree(&Tree);
  26. ??? printf("%d",Tree->lchild->lchild->data);
  27. ??? return 0;
  28. }

程序輸出結果:

4

其實,二叉樹的鏈式存儲結構遠不止圖 2 所示的這一種。例如,在某些實際場景中,可能會做 "查找某節點的父節點" 的操作,這時可以在節點結構中再添加一個指針域,用于各個節點指向其父親節點,如圖 4 所示:


?

自定義二叉樹的鏈式存儲結構


圖 4 自定義二叉樹的鏈式存儲結構

這樣的鏈表結構,通常稱為三叉鏈表。

利用圖 4 所示的三叉鏈表,我們可以很輕松地找到各節點的父節點。因此,在解決實際問題時,用合適的鏈表結構存儲二叉樹,可以起到事半功倍的效果。

樹的雙親表示法

普通樹結構的數據。


?

普通樹存儲結構


圖 1 普通樹存儲結構


如圖 1 所示,這是一棵普通的樹,該如何存儲呢?通常,存儲具有普通樹結構數據的方法有 3 種:

  1. 雙親表示法;
  2. 孩子表示法;
  3. 孩子兄弟表示法;


本節先來學習雙親表示法。

雙親表示法采用順序表(也就是數組)存儲普通樹,其實現的核心思想是:順序存儲各個節點的同時,給各節點附加一個記錄其父節點位置的變量。

注意,根節點沒有父節點(父節點又稱為雙親節點),因此根節點記錄父節點位置的變量通常置為 -1。

例如,采用雙親表示法存儲圖 1 中普通樹,其存儲狀態如圖 2 所示:


?

雙親表示法存儲普通樹示意圖


圖 2 雙親表示法存儲普通樹示意圖

樹的孩子表示法

孩子表示法存儲普通樹采用的是 "順序表+鏈表" 的組合結構,其存儲過程是:從樹的根節點開始,使用順序表依次存儲樹中各個節點,需要注意的是,與雙親表示法不同,孩子表示法會給各個節點配備一個鏈表,用于存儲各節點的孩子節點位于順序表中的位置。

如果節點沒有孩子節點(葉子節點),則該節點的鏈表為空鏈表。

例如,使用孩子表示法存儲圖 1a) 中的普通樹,則最終存儲狀態如圖 1b) 所示:


?


圖 1 孩子表示法存儲普通樹示意圖


圖 1 所示轉化為 C 語言代碼為:

 
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAX_SIZE 20
  4. #define TElemType char
  5. //孩子表示法
  6. typedef struct CTNode {
  7. ??? int child;//鏈表中每個結點存儲的不是數據本身,而是數據在數組中存儲的位置下標
  8. ??? struct CTNode * next;
  9. }ChildPtr;
  10. typedef struct {
  11. ??? TElemType data;//結點的數據類型
  12. ??? ChildPtr* firstchild;//孩子鏈表的頭指針
  13. }CTBox;
  14. typedef struct {
  15. ??? CTBox nodes[MAX_SIZE];//存儲結點的數組
  16. ??? int n, r;//結點數量和樹根的位置
  17. }CTree;
  18. //孩子表示法存儲普通樹
  19. CTree initTree(CTree tree) {
  20. ??? printf("輸入節點數量:\n");
  21. ??? scanf("%d", &(tree.n));
  22. ??? for (int i = 0; i < tree.n; i++) {
  23. ??????? printf("輸入第 %d 個節點的值:\n", i + 1);
  24. ??????? getchar();
  25. ??????? scanf("%c", &(tree.nodes[i].data));
  26. ??????? tree.nodes[i].firstchild = (ChildPtr*)malloc(sizeof(ChildPtr));
  27. ??????? tree.nodes[i].firstchild->next = NULL;
  28. ??????? printf("輸入節點 %c 的孩子節點數量:\n", tree.nodes[i].data);
  29. ??????? int Num;
  30. ??????? scanf("%d", &Num);
  31. ??????? if (Num != 0) {
  32. ??????????? ChildPtr * p = tree.nodes[i].firstchild;
  33. ??????????? for (int j = 0; j < Num; j++) {
  34. ??????????????? ChildPtr * newEle = (ChildPtr*)malloc(sizeof(ChildPtr));
  35. ??????????????? newEle->next = NULL;
  36. ??????????????? printf("輸入第 %d 個孩子節點在順序表中的位置", j + 1);
  37. ??????????????? scanf("%d", &(newEle->child));
  38. ??????????????? p->next = newEle;
  39. ??????????????? p = p->next;
  40. ??????????? }
  41. ??????? }
  42. ??? }
  43. ??? return tree;
  44. }
  45. void findKids(CTree tree, char a) {
  46. ??? int hasKids = 0;
  47. ??? for (int i = 0; i < tree.n; i++) {
  48. ??????? if (tree.nodes[i].data == a) {
  49. ??????????? ChildPtr * p = tree.nodes[i].firstchild->next;
  50. ??????????? while (p) {
  51. ??????????????? hasKids = 1;
  52. ??????????????? printf("%c ", tree.nodes[p->child].data);
  53. ??????????????? p = p->next;
  54. ??????????? }
  55. ??????????? break;
  56. ??????? }
  57. ??? }
  58. ??? if (hasKids == 0) {
  59. ??????? printf("此節點為葉子節點");
  60. ??? }
  61. }
  62. int main()
  63. {
  64. ??? CTree tree;
  65. ??? for (int i = 0; i < MAX_SIZE; i++) {
  66. ??????? tree.nodes[i].firstchild = NULL;
  67. ??? }
  68. ??? tree = initTree(tree);
  69. ??? //默認數根節點位于數組notes[0]處
  70. ??? tree.r = 0;
  71. ??? printf("找出節點 F 的所有孩子節點:");
  72. ??? findKids(tree, 'F');
  73. ??? return 0;
  74. }

程序運行結果為:

輸入節點數量:
10
輸入第 1 個節點的值:
R
輸入節點 R 的孩子節點數量:
3
輸入第 1 個孩子節點在順序表中的位置1
輸入第 2 個孩子節點在順序表中的位置2
輸入第 3 個孩子節點在順序表中的位置3
輸入第 2 個節點的值:
A
輸入節點 A 的孩子節點數量:
2
輸入第 1 個孩子節點在順序表中的位置4
輸入第 2 個孩子節點在順序表中的位置5
輸入第 3 個節點的值:
B
輸入節點 B 的孩子節點數量:
0
輸入第 4 個節點的值:
C
輸入節點 C 的孩子節點數量:
1
輸入第 1 個孩子節點在順序表中的位置6
輸入第 5 個節點的值:
D
輸入節點 D 的孩子節點數量:
0
輸入第 6 個節點的值:
E
輸入節點 E 的孩子節點數量:
0
輸入第 7 個節點的值:
F
輸入節點 F 的孩子節點數量:
3
輸入第 1 個孩子節點在順序表中的位置7
輸入第 2 個孩子節點在順序表中的位置8
輸入第 3 個孩子節點在順序表中的位置9
輸入第 8 個節點的值:
G
輸入節點 G 的孩子節點數量:
0
輸入第 9 個節點的值:
H
輸入節點 H 的孩子節點數量:
0
輸入第 10 個節點的值:
K
輸入節點 K 的孩子節點數量:
0
找出節點 F 的所有孩子節點:G H K

使用孩子表示法存儲的樹結構,正好和雙親表示法相反,適用于查找某結點的孩子結點,不適用于查找其父結點。

其實,我們還可以將雙親表示法和孩子表示法合二為一,那么圖 1a) 中普通樹的存儲效果如圖 2所示:


?


圖 2 雙親孩子表示法


使用圖 2 結構存儲普通樹,既能快速找到指定節點的父節點,又能快速找到指定節點的孩子節點。該結構的實現方法很簡單,只需整合這兩節的代碼即可,因此不再贅述。

樹的孩子兄弟表示法

一種常用方法——孩子兄弟表示法。


?

普通樹示意圖


圖 1 普通樹示意圖


樹結構中,位于同一層的節點之間互為兄弟節點。例如,圖 1 的普通樹中,節點 A、B 和 C 互為兄弟節點,而節點? D、E 和 F 也互為兄弟節點。

孩子兄弟表示法,采用的是鏈式存儲結構,其存儲樹的實現思想是:從樹的根節點開始,依次用鏈表存儲各個節點的孩子節點和兄弟節點。

因此,該鏈表中的節點應包含以下 3 部分內容(如圖 2 所示):

  1. 節點的值;
  2. 指向孩子節點的指針;
  3. 指向兄弟節點的指針;

節點結構示意圖


圖 2 節點結構示意圖


用 C 語言代碼表示節點結構為:

 
  1. #define ElemType char
  2. typedef struct CSNode{
  3. ElemType data;
  4. struct CSNode * firstchild,*nextsibling;
  5. }CSNode,*CSTree;


以圖 1 為例,使用孩子兄弟表示法進行存儲的結果如圖 3 所示:


?

孩子兄弟表示法示意圖


圖 3 孩子兄弟表示法示意圖


由圖 3 可以看到,節點 R 無兄弟節點,其孩子節點是 A;節點 A 的兄弟節點分別是 B 和 C,其孩子節點為 D,依次類推。

實現圖 3 中的 C 語言實現代碼也很簡單,根據圖中鏈表的結構即可輕松完成鏈表的創建和使用,因此不再給出具體代碼。

接下來觀察圖 1 和圖 3。圖 1 為原普通樹,圖 3 是由圖 1 經過孩子兄弟表示法轉化而來的一棵樹,確切地說,圖 3 是一棵二叉樹。因此可以得出這樣一個結論,即通過孩子兄弟表示法,任意一棵普通樹都可以相應轉化為一棵二叉樹,換句話說,任意一棵普通樹都有唯一的一棵二叉樹于其對應。

因此,孩子兄弟表示法可以作為將普通樹轉化為二叉樹的最有效方法,通常又被稱為"二叉樹表示法"或"二叉鏈表表示法"。

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

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

相關文章

【Java】2021 RoboCom 機器人開發者大賽-高職組(復賽)題解

7-8 人工智能打招呼 號稱具有人工智能的機器人&#xff0c;至少應該能分辨出新人和老朋友&#xff0c;所以打招呼的時候應該能有所區別。本題就請你為這個人工智能機器人實現這個功能&#xff1a;當它遇到陌生人的時候&#xff0c;會說&#xff1a;“Hello X, how are you?”其…

chatglm2-6b模型在9n-triton中部署并集成至langchain實踐 | 京東云技術團隊

一.前言 近期&#xff0c; ChatGLM-6B 的第二代版本ChatGLM2-6B已經正式發布&#xff0c;引入了如下新特性&#xff1a; ①. 基座模型升級&#xff0c;性能更強大&#xff0c;在中文C-Eval榜單中&#xff0c;以51.7分位列第6&#xff1b; ②. 支持8K-32k的上下文&#xff1b…

三種目標檢測方法(基于傳統數字圖像處理的識別方法、基于傳統機器學習的識別方法和基于深度學習的識別方法)的區別

問題描述&#xff1a;圖像檢測分為了基于傳統數字圖像處理的識別方法、基于傳統機器學習的識別方法和基于深度學習的識別方法&#xff0c;但是有時迷惑三者的區別是什么呢&#xff1f; 問題解答&#xff1a; 第一&#xff0c;基于傳統數字圖像處理的識別方法和其他兩者的區分…

【Linux】進程地址空間

目錄 一、回顧我們以前學習的地址空間二、進程地址空間三、進程地址空間的作用四、解決一個地址出現兩個值的問題 一、回顧我們以前學習的地址空間 這個內存布局真是的我們實實在在的內存嘛&#xff1f; 答案是不是的 下面我們來驗證 1 #include<stdio.h>2 #include<a…

從三個主要需求市場分析,VR全景創業的潛力發展

VR全景&#xff0c;5G時代朝陽產業&#xff0c;其實拍攝制作很簡單&#xff0c;就是利用一套專業的相機設備去給商家拍攝&#xff0c;結合后期專業的3DVR全景展示拍攝制作平臺&#xff0c;打造3D立體環繞的效果&#xff0c;將線下商家真實環境1&#xff1a;1還原到線上&#xf…

使用docker快速搭建wordpress服務,并指定域名訪問

文章目錄 引入使用docker快速跑起服務創建數據庫安裝wordpress服務配置域名 引入 wordpress是一個基于PHP語言編寫的開源的內容管理系統&#xff08;CMS&#xff09;&#xff0c;它有豐富的插件和主題&#xff0c;可以非常簡單的創建各種類型的網站&#xff0c;包括企業網站、…

Java異步方法CompletableFuture類的使用

Java中常用的異步方法 1、使用線程&#xff1a;你可以創建一個新的線程來執行異步操作。這可以通過直接創建Thread對象并啟動它&#xff0c;或者使用線程池來管理線程的生命周期。 new Thread(() -> {// 異步操作代碼 }).start(); 2、使用線程池Executor框架&#xff1a;E…

Spring Boot 支持多種環境,包括開發環境、測試環境、預發布環境和生產環境。

Spring Boot 支持多種環境&#xff0c;包括開發環境、測試環境、預發布環境和生產環境。不同的環境具有不同的配置&#xff0c;可以在不同的環境中對應用程序進行測試、驗證和部署。以下是每種環境的用途和相應的代碼案例。 開發環境 開發環境是開發人員在本地進行開發的環境&…

AI Chat 設計模式:15. 橋接模式

本文是該系列的第十五篇&#xff0c;采用問答式的方式展開&#xff0c;問題由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字則主要是我的一些思考和補充。 問題列表 Q.1 如果你是第一次接觸橋接模式&#xff0c;那么你會有哪些疑問呢&#xff1f;A.1Q.2 什…

內網隧道—HTTP\DNS\ICMP

本文僅限于安全研究和學習&#xff0c;用戶承擔因使用此工具而導致的所有法律和相關責任&#xff01; 作者不承擔任何法律和相關責任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一個旨在積極重構 reGeorg 的項目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…

山西電力市場日前價格預測【2023-08-17】

日前價格預測 預測明日&#xff08;2023-08-17&#xff09;山西電力市場全天平均日前電價為376.70元/MWh。其中&#xff0c;最高日前電價為431.75元/MWh&#xff0c;預計出現在19: 45。最低日前電價為339.25元/MWh&#xff0c;預計出現在13: 15。 價差方向預測 1&#xff1a; 實…

python實現抽獎小程序

使用Python的Tkinter庫來添加抽獎程序的界面操作。下面是一個示例代碼&#xff1a; import random import tkinter as tkdef lottery():prizes [一等獎, 二等獎, 三等獎, 謝謝參與]winner random.choice(prizes)result_label.config(text恭喜您獲得了{}&#xff01;.format(…

未出現過的最小正整數

給定一個長度為 n 的整數數組&#xff0c;請你找出未在數組中出現過的最小正整數。 樣例 輸入1&#xff1a;[-5, 3, 2, 3]輸出1&#xff1a;1輸入2&#xff1a;[1, 2, 3]輸出2&#xff1a;4數據范圍 1≤n≤105 , 數組中元素的取值范圍 [?109,109]。 代碼&#xff1a; c…

MySql主從復制1032錯誤(Slave_IO_Running: Yes Slave_SQL_Running: No)

MySql主從復制1032錯誤&#xff08;Slave_IO_Running: Yes Slave_SQL_Running: No&#xff09; Slave_IO_Running: Yes Slave_SQL_Running: No報錯&#xff1a; Last_SQL_Error: Could not execute Delete_rows event on table hr.test; Can’t find record in ‘test’, Erro…

【Unity造輪子】制作一個簡單的2d抓勾效果(類似蜘蛛俠的技能)

文章目錄 前言開始1. 實現簡單的抓勾效果2. 高階鉤爪效果 源碼參考完結 前言 歡迎閱讀本文&#xff0c;本文將向您介紹如何使用Unity游戲引擎來實現一個簡單而有趣的2D抓勾效果&#xff0c;類似于蜘蛛俠的獨特能力。抓勾效果是許多動作游戲和平臺游戲中的常見元素&#xff0c;…

【AI繪畫】3分鐘學會ikun幻術圖

目錄 前言一、效果展示二、準備工作三、操作步驟3.1平臺創建實例3.2 啟動SD 四、安裝QR Code Monster 模型五、成圖 前言 大家熱愛的ikun幻術在今天的分享中將呈現。在本文中&#xff0c;我們將揭示一個備受歡迎的圖像幻術技術&#xff0c;讓您感受到令人驚嘆的視覺創造力。 …

springboot+vue游戲攻略推薦網站的設計與開發_s5832

熱門網游推薦網站是一個利用JAVA技術建設的網上管理系統&#xff0c;在熱門網游推薦管理中實現信息化。系統的設計就是為了迎合廣大用戶需求而創建的一個界面簡潔、有定向內容、業務邏輯簡單易操作的熱門網游推薦網站。本文以熱門網游推薦為例&#xff0c;提出了利用JAVA技術設…

Angular中的ActivatedRoute和Router

Angular中的ActivatedRoute和Router解釋 在Angular中&#xff0c;ActivatedRoute和Router是兩個核心的路由服務。他們都提供可以用來檢查和操作當前頁面路由信息的方法和屬性。 ActivatedRoute ActivatedRoute是一個保存關于當前路由狀態&#xff08;如路由參數、查詢參數以…

Linux下grep通配容易混淆的地方

先上一張圖: 我希望找到某個版本為8的一個libXXX.8XXX.so ,那么應該怎么寫呢? 先看這種寫法對不對: 是不是結果出乎你的意料之外? 那么我們來看一下規則: 這里的 "*" 表示匹配前一個字符的零個或多個 于是我們就不難理解了: lib*8*.so 表示 包…

醫療PACS源碼,支持三維多平面重建、三維容積重建、三維表面重建、三維虛擬內窺鏡

C/S架構的PACS系統源碼&#xff0c;PACS主要進行病人信息和影像的獲取、處理、存儲、調閱、檢索、管理&#xff0c;并通過網絡向全院提供病人檢查影像及診斷報告&#xff1b;各影像科室之間共享不同設備的病人檢查影像及診斷報告;在診斷工作站上&#xff0c;調閱HIS中病人的其它…