1.优先级队列priority_queue
优先级队列(Priority Queue)是一种特殊类型的队列,其中每个元素都关联有一个优先级。优先级高的排在队列的前面,它基于堆(Heap)数据结构实现,通常使用二叉堆来存储元素。默认情况下,std::priority_queue以降序方式排列元素,即最大的元素具有最高优先级。
以下是std::priority_queue的一些重要操作:
- push(element):将元素插入到优先级队列中,并根据其优先级进行调整。
- pop():删除优先级队列中的最高优先级元素。
- top():返回优先级队列中的最高优先级元素,但不删除它。
- empty():检查优先级队列是否为空。
- size():返回优先级队列中的元素数量。
2.常见的链表有哪些?分别分析其查找、插入和删除的时间复杂度
单向链表、双向链表、循环链表
- 对于查找操作,链表的平均时间复杂度都为O(n),因为需要遍历整个链表。
- 对于插入和删除操作,如果是在链表的头部插入或删除节点,时间复杂度为O(1),否则平均时间复杂度为O(n)。
单向链表
3.请简要说说单向链表和双向链表的应用
单向链表的应用:
- 实现栈和队列:使用单向链表可以方便地实现栈和队列的操作,例如,将链表头作为栈顶,每次插入和删除节点都在头部进行。
- 表示多项式、多精度整数等数据结构:在数学计算中,多项式、多精度整数等复杂数据结构可以使用单向链表来存储,表达和计算。
双向链表的应用:
- 实现LRU缓存策略:双向链表除了头指针,还有一个尾指针,可以方便地删除尾部节点,提高删除操作的效率。
- 图的表示:在图的算法中,双向链表可以用于表示邻接表,记录图中每个节点的邻居节点,方便图的遍历和操作。
- 实现双向队列:双向链表还可以用于实现双向队列(Deque),支持在队列的头部和尾部进行插入和删除操作。
需要根据具体的应用场景选择适合的链表类型。单向链表适用于简单的数据结构和操作,而双向链表在需要频繁插入和删除节点的情况下更为高效。
4.请简要说说循环链表和双向链表
循环链表(Circular Linked List)是一种特殊的链表,其中最后一个节点的指针指向头节点,形成一个闭环。即链表中的最后一个节点不再指向空值(null),而是指向头节点。
循环链表的特点:
- 可以通过任意节点遍历整个链表,因为它形成了一个闭环。
- 可以在任意位置进行插入和删除操作。
循环链表的应用场景:
- 约瑟夫问题:循环链表常用于解决约瑟夫问题,即围坐在圆桌周围的一组人按照某种规则报数,并根据规则淘汰出局,最后剩下的人的位置。
- 循环队列的实现:循环链表也可以用于实现循环队列,通过头指针和尾指针分别指向队列的头部和尾部,实现元素的循环入队和出队操作。
双向链表(Doubly Linked List)是一种链表的扩展形式,除了包含指向下一个节点的指针外,还包含指向上一个节点的指针。
双向链表的特点:
- 可以方便地从任意节点开始,沿着前驱指针或后继指针遍历整个链表。
- 可以在任意位置进行插入和删除操作,相对于单向链表更加灵活。
5.说一下数组和链表
数组是一种有序的、固定大小的、存储相同数据类型的线性数据结构。;
数组的主要特点:
- 插入和删除效率低
- 连续内存,大小固定,无法动态扩展
- 可以根据下标随机访问,查找效率高
链表也是一种线性的数据结构,但链表不是连续内存,而是通过指针指向将元素进行关联
链表的主要特点:
- 插入和删除效率高
- 非连续内存,无固定大小,可以随时扩展
- 无法随机访问,查找效率低
对于查找操作,数组的时间复杂度是O(1),链表的是O(n)