打印
[开发资料]

优先级队列

[复制链接]
453|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2024-11-15 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
队列(Queue)的知识点:「概念」:队列是一种先进先出(FIFO)的数据结构,类似于排队的概念。「基本操作」:enqueue(item): 将元素添加到队列的末尾。dequeue(): 从队列的头部移除并返回元素。isEmpty(): 检查队列是否为空。size(): 返回队列中元素的数量。「代码示例」:#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int items[MAX_SIZE];
    int front;
    int rear;
} Queue;

void enqueue(Queue *q, int item) {
    if (q->rear == MAX_SIZE - 1) {
        printf("Queue is full\n");
        return;
    }
    q->items[++(q->rear)] = item;
}

int dequeue(Queue *q) {
    if (q->front > q->rear) {
        printf("Queue is empty\n");
        exit(1);
    }
    return q->items[(q->front)++];
}

int isEmpty(Queue *q) {
    return q->front > q->rear;
}

int size(Queue *q) {
    return q->rear - q->front + 1;
}

int main() {
    Queue q = {{0}, -1, -1};

    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);

    printf("%d\n", dequeue(&q));  // 输出:1
    printf("%d\n", size(&q));     // 输出:2

    return 0;
}
优先级队列(Priority Queue)的知识点:「概念」:优先级队列是一种队列,每个元素都有一个优先级。具有最高优先级的元素先出队。「基本操作」:insert(item, priority): 将元素以及其优先级插入队列。extractMax(): 返回具有最高优先级的元素并将其从队列中移除。isEmpty(): 检查队列是否为空。size(): 返回队列中元素的数量。「代码示例」:#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int priority;
    int data;
} Node;

typedef struct {
    Node *nodes;
    int capacity;
    int size;
} PriorityQueue;

PriorityQueue* createPriorityQueue(int capacity) {
    PriorityQueue *pq = (PriorityQueue*)malloc(sizeof(PriorityQueue));
    pq->nodes = (Node*)malloc(capacity * sizeof(Node));
    pq->capacity = capacity;
    pq->size = 0;
    return pq;
}

void insert(PriorityQueue *pq, int data, int priority) {
    if (pq->size == pq->capacity) {
        printf("Priority Queue is full\n");
        return;
    }

    int i = pq->size;
    while (i > 0 && pq->nodes[(i - 1) / 2].priority < priority) {
        pq->nodes[i] = pq->nodes[(i - 1) / 2];
        i = (i - 1) / 2;
    }

    pq->nodes[i].data = data;
    pq->nodes[i].priority = priority;
    pq->size++;
}

int extractMax(PriorityQueue *pq) {
    if (pq->size == 0) {
        printf("Priority Queue is empty\n");
        exit(1);
    }

    int max = pq->nodes[0].data;
    pq->size--;

    int i = 0;
    Node lastNode = pq->nodes[pq->size];
    int child;
    while (2 * i + 1 < pq->size) {
        child = 2 * i + 1;
        if (child + 1 < pq->size && pq->nodes[child + 1].priority > pq->nodes[child].priority) {
            child++;
        }
        if (lastNode.priority >= pq->nodes[child].priority) {
            break;
        }
        pq->nodes[i] = pq->nodes[child];
        i = child;
    }
    pq->nodes[i] = lastNode;

    return max;
}

int isEmpty(PriorityQueue *pq) {
    return pq->size == 0;
}

int size(PriorityQueue *pq) {
    return pq->size;
}

int main() {
    PriorityQueue *pq = createPriorityQueue(5);

    insert(pq, 1, 3);
    insert(pq, 2, 1);
    insert(pq, 3, 5);

    printf("%d\n", extractMax(pq));  // 输出:3
    printf("%d\n", size(pq));        // 输出:2

    return 0;
}

使用特权

评论回复
沙发
小小蚂蚁举千斤| | 2024-11-22 09:28 | 只看该作者
队列执行还是有过程的

使用特权

评论回复
板凳
中国龙芯CDX| | 2024-11-24 19:26 | 只看该作者
队列是一种先进先出(FIFO)的数据结构,类似于排队的概念。

使用特权

评论回复
地板
AdaMaYun| | 2024-12-10 11:19 | 只看该作者
队列的使用非常广泛

使用特权

评论回复
5
LOVEEVER| | 2024-12-12 08:12 | 只看该作者
队列其实是自己制作的一个缓存区

使用特权

评论回复
6
hhdhy| | 2025-2-17 15:53 | 只看该作者
优先级队列是一种特殊的队列数据结构,其中每个元素都有一个优先级。与普通队列不同,优先级队列中的元素不是按照先进先出(FIFO)的原则进行处理,而是按照优先级的高低进行处理。优先级高的元素会先被处理,而优先级低的元素则会被延后处理。

使用特权

评论回复
7
hight1light| | 2025-2-17 17:10 | 只看该作者
优先级队列的特点是每个元素都有一个优先级,通常用数值表示,数值越小优先级越高(或反之)

使用特权

评论回复
8
ewyu| | 2025-2-17 18:16 | 只看该作者
其实优先队列可以动态调整:元素的优先级可以在运行时动态调整。

使用特权

评论回复
9
nuan11nuan| | 2025-2-17 19:30 | 只看该作者
一般优先队列是支持高效操作的:优先级队列通常支持高效的插入和删除操作,时间复杂度通常为O(log n)。

使用特权

评论回复
10
一切D都好| | 2025-2-17 20:45 | 只看该作者
优先队列的二叉堆一般是2种:最小堆:父节点的值小于或等于其子节点的值,堆顶元素是最小值。最大堆:父节点的值大于或等于其子节点的值,堆顶元素是最大值。

使用特权

评论回复
11
canfeil| | 2025-2-17 21:56 | 只看该作者
插入和删除操作的时间复杂度为O(log n),获取堆顶元素的时间复杂度为O(1)

使用特权

评论回复
12
清芯芯清| | 2025-2-18 08:21 | 只看该作者
斐波那契堆:特点:支持更高效的合并操作,某些操作的时间复杂度为O(1)。应用:适用于需要频繁合并优先级队列的场景

使用特权

评论回复
13
清芯芯清| | 2025-2-18 10:45 | 只看该作者
平衡二叉搜索树也是优先队列常用的:特点:支持高效的插入、删除和查找操作,时间复杂度为O(log n)。应用:适用于需要频繁查找和删除任意元素的场景

使用特权

评论回复
14
gra22ce| | 2025-2-18 11:27 | 只看该作者
优先队列的大致流程,将一个新元素插入到优先级队列中,并根据其优先级调整队列。删除优先级最高(或最低)的元素。获取优先级最高(或最低)的元素,但不删除它。Decrease/Increase Key):调整队列中某个元素的优先级。

使用特权

评论回复
15
eleg34ance| | 2025-2-18 13:16 | 只看该作者
优先级队列的应用任务调度:在操作系统中,优先级队列用于调度进程或线程,优先级高的任务先执行。

使用特权

评论回复
16
peterLaw| | 2025-2-18 16:10 | 只看该作者
队列的使用一般注意取放就好

使用特权

评论回复
17
星辰大海不退缩| | 2025-2-20 15:15 | 只看该作者
队列是一种先进先出(FIFO)的数据结构

使用特权

评论回复
18
elephant00| | 2025-2-21 11:05 | 只看该作者
优先级队列是0个或多个元素的集合,每个元素都有一个优先权(或值)。对优先级队列执行的操作主要包括查找、插入一个新元素和删除。

使用特权

评论回复
19
两只袜子| | 2025-2-21 14:26 | 只看该作者
优先级队列是一种重要的数据结构,它根据元素的优先级提供服务。通过选择合适的实现方式和比较函数,优先级队列可以灵活地应用于各种场景。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1266

主题

5882

帖子

14

粉丝