刷算法,你应该知道的队列经典应用

简介: 文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。

一、前言

算法是计算机软件的基础,常见算法是软件开发的核心基本功,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去,关注我,我们一起学习,增强我们的基本功。

二、队列介绍与经典操作

我们应该很熟悉队列的特性,先进先出,和我们生活中排队办事是一样的,先来先服务。 队列底层可以通过数组或者链表来实现。

image.png

1、用队列实战栈

虽然队列特性和栈特性相反,上文分析了栈可以实现队列,其实队列也可以实现栈

image.png

我们有两种方案可以实现。

  • 第一种,通过两个队列实现。

image.png

  • 第二种,通过1个队列实现。

1个队列怎么实现栈呢? 我们每次把除队列尾的全部弹出,并且重新加入队列尾部后面。这样一个队列可以达到栈的目的。

image.png

2、优先级队列,解决topK问题

优先级队列,可以按元素排序,最大或者最小的元素排在队列头部。

比如我们需要从100个数里面找出最大的3个数。我们可以怎么做呢?我们可以维护一个只有三个元素的优先级队列,队头存最小值,队尾存最大值,每次入队做好排序,同时把队头小的元素优先出队,直到所有元素入队完成,最后队列里留下的数都是比其他元素大的数了。

image.png

三、队列实战

leetcode队列实现栈225. 用队列实现栈

  • 方案一使用一个队列
class MyStack {
   
   

    LinkedList<Integer> linkedList = new LinkedList<>();
    LinkedList<Integer> linkedList2 = new LinkedList<>();

    public MyStack() {
   
   

    }

    public void push(int x) {
   
   

      linkedList.addLast(x);

    }

    public int pop() {
   
   

      int len =  linkedList.size();

      if(len == 0) {
   
   
          return 0;
      }


      int l = len-1;

      while(l > 0) {
   
   
        int v = linkedList.poll();
        linkedList2.addLast(v);
        l--;
      }

      int val = linkedList.poll();
      linkedList = linkedList2;
      linkedList2 = new LinkedList<>();

      return val ;

    }

    public int top() {
   
   

        return linkedList.peekLast();

    }

    public boolean empty() {
   
   
        return linkedList.isEmpty();
    }
}
  • 方案二使用两个队列
class MyStack {
   
   

    LinkedList<Integer> linkedList = new LinkedList<>();

    public MyStack() {
   
   

    }

    public void push(int x) {
   
   

      linkedList.addLast(x);

    }

    public int pop() {
   
   

      int len =  linkedList.size();

      if(len == 0) {
   
   
          return 0;
      }
      int l = len-1;

      while(l > 0) {
   
   
        int v = linkedList.poll();
        linkedList.addLast(v);
        l--;
      }
      return  linkedList.poll();
    }

    public int top() {
   
   
        return linkedList.peekLast();
    }

    public boolean empty() {
   
   
        return linkedList.isEmpty();
    }
}

topk问题,347. 前 K 个高频元素

class Solution {
   
   
    public int[] topKFrequent(int[] nums, int k) {
   
   
        //先统计频率数量
        Map<Integer,Integer> map = new HashMap();
        for(int i=0; i<nums.length; i++) {
   
   
            map.put(nums[i], map.getOrDefault(nums[i],0) + 1);
        }

        //只寸k个元素 队列里面保留最大的队头存最小的 从小到大排序 传入比较器
        PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>(k, (e1, e2) -> e1.getValue().equals(e2.getValue()) ? 0 : ((e1.getValue()<e2.getValue())? -1 : 1));

        //只存两个元素
        for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
   
   

            if(queue.size() < k) {
   
   
                queue.add(entry);
            } else {
   
   
                //超过了k个了,将队列头移除,再入队
                Map.Entry<Integer, Integer> e = queue.peek();
                //大于队头元素,入队
                if(e.getValue() < entry.getValue()) {
   
   
                    queue.poll();
                    queue.add(entry);
                }
            }
        }

        int[] result = new int[k];
        int i = 0;
        for(Map.Entry<Integer, Integer> q : queue) {
   
   
            result[i] = q.getKey();
            i++;
        }

        return result;
    }
}

四、总结

队列具有先进先出的特性,本文分析了几种常见的使用场景,我们可以通过队列实现栈的能力,也可以实现通过优先级队列解决TopK的问题,其实队列在我们实际开发中使用场景很多的,比如线程池通过队列缓存待执行任务,再比如ReentrantLock里面的公平锁实现也是通过队列来实现的。

算法知识是我们开发的基本功,有空我们学习探索一些算法知识呀!!

服务端技术栈.png

相关文章
|
6月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
166 15
|
7月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
62 1
|
6月前
|
分布式计算 并行计算 算法
MapReduce在实现PageRank算法中的应用
总结来说,在实现PageRank算法时使用MapReduce能够有效地进行大规模并行计算,并且具有良好的容错性和可扩展性。
212 76
|
4月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
117 3
|
4月前
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
97 5
|
4月前
|
存储 机器学习/深度学习 算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
126 2
|
5月前
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
95 1
|
6月前
|
存储 人工智能 算法
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
阿里云向量检索服务Milvus 2.5版本在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在RAG 应用的 Retrieve 阶段的最佳实践。
1363 1
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统

热门文章

最新文章