日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

d叉堆实现优先队列

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 d叉堆实现优先队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

d叉堆實現優先隊列

時間復雜度 dlog(d,n)

#include <stdexcept> #include <iostream> class DForkHeapPriorityQueue { private:int capacity;int *array;int d;int heap_size; public:DForkHeapPriorityQueue(int capacity,int d);DForkHeapPriorityQueue(int* array,int length,int d);virtual ~DForkHeapPriorityQueue();void insert(int key);int extract_max();int get_heap_size();private:void increase_key(int key,int index);void build_heap();void max_heapify(int parent_index);int parent(int index);int child(int parent_index,int child_index); };DForkHeapPriorityQueue::DForkHeapPriorityQueue(int capacity,int d):capacity(capacity),d(d){array = new int [capacity];heap_size = 0; } DForkHeapPriorityQueue::DForkHeapPriorityQueue(int* array,int length,int d):d(d) {this->array = new int [length];for (int i = 0; i < length; ++i) {this->array[i] = array[i];}heap_size = length;capacity = heap_size;build_heap(); } DForkHeapPriorityQueue::~DForkHeapPriorityQueue() {if(array!= nullptr)delete [] array; } void DForkHeapPriorityQueue::insert(int key){if(heap_size >= capacity){int* temp_array = new int[capacity*2];for (int i = 0; i < capacity; ++i) {temp_array[i] = array[i];}delete [] array;array = temp_array;}heap_size++;array[heap_size-1] = INT_MIN;increase_key(heap_size-1,key); } int DForkHeapPriorityQueue::extract_max(){if(heap_size<=0){perror("array is empty");return -1;}int max = array[0];array[0] = array[heap_size-1];heap_size--;max_heapify(0);return max; }void DForkHeapPriorityQueue::increase_key(int key,int index){if(array[index] > key){perror("new key is underflow");return;}array[index] = key;while (index > 0 && array[parent(index)] < key){array[index] = array[parent(index)];array[parent(index)] = key;index = parent(index);} } void DForkHeapPriorityQueue::build_heap(){for (int i = heap_size/2; i >=0; i--) {max_heapify(i);} } void DForkHeapPriorityQueue::max_heapify(int parent_index){int largest = parent_index;int current_child_index = 0;while (current_child_index<d){int index = child(parent_index,current_child_index);if(index >= heap_size) break;if(array[index] > array[largest])largest = index;current_child_index++;}if(largest != parent_index){int temp = array[largest];array[largest] = array[parent_index];array[parent_index] = temp;max_heapify(largest);} } int DForkHeapPriorityQueue::parent(int index){return (index - 1) / d; } int DForkHeapPriorityQueue::child(int parent_index,int child_index){return parent_index * d + child_index + 1; } int DForkHeapPriorityQueue::get_heap_size(){return heap_size; }

總結

以上是生活随笔為你收集整理的d叉堆实现优先队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。