您好,登錄后才能下訂單哦!
這篇文章主要講解了“PostgreSQL數據庫實現原理是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PostgreSQL數據庫實現原理是什么”吧!
PostgreSQL的FSM文件,其數據結構基礎是最大堆二叉樹,構建/刪除/插入的相關代碼詳見代碼注釋.
#include "heap.h" static int heap[MAX_ELEMENTS]; static int counter = 0; //交換數據 static void swap(int *i,int *j) { int tmp = *j; *j = *i; *i = tmp; } //打印堆信息 //n : 元素個數 void print_max_heap() { for(int i = 1;i <= counter;i++) { printf("item[%d] is %d\n",i,heap[i]); } } //初始化堆數組 void init_heap(int *array,int n) { for(int i=0;i < n;i++) { heap[i] = array[i]; } counter = n; } //插入到最大堆 //item : 插入的值 //*n : 堆元素個數 void insert_max_heap(int item) { if(HEAP_FULL(counter)){ return; } //整個算法思想是首先把插入的值放在堆中的最后一個位置,然后為其找到合適的位置(遞歸向上) int i = ++counter; //i ≠ 1是因為數組的第一個元素并沒有保存堆結點 for(;(i != 1) && (item > heap[i/2]);i = i / 2){ //如果插入的值比其父節點要大,把父節點的值交互到當前節點 heap[i] = heap[i/2];//這里其實和遞歸操作類似,就是去找父結點 } //父節點的值比當前值要大或者已到達根節點,設置當前位置的值為要插入的值 heap[i] = item; } //刪除最大堆中的元素 //*n : 堆元素個數 void delete_max_heap() { //刪除最大堆,總是刪除最大堆的根節點 if(HEAP_EMPTY(counter)) { return; } //算法思想 : 把最后一個元素作為根節點,然后尋找該節點在樹中合適的位置 int lastone = heap[--counter]; //父節點,初始化為1 int parent = 1; for (int son=parent*2;son <= counter;son=son*2) { //刪除父節點后,比較左右子節點的大小 if(son < counter && heap[son] < heap[son+1]) { //如果右子節點大于左子節點,切換到右子節點 son++; } if (lastone > heap[son]) { break;//已經比兒子要大,退出 } //把子節點移到父節點 //parent的位置就是lastone移動到的位置 heap[parent]=heap[son]; //遞歸,到下一層子樹 parent = son; } //parent的位置就是最后一個元素所在的位置 heap[parent]=lastone;//lastone的實際位置已找到,賦值 } //構建最大堆 //n : 元素個數 //heap是初始化但未構建的數組 void build_max_heap() { for(int i = counter;i > 1;i--) { //從最后一個元素(最下層)開始遍歷數組 if(heap[i] > heap[i/2]) { //子節點比父節點要大,交換父子節點 swap(&(heap[i/2]),&(heap[i])); for(int j=i*2;j < counter;j=j*2) { //遞歸處理子節點 if (j > counter) { break; } if(j < counter && heap[j+1] > heap[j]) { //切換至右子節點 j++; } if (heap[j] > heap[j/2]) { //如果子節點大于父節點,交換 swap(&(heap[j/2]),&(heap[j])); } }//end for#2 }//end if }//end for#1 } void build_max_heap_new() { for(int i = counter/2;i > 1;i--) { //從子節點上一層開始處理 //父節點為i int parent=i; //該節點的值 int temp=heap[parent]; for(int child=parent*2;child <=counter;child=child*2) { // if(child < counter && heap[child] < heap[child+1]) { //切換到右子節點 child++; } if(temp > heap[child]) //父節點比子節點大,退出該父節點構成的樹循環 break; else { //把子節點的值放到父節點中 heap[parent] = heap[child]; } //進入到子節點,遞歸處理 parent = child; } //已找到該父節點合適的位置,賦值 heap[parent]=temp; }//end for#1 }
感謝各位的閱讀,以上就是“PostgreSQL數據庫實現原理是什么”的內容了,經過本文的學習后,相信大家對PostgreSQL數據庫實現原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。