數據結構(復習)--------關于平衡二叉樹(轉載)

在上一個專題中,我們在談論二叉查找樹的效率的時候。不同結構的二叉查找樹,查找效率有很大的不同(單支樹結構的查找效率退化成了順序查找)。如何解決這個問題呢?關鍵在于如何最大限度的減小樹的深度。正是基于這個想法,平衡二叉樹出現了。

?

平衡二叉樹的定義 (AVL—— 發明者為Adel'son-Vel'skii 和 Landis)

?

平衡二叉查找樹,又稱 AVL樹。 它除了具備二叉查找樹的基本特征之外,還具有一個非常重要的特點:的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值平衡因子 ) 不超過1。 也就是說AVL樹每個節點的平衡因子只可能是-1、0和1(左子樹高度減去右子樹高度)。

?

那么如何是二叉查找樹在添加數據的同時保持平衡呢?基本思想就是:當在二叉排序樹中插入一個節點時,首先檢查是否因插入而破壞了平衡,若 破壞,則找出其中的最小不平衡二叉樹,在保持二叉排序樹特性的情況下,調整最小不平衡子樹中節點之間的關系,以達 到新的平衡。所謂最小不平衡子樹 指離插入節點最近且以平衡因子的絕對值大于1的節點作為根的子樹。

?

平衡二叉樹的操作

?

1. 查找操作

?????? 平衡二叉樹的查找基本與二叉查找樹相同。

?

2. 插入操作

?????? 在平衡二叉樹中插入結點與二叉查找樹最大的不同在于要隨時保證插入后整棵二叉樹是平衡的。那么調整不平衡樹的基本方法就是: 旋轉 。 下面我們歸納一下平衡旋轉的4中情況

1) 繞某元素左旋轉 ?

???????????????????????????????? 80 ? ? ? ? ?? ??????????????????????? 90 ?

? ? ? ? ???????????????????????? /? \???????????? 左旋 ????????????? / ?? \

?????????????????????????????? 60?90?????? ?? ---- ->? ? ? ?? 80???? 120

??????????????????????????????????? /? \??????????????????? ? ?? ?? ?? /? \?????? /

????????????????????????????????? 85?120??????????????????? 60? 85 100

??????????????????????????????????????? /

????????????????????????????????????? 100?????

?????????????????????????????? a)? BST樹????????????????????????????? b ) AVL樹

???? 分析一下:在插入數據100之前,a圖的B ST樹只有80節點的平衡因子是-1(左高-右高),但整棵樹還是平衡的。加入100之后,80節點的平衡因子就成為了-2,此時平衡被破壞。需要左旋轉成b 圖。

???? 當樹中節點X的右孩子的右孩子上插入新元素,且平衡因子從-1變成-2后,就需要繞節點X進行左旋轉。

?

2) 繞某元素右旋轉 ?

??????????????????????????????? 100?????????????????????????????????? 85

???????????????????????????????? /? \?????????????? 右旋 ???????????? /??? \

????????????????????????????? 85? 120???????? ------ -> ? ? 60??? 100 ?

????????????????????????????? /? \?????????????????????????????????? ?? \ ? ?? / ? \

??????????????????????????? 60?90????????????????????????????? ?? 80? 90?120

????????????????????????????? \

????????????????????????????? 80

????????????????????????? ?? a) B ST樹??????????????????????????????? b) AVL樹

???? 當樹中節點X的左孩子的左孩子上插入新元素,且平衡因子從1變成2后,就需要繞節點X進行右旋轉。

?

3) 繞某元素的左子節點左旋轉,接著再繞該元素自己右旋轉。 此情況下就是左旋與右旋?的結合,具體操作時可以分 解成這兩種操作,只是圍繞點不一樣而已。

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

??????????????????????????? 100???????????????????????????? 100 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 90

???????????????????????????? /? \???????????? 左旋 ?????? ? ? /? \????????????? 右旋 ????? ? ? / ?? \

????????????????????????? 80? 120?????? ------> ? ?? 90? 120??????? ------> ? ? 80?? 100 ?

????????????????????????? / \?????????????????????????????? ?? /?????????????????????? ? ?????? ? ? /? \????? \

?????????????????????? 60?90 ? ? ? ? ? ? ? ? ? ???????? 80??????????????? ? ? ? ????? ? 60? 85? 120

??????????????????????????? /?????????????????????????????? / \

????????????????????????? 85??????????????????????????? 60?85

????? 當樹中節點X的左孩子的右孩子上插入新元素,且 平衡因子從1變成2后,就需要 先繞X的左子節點Y左旋轉,接著再繞X右旋轉


4) 繞某元素的右子節點右旋轉,接著再繞該元素自己左旋轉。 此情況下就是?右旋與左旋?的結合,具體操作時可以分解 成這兩種操作,只是圍繞點不一樣而已 。

?

?????????????????????????????? 80?????????????????????????????? 80 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? 85 ?

?????????????????????????????? / ? \???????????? 旋 ? ? ?? ? /? \?????????? ????? ??????????? /? \ ????

??????????????????????????? 60? 100 ? ?? ------> ???? 60?85 ? ? ? ? ?? -------> ? ?????? 80?100

?????????????????????????????????? /? \??????????????? ? ? ? ? ? ? ? ?? \?????????????????????????? ? ? ? ? /???? /?? \ ??????

? ? ? ? ??????????????????????? 85? 120??????????????????????? 100?????????????????????? ? ? 60??? 90?120

???????????????????????????????? ? \?????????????????????????????? ? ? /? \

?????????????????????????????????? 90???????????????????????? ? 90? 120

?????? 當樹中節點X的右孩子的左孩子上插入新元素,且 平衡因子從-1變成-2后,就需要 先繞X的右子節點Y右旋轉,接著再繞X左旋轉

?

?

平衡二叉樹性能分析


平衡二叉樹的性能優勢:

????? 很顯然,平衡二叉樹的優勢在于不會出現普通二叉查找樹的最差情況。其查找的時間復雜度為O(logN)。

?

平衡二叉樹的缺陷:

????? (1) 很遺憾的是,為了保證高度平衡,動態插入和刪除的代價也隨之增加。因此,我們在下一專題中講講《紅黑樹》 這種更加高效的查找結構。

?

??? ? (2) 所有二叉查找樹結構的查找代價都與樹高是緊密相關的,能否通過減少樹高來進一步降低查找代價呢。我們可以通過多路查找樹的結構來做到這一點,在后面專題中我們將通過《多路查找樹/B-樹/B+樹 》來介紹。

?

????? (3) 在大數據量查找環境下(比如說系統磁盤里的文件目錄,數據庫中的記錄查詢 等),所有的二叉查找樹結構(BST、AVL、RBT)都不合適。如此大規模的數據量(幾G數據),全部組織成平衡二叉樹放在內存中是不可能做到的。那么 把這棵樹放在磁盤中吧。問題就來了:假如構造的平衡二叉樹深度有1W層。那么從根節點出發到葉子節點很可能就需要1W次的硬盤IO讀寫。大家都知道,硬盤的機械部件讀寫數據的速度遠遠趕不上純電子媒體的內存。 查找效率在IO讀寫過程中將會付出巨大的代價。在大規模數據查詢這樣一個實際應用背景下,平衡二叉樹的效率就很成問題了。對這一問題的解決:我們也會在《多路查找樹/B-樹/B+樹 》 將詳細分析。

?

????? 上面提到的紅黑樹和多路查找樹都是屬于深度有界查找樹(depth-bounded tree —DBT)

?

來自于:http://hxraid.iteye.com/blog/609949

----------------------------------------------------------------------------------------------------------------------------------------------------------

  1. typedef?int?ElementType;??
  2. ??
  3. #ifndef?AVLTREE_H??
  4. #define?AVLTREE_H??
  5. ??
  6. struct?TreeNode??
  7. {??
  8. ????ElementType?Element;??
  9. ????int?Height;??
  10. ????struct?TreeNode?*Left;??
  11. ????struct?TreeNode?*Right;??
  12. };??
  13. ??
  14. typedef?struct?TreeNode?*AvlTree;??
  15. typedef?struct?TreeNode?*Position;??
  16. ??
  17. AvlTree?MakeEmpty(AvlTree?T);??
  18. AvlTree?Insert(ElementType?X,?AvlTree?T);??
  19. Position?Find(ElementType?X?,AvlTree?T);??
  20. Position?FindMax(AvlTree?T);??
  21. Position?FindMin(AvlTree?T);??
  22. ??
  23. #endif??

avltree.c函數實現

[cpp] view plaincopyprint?
  1. #include?"fatal.h"??
  2. #include?"avltree.h"??
  3. ??
  4. AvlTree?MakeEmpty(AvlTree?T)??
  5. {??
  6. ????if(T?!=?NULL)??
  7. ????{??
  8. ????????MakeEmpty(T->Left);??
  9. ????????MakeEmpty(T->Right);??
  10. ????????free(T);??
  11. ????}??
  12. ????return?NULL;??
  13. }??
  14. ??
  15. static?int?Height(Position?P)??
  16. {??
  17. ????if(P?==?NULL)??
  18. ????????return?-1;??
  19. ????else??
  20. ????????return?P->Height;??
  21. }??
  22. ??
  23. static?int?Max(int?Lhs,?int?Rhs)??
  24. {??
  25. ????return?Lhs?>?Rhs???Lhs?:?Rhs;??
  26. }??
  27. ??
  28. static?Position?SingleRotateWithLeft(Position?K2)??
  29. {??
  30. ????Position?K1;??
  31. ??
  32. ????K1?=?K2->Left;??
  33. ????K2->Left?=?K1->Right;??
  34. ????K1->Right?=?K2;??
  35. ??
  36. ????K1->Height?=?Max(Height(K1->Left),?Height(K1->Right))?+?1;??
  37. ????K2->Height?=?Max(Height(K2->Left),?Height(K2->Right))?+?1;??
  38. ??
  39. ????return?K1;??
  40. }??
  41. ??
  42. static?Position?SingleRotateWithRight(Position?K2)??
  43. {??
  44. ????Position?K1;??
  45. ??
  46. ????K1?=?K2->Right;??
  47. ????K2->Right?=?K1->Left;??
  48. ????K1->Left?=?K2;??
  49. ??
  50. ????K1->Height?=?Max(Height(K1->Left),?Height(K1->Right))?+?1;??
  51. ????K2->Height?=?Max(Height(K2->Left),?Height(K2->Right))?+?1;??
  52. ??
  53. ????return?K1;??
  54. }??
  55. ??
  56. static?Position?DoubleRotateWithLeft(Position?K3)??
  57. {??
  58. ????K3->Left?=?SingleRotateWithRight(K3->Left);??
  59. ????return?SingleRotateWithLeft(K3);??
  60. }??
  61. ??
  62. static?Position?DoubleRotateWithRight(Position?K3)??
  63. {??
  64. ????K3->Right?=?SingleRotateWithLeft(K3->Right);??
  65. ????return?SingleRotateWithRight(K3);??
  66. }??
  67. ??
  68. AvlTree?Insert(ElementType?X,?AvlTree?T)??
  69. {??
  70. ????if(T?==?NULL)??
  71. ????{??
  72. ????????T?=?(Position)malloc(sizeof(struct?TreeNode));??
  73. ????????if(T?==?NULL)??
  74. ????????????FatalError("Out?of?space");??
  75. ????????T->Element?=?X;??
  76. ????????T->Height?=?0;??
  77. ????????T->Left?=?T->Right?=?NULL;??
  78. ????}??
  79. ????else?if(X?<?T->Element)//左子樹插入新節點??
  80. ????{??
  81. ????????T->Left?=?Insert(X,?T->Left);??
  82. ????????if(Height(T->Left)?-?Height(T->Right)?==?2)//左子樹插入節點所以高度是左子樹高于右子樹??
  83. ????????{??
  84. ????????????if(X?<?T->Left->Element)//對α的左兒子的左子樹進行一次插入,需要左旋??
  85. ????????????????T?=?SingleRotateWithLeft(T);??
  86. ????????????else?//對α的左兒子的右子樹進行一次插入,需要雙旋??
  87. ????????????????T?=?DoubleRotateWithLeft(T);??
  88. ????????}??
  89. ????}??
  90. ????else?if(X?>?T->Element)//右子樹插入新節點??
  91. ????{??
  92. ????????T->Right?=?Insert(X,?T->Right);??
  93. ????????if(Height(T->Right)?-?Height(T->Left)?==?2)//因為是右子樹插入新節點,所以高度是右子樹高于左子樹??
  94. ????????{??
  95. ????????????if(X?>?T->Right->Element)//對α的右兒子的右子樹進行一次插入,需要右旋??
  96. ????????????????T?=?SingleRotateWithRight(T);??
  97. ????????????else//對α的右兒子的左子樹進行一次插入,需要雙旋??
  98. ????????????????T?=?DoubleRotateWithRight(T);??
  99. ????????}??
  100. ????}??
  101. ????T->Height?=?Max(Height(T->Left),?Height(T->Right))?+?1;??
  102. ????return?T;??
  103. }??
  104. ??
  105. Position?Find(ElementType?X,?AvlTree?T)??
  106. {??
  107. ????if(T?==?NULL)??
  108. ????????return?NULL;??
  109. ????if(X?<?T->Element)??
  110. ????????return?Find(X,?T->Left);??
  111. ????else?if(X?>?T->Element)??
  112. ????????return?Find(X,?T->Right);??
  113. ????else??
  114. ????????return?T;??
  115. }??
  116. ??
  117. Position?FindMin(AvlTree?T)??
  118. {??
  119. ????if(T?==?NULL)??
  120. ????????return?NULL;??
  121. ????else?if(T->Left?==?NULL)??
  122. ????????return?T;??
  123. ????else??
  124. ????????return?FindMin(T->Left);???
  125. }??
  126. ??
  127. Position?FindMax(AvlTree?T)??
  128. {??
  129. ????if(T?==?NULL)??
  130. ????????return?NULL;??
  131. ????else?if(T->Right?==?NULL)??
  132. ????????return?T;??
  133. ????else??
  134. ????????return?FindMax(T->Right);??
  135. }??

testavl.c測試AVL樹的實現

[cpp] view plaincopyprint?
  1. #include?"avltree.h"??
  2. #include?<stdio.h>??
  3. #include?<stdlib.h>??
  4. ??
  5. void?InOrder(AvlTree?T)??
  6. {??
  7. ????if(T?!=?NULL)??
  8. ????{??
  9. ????????InOrder(T->Left);??
  10. ????????printf("%d?",?T->Element);??
  11. ????????InOrder(T->Right);??
  12. ????}??
  13. }??
  14. ??
  15. void?PreOrder(AvlTree?T)??
  16. {??
  17. ????if(T?!=?NULL)??
  18. ????{??
  19. ????????printf("%d?",?T->Element);??
  20. ????????PreOrder(T->Left);??
  21. ????????PreOrder(T->Right);??
  22. ????}??
  23. }??
  24. ??
  25. int?main(void)??
  26. {??
  27. ????AvlTree?T;??
  28. ????Position?P;??
  29. ????int?i;??
  30. ??
  31. ????T?=?MakeEmpty(NULL);??
  32. ????for(i?=?1;?i?<=?7;?i++)??
  33. ????????T?=?Insert(i,?T);??
  34. ????for(i?=?16;?i?>=?10;?i--)??
  35. ????????T?=?Insert(i,?T);??
  36. ????T?=?Insert(8,?T);??
  37. ????T?=?Insert(9,?T);??
  38. ????printf("Root:?%d\n",?T->Element);??
  39. ????printf("InOrder:??");??
  40. ????InOrder(T);??
  41. ????printf("\nPreOrder:?");??
  42. ????PreOrder(T);??
  43. ????putchar('\n');??
  44. ????system("Pause");??
  45. ??
  46. ????return?0;??
  47. }??

測試:首先插入1到7,然后插入16到10,最后插入8和9。AVL樹的應該為下圖所示


測試結果如下圖所示

---------------------------------------------------------------------------------------------------------------------------------------------------------

來于:http://blog.csdn.net/zitong_ccnu/article/details/11097663

--------------------------------------------------------------------

//關于平衡二叉樹的實現 BBST(Blance binary search tree)
#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct tree
{
??? int data;
??? int height;
??? struct tree *lchild;
??? struct tree *rchild;
} tree, *Bitree;

int
Height(Bitree T)
{
??? if(T == NULL)??? return -1;
??? else? return T->height;
}

int
Max(int h1, int h2)
{
??? return h1 > h2 ? h1 : h2;
}

Bitree
Left(Bitree T)
{
??? Bitree T1;
??? T1 = T->rchild;
??? T->rchild = T1->lchild;
??? T1->lchild = T;

??? T->height? = Max(Height(T->lchild), Height(T->rchild)) + 1;
??? printf("T == %d\n", T->height);

??? T1->height = Max(Height(T1->lchild), Height(T1->rchild)) + 1;
??? printf("T1 == %d\n", T1->height);
??? return T1;
}

Bitree
Right(Bitree T)
{
??? Bitree T1;
??? T1 = T->lchild;
??? T->lchild = T1->rchild;
??? T1->rchild = T;
?
??? T->height? = Max(Height(T->lchild), Height(T->rchild)) + 1;
??? printf("T == %d\n", T->height);
??? T1->height = Max(Height(T1->lchild), Height(T1->rchild)) + 1;
??? printf("T1 == %d\n", T1->height);
??? return T1;
}

Bitree
Left_Right(Bitree T)
//左孩子的右孩子插入元素
{
??? T = Left(T);
??? return Right(T);
}

Bitree
Right_Left(Bitree T)
//右孩子的左孩子插入元素
{
??? T = Right(T);
??? return Left(T);
}


Bitree
Insert(Bitree T, int x)
{
??? if(T == NULL) {
??? T = (Bitree) malloc (sizeof(tree));
??? T->data = x;???????? T->height = 0;
??? T->lchild = T->rchild = NULL;
??? }

??? else if(x < T->data) {
??? T->lchild = Insert(T->lchild, x);
??? if(Height(T->lchild) - Height(T->rchild) == 2) {
??? if(x < T->lchild->data)
??????? T = Right(T);????????????????????? //在左邊左兒子插入元素ll此時右旋
??? if(x > T->lchild->data)
??????? T = Left_Right(T);??????????????? //在左邊右兒子的插入元素lr此時左右旋
??? }
? }

??? else if(x > T->data) {
??? T->rchild = Insert(T->rchild, x);
??? if(Height(T->rchild) - Height(T->lchild) == 2) {
??????? printf("\n%d %d\n", Height(T->rchild), Height(T->lchild));
??????? printf("ok\n");
??? if(x > T->rchild->data)
??????? T = Left(T);?????????????????????? //在右邊右兒子插入元素rr此時左旋
??? if(x < T->lchild->data)
??????? T = Right_Left(T);??????????????? //在右邊左兒子插入元素rl此時右左旋
???? }
? }

??? T->height = Max(Height(T->lchild), Height(T->rchild)) + 1;
??? return T;
}

void
preoder(Bitree T)
{
??? if(T) {
??????? printf("data == %d\n", T->data);
??????? preoder(T->lchild);
??????? printf("\n");
??????? preoder(T->rchild);
??? }
}


int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
?????? freopen("input.txt", "r", stdin);
?????? //freopen("output.txt", "w", stdout);
#endif
?? ?
??? int a[100];
??? int n;
??? Bitree T = NULL;
??? scanf("%d", &n);
??? for (int i = 0; i < n; i++) {
??????? scanf("%d", &a[i]);??? printf("%d ", a[i]);
??????? T = Insert(T, a[i]);
??? }
??? preoder(T);
??? // printf("%d\n", Height(T));
??? // printf("%d\n", T->data);



?? ?
??? return 0;
}

?

轉載于:https://www.cnblogs.com/airfand/p/5082410.html

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

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

相關文章

mysql外鍵

效果 a,b,c 如果c設置到a的外鍵&#xff0c;那么只能在刪除c的記錄后&#xff0c;才能刪除a的記錄。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…

C++總結筆記(一)—— 基礎知識匯總

很長時間沒有再復習C的基礎知識&#xff0c;現在將一些容易遺忘的知識點做一個簡單的匯總。 1、注釋 ??分為單行注釋和多行注釋 //cout<<endl;/*int i1;cout<<i<<endl;*/2、常量 ??宏常量&#xff1a;#define &#xff0c;宏常量沒有類型&#xff0c;…

微軟自帶iscsi客戶端對iqn的要求

節點名稱&#xff1a;Microsoft iSCSI 發起程序嚴格遵守為 iSCSI 節點名稱指定的規則。這些規則也適用于 Microsoft iSCSI 發起程序節點名稱以及發現的任何目標節點名稱。構建 iSCSI 節點名稱的規則&#xff08;如 iSCSI 規范以及“iSCSI 名稱的字符串配置文件”Internet 草稿中…

【Python數據結構】——鏈表

僅僅為了記錄 # 定義一個類&#xff0c;用于創建鏈表的結點 class LNode():def __init__(self,elem,next_ None):# 類的初始化方法,在實例化類的時候會自動調用self.elem elemself.next next_list1 LNode(1)# 類的實例化&#xff0c;LNode(1)為第一個鏈表結點&#xff0c;…

天貓雙11憑什么達到1682億?這些支撐技術或許可以告訴你

歷年「雙 11」都會掀起一股買買買的購物熱潮 阿里巴巴將這個原本普通的日子賦予了非凡的意義 今年&#xff0c;天貓以 1682 億的成交額再破記錄 而在這一系列瘋狂“秒殺”動作的背后 有一個叫云化架構的技術體系支撐著十幾億人的消費狂歡 12 月 8 日 ArchSummit 阿里技術專場 來…

PageLayoutControl的基本操作

整理了下對PageLayoutControl的基本功能操作 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071…

C++總結筆記(二)——指針

一、概念 1.1 指針的原理 找到一個比較精練的概述指針原理的句子&#xff1a; 指針變量就是在內存中保存變量的地址&#xff0c;然后通過地址來訪問數據。 int a 1; int* p &a; cout << p << endl;009DFEB4可以知道變量p在內存中的值就是a的地址&#xff…

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag轉載于:https://www.cnblogs.com/zhujiabin/p/5085688.html

【圖像處理】——圖像內插法

參考:https://blog.csdn.net/lovexlsforever/article/details/79508602 cv2.resize函數 當我們縮小影像時,使用CV_INTER_AREA會有比較好的效果,當我們放大影像,CV_INTER_CUBIC會有最好的效果 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, dou…

while read line 用法詳細介紹

循環中的重定向 或許你應該在其他腳本中見過下面的這種寫法&#xff1a; while read line do … done < file 剛開始看到這種結構時&#xff0c;很難理解< file是如何與循環配合在一起工作的。因為循環內有很多條命令&#xff0c;而我們之前接觸的重定向都是為一條命令工…

C++總結筆記(三)—— 結構體

一、概念 結構體是一種可以自定義數據類型的類型格式&#xff0c;一般用struct關鍵字進行定義。 //創建食物的結構體 struct Food {//屬性名string name; //名字int Price; //價格 };結構體有三種定義變量的方法。 1.1 定義結構體后再聲明變量&#xff0c;然后在對變量的…

[輕微]WEB服務器啟用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等協議訪問應用程序/tomcat下禁用不安全的http方法...

使用了360網站安全檢測 查到有OPTIONS方法 百度了下 https://my.oschina.net/maliang0130/blog/338725 找到這個方法奈何http.conf 找不到無論在tomcat目錄里還是linux路徑下的/usr/etc或者apache2 最后通過開源中國找到 第一步&#xff1a;修改應用程序的web.xml文件的協議 &l…

MVC 事物同時保存,更新數據庫

本人小白一枚&#xff0c;第一次寫博&#xff0c;主要用作筆記&#xff0c;怕以后忘記了&#xff0c;大神尙可路過&#xff0c;也可多多指教 事物用在同時保存更新數據時&#xff0c;及只要在事物塊的范圍內&#xff0c;有一個操作出錯則事物塊所有更新&#xff0c;保存等操作都…

【圖像處理】——正裝照換底色Python

import cv2 import numpy as np # 讀取照片 img=cv2.imread("personalPic.jpg")# 圖像縮放 img = cv2.resize(img,None,fx=0.3,fy=0.3) rows,cols,channels = img.shape print(rows,cols,channels)# img_medianBlur=cv2.medianBlur(img,3) # 中值濾波,必須是大于1的奇…

Halcon例程詳解(植物測量) —— measure_plant.hdev

文章目錄 前言一、過程1.1 篩選ROI區域1.2 分割1.3 三維建模與仿射變換1.4 確定葉子的角度分布和高度1.5 確定葉子的面積和樹干的直徑1.6 對葉子的角度進行分析二、例程詳解2.1 篩選ROI區域2.2 分割2.3 三維建模與仿射變換2.4 確定葉子的角度和高度2.5 確定葉子的面積和樹干的直…

keil5中文亂碼的解決

keil5 復制出來的中文顯示亂碼&#xff0c;該如何解決&#xff1f; 點擊Edit - Configuration &#xff0c;進入編輯器設置&#xff1a; 點擊ok &#xff0c;就可以了轉載于:https://www.cnblogs.com/alan666/p/8312100.html

spark RDD iterator中sparkEnv功能 -- (視頻筆記)

sparkEnv是spark環境變量 1、可以從其中get 緩存 2、為master workder driver 管理和保存運行時對象。 3、excutorid &#xff0c;excutor 一種為driver類型&#xff0c;一種具體處理task 內部有線程池的excutor 4、actorSystem &#xff0c;如果運行在driver 則為spark driver…

【圖像處理】——Python實現幾何變換(自定義+opencv庫)

理論知識:參考https://blog.csdn.net/on2way/article/details/40460675 Python調用opencv函數參考:https://blog.csdn.net/on2way/article/details/46801063 一、引自《數字圖像處理》的基礎知識匯總 這個很重要!!!這里需要注意的是反向映射和前向映射的區別,反…

Go語言學習資料整理

整理網上找到的Golang語言學習資料基礎基礎教程 書籍在線版Go 指南-A Tour of GoGo語言圣經&#xff08;中文版&#xff09;Effective Go中文版Go Web編程 build-web-application-with-golangGo入門指南 The Way to Go《The Way to Go》中文譯本&#xff0c;中文正式名《Go入門…