apriori算法c++实现_经典数据结构与算法(三):Python/C/C ++实现队列类型优先级队列...

前期文章点击这里:

 经典数据结构与算法(一):Python/C/C ++实现堆栈和队列   

     优先级队列是一种特殊的队列,其中每个元素都与一个优先级相关联,并根据其优先级进行服务。如果出现具有相同优先级的元素,则会根据其在队列中的顺序为其提供服务。

通常,元素本身的值被认为用于分配优先级。

例如,具有最高值的元素被视为最高优先级元素。但是,在其他情况下,我们可以将具有最低值的元素视为最高优先级元素。并且,我们可以根据需要的要求设置优先级。

8e03cd4f9bb9ffd94f316fec2126a0cb.png
删除最高优先级元素

优先队列和普通队列之间的区别:

在队列中,采用先进先出规则,而在优先级队列中,则根据priority删除值。优先级最高的元素将首先被删除。


优先队列的实现:

可以使用数组,链表,堆数据结构或二进制搜索树来实现优先级队列。在这些数据结构中,堆数据结构提供了优先级队列的有效实现。

因此,我们将使用堆数据结构来实现优先级队列。

下面给出优先级队列的不同实现的比较分析。

运作方式窥视删除
链表O(1)O(n)O(1)
二进制堆O(1)O(log n)O(log n)
二进制搜索树O(1)O(log n)O(log n)

优先队列操作:优先级队列的基本操作是插入,删除和查看元素。

在研究优先级队列之前,请参考堆数据结构以更好地理解二进制堆,因为本文将其用于实现优先级队列。


1.将元素插入优先级队列

通过以下步骤将元素插入优先级队列(最大堆)。

d7ec92ac8f9ad4751ce3d1897871ec71.png

插入后:

6a45b3dd74d5823b942efb5a4ba9f1aa.png

将元素插入优先级队列的算法(最大堆)

伪代码:

If there is no node,   create a newNode.else (a node is already present)  insert the newNode at the end (last node from left to right.)  heapify the array

对于Min Heap,对上述算法进行了修改,使其parentNode始终小于newNode


2.从优先级队列中删除元素

从优先级队列(最大堆)中删除元素的操作如下:

68f9073dd44dc9f2df2e00c51695c614.png

将其与最后一个元素交换

f7c1dfe868098c82e0c979aa4a48415f.png

于是删除最后一个元素

a59905c3be1e899c3effe028f6f65996.png

再次整理:

2b6f5e77dd7a1458a1d30b05d4ac1795.png

删除优先级队列中元素的算法(最大堆)

伪代码:

If nodeToBeDeleted is the leafNode  remove the nodeElse swap nodeToBeDeleted with the lastLeafNode  remove noteToBeDeleted   heapify the array
   

对于Min Heap,修改了上述算法,使两者均childNodes小于currentNode


3.从优先级队列中窥视(查找最大值/最小值)

窥视操作从最大堆中返回最大元素,或者从最小堆中返回最小元素,而不删除节点。对于最大堆和最小堆

return rootNode

4.从优先级队列中提取最大/最小

从最大堆中删除节点后,Extract-Max返回具有最大值的节点,而从最小堆中删除节点后,Extract-Min返回具有最小值的节点。


Python,C和C ++中的优先级队列实现





def heapify(arr, n, i):        largest = i    l = 2 * i + 1    r = 2 * i + 2    if l < n and arr[i] < arr[l]:        largest = l    if r < n and arr[largest] < arr[r]:        largest = r        if largest != i:        arr[i], arr[largest] = arr[largest], arr[i]        heapify(arr, n, largest)def insert(array, newNum):    size = len(array)    if size == 0:        array.append(newNum)    else:        array.append(newNum)        for i in range((size // 2) - 1, -1, -1):            heapify(array, size, i)def deleteNode(array, num):    size = len(array)    i = 0    for i in range(0, size):        if num == array[i]:            break    array[i], array[size - 1] = array[size - 1], array[i]    array.remove(size - 1)    for i in range((len(array) // 2) - 1, -1, -1):        heapify(array, len(array), i)arr = []insert(arr, 3)insert(arr, 4)insert(arr, 9)insert(arr, 5)insert(arr, 2)print ("Max-Heap array: " + str(arr))deleteNode(arr, 4)print("After deleting an element: " + str(arr))

#include int size = 0;void swap(int *a, int *b) {  int temp = *b;  *b = *a;  *a = temp;}void heapify(int array[], int size, int i) {  if (size == 1) {    printf("Single element in the heap");  } else {        int largest = i;    int l = 2 * i + 1;    int r = 2 * i + 2;    if (l < size && array[l] > array[largest])      largest = l;    if (r < size && array[r] > array[largest])      largest = r;        if (largest != i) {      swap(&array[i], &array[largest]);      heapify(array, size, largest);    }  }}void insert(int array[], int newNum) {  if (size == 0) {    array[0] = newNum;    size += 1;  } else {    array[size] = newNum;    size += 1;    for (int i = size / 2 - 1; i >= 0; i--) {      heapify(array, size, i);    }  }}void deleteRoot(int array[], int num) {  int i;  for (i = 0; i < size; i++) {    if (num == array[i])      break;  }  swap(&array[i], &array[size - 1]);  size -= 1;  for (int i = size / 2 - 1; i >= 0; i--) {    heapify(array, size, i);  }}void printArray(int array[], int size) {  for (int i = 0; i < size; ++i)    printf("%d ", array[i]);  printf("\n");}int main() {  int array[10];  insert(array, 3);  insert(array, 4);  insert(array, 9);  insert(array, 5);  insert(array, 2);  printf("Max-Heap array: ");  printArray(array, size);  deleteRoot(array, 4);  printf("After deleting an element: ");  printArray(array, size);}


#include #include using namespace std;void swap(int *a, int *b) {  int temp = *b;  *b = *a;  *a = temp;}void heapify(vector<int> &hT, int i) {  int size = hT.size();      int largest = i;  int l = 2 * i + 1;  int r = 2 * i + 2;  if (l < size && hT[l] > hT[largest])    largest = l;  if (r < size && hT[r] > hT[largest])    largest = r;    if (largest != i) {    swap(&hT[i], &hT[largest]);    heapify(hT, largest);  }}void insert(vector<int> &hT, int newNum) {  int size = hT.size();  if (size == 0) {    hT.push_back(newNum);  } else {    hT.push_back(newNum);    for (int i = size / 2 - 1; i >= 0; i--) {      heapify(hT, i);    }  }}void deleteNode(vector<int> &hT, int num) {  int size = hT.size();  int i;  for (i = 0; i < size; i++) {    if (num == hT[i])      break;  }  swap(&hT[i], &hT[size - 1]);  hT.pop_back();  for (int i = size / 2 - 1; i >= 0; i--) {    heapify(hT, i);  }}void printArray(vector<int> &hT) {  for (int i = 0; i < hT.size(); ++i)    cout << hT[i] << " ";  cout << "\n";}int main() {  vector<int> heapTree;  insert(heapTree, 3);  insert(heapTree, 4);  insert(heapTree, 9);  insert(heapTree, 5);  insert(heapTree, 2);  cout << "Max-Heap array: ";  printArray(heapTree);  deleteNode(heapTree, 4);  cout << "After deleting an element: ";  printArray(heapTree);}

优先级队列的一些应用程序是:

  • Dijkstra的算法

  • 用于实现堆栈

  • 用于操作系统中的负载平衡和中断处理

  • 用于霍夫曼代码中的数据压缩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值