当前位置: 首页 > wzjs >正文

租网站需要多少钱动漫风格网站

租网站需要多少钱,动漫风格网站,东莞市人才招聘网,静态双语企业网站后台源码1. 场景引入 在面试中,我们经常会遇到类似的问题:“给定一个长度为 n 的无序数组,如何快速找出其中前 k 个最大值?”初看之下,这似乎只需排序即可解决。但当面对亿级甚至更大规模的数据时,全量排序&#xf…

1. 场景引入

在面试中,我们经常会遇到类似的问题:

“给定一个长度为 n 的无序数组,如何快速找出其中前 k 个最大值?”

初看之下,这似乎只需排序即可解决。但当面对亿级甚至更大规模的数据时,全量排序(O(n log n))的成本极高,不现实。在这种大数据背景下,如何在时间复杂度和空间复杂度之间权衡,高效找出前 k 个数值,成为考察我们算法功力的关键点。


2. 传统排序的局限与优化思路

很多人在遇到这类题目时,第一反应是“全量排序取前 k 大值”,比如直接用Arrays.sort()。但如果数组长度达到了 10910^9109,排序的时间和空间消耗你恐怕很难接受。

这类问题在算法面试中广泛存在,既考察你对数据结构的理解,也检验你在大规模数据下的优化能力。本文会带你从最直观的排序方案,逐步过渡到小顶堆、快速选择等更高效的做法,帮你理解如何真正搞定“如何高效获取无序数组的前 k 个值”这个核心问题。


3. 场景拓展与问题分析

其实在实际业务中,找“Top K”非常常见:

  • 电商推荐:找出销量排名前100的商品
  • 日志分析:统计访问量最高的IP
  • 搜索引擎:返回相关性得分最高的前10条记录

你不仅在面试中会被问到,在实际开发也常常遇到:

“在长度为 n 的无序数组中,如何快速找到前 k 个数?”


4. 堆排序:解决“Top K”更高效

全量排序问题的本质在于,我们只关心前k个值,没必要排序所有元素。这里,小顶堆(或者大顶堆,针对最小k值)是高效解法之一。核心思想是:

  • 构建一个大小为 k 的优先队列(最小堆或最大堆)。
  • 依次遍历每个元素:
    • 若堆未满,直接加入;
    • 若堆已满,且当前元素比堆顶大(对前 K 大值场景),则弹出堆顶,加入新元素;
  • 最终堆内存放的就是前 k 个最大值。

Java 实现代码:

1、堆排序(获取前k个最大值或最小值)

获取数组中前k个最大值

// 获取数组中前k个最大值
public int[] searchTopK(int[] nums, int k) {// 创建一个容量为k的小根堆(默认是小根堆)PriorityQueue<Integer> queue = new PriorityQueue<>(k);// 遍历数组中的每个元素for (int num : nums) {if (queue.size() < k) {// 如果堆还没有装满,就直接加入元素queue.offer(num);} else if (num > queue.peek()) {// 如果堆已满,且当前元素比堆顶(最小的元素)大// 移除堆顶(最小值),然后加入当前元素queue.poll();queue.offer(num);}}// 将堆中的元素转移到结果数组中(逆序取出)int[] result = new int[k];for (int i = k - 1; i >= 0; i--) {result[i] = queue.poll();}return result;
}

获取数组中前k个最小值


// 获取数组中前k个最小值
public static int[] searchTopK2(int[] nums, int k) {// 特殊情况处理:数组为空或k为0if (nums.length == 0 || k == 0) {return new int[]{};}// 创建容量为k的大根堆(自定义比较器,堆顶为最大值)PriorityQueue<Integer> queue = new PriorityQueue<>(k, (a, b) -> b - a);// 遍历数组for (int i = 0; i < nums.length; i++) {if (queue.size() < k) {// 堆未满,直接加入元素queue.offer(nums[i]);} else if(queue.peek() > nums[i]){// 如果当前元素比堆顶(最大值)小,则替换    queue.poll(); // 移除最大值queue.offer(nums[i]); // 插入较小的元素}}}// 将堆中的元素转为数组(逆序)int[] res = new int[k];for (int i = k - 1; i >= 0; i--) {res[i] = queue.poll();}return res;
}

时间复杂度: 建堆和维护堆:O(n log k)
空间复杂度: O(k)

2、获取第k个最大值

//获取第k大的最大值public static int findKthLargest(int[] nums, int k) {//创建小根堆PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);for (int num : nums) {if (minHeap.size() < k) {minHeap.offer(num); // 堆未满,直接放} else if (num > minHeap.peek()) {minHeap.poll();      // 弹出最小值minHeap.offer(num);  // 放入新值}}return minHeap.peek(); // 堆顶就是第k大}
//获取第k个最小值public static int findKthSmallest(int[] nums, int k) {//创建大根堆PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k,(a,b)->b-a);for (int num : nums) {if (maxHeap .size() < k) {maxHeap.offer(num); // 堆未满,直接放} else if (num < maxHeap.peek()) {maxHeap.poll();      // 弹出最小值maxHeap.offer(num);  // 放入新值}}return maxHeap.peek(); // 堆顶就是第k小}

3、查找top3最大值

public static void  searchTop3(int[]nums){// 初始化前三大值为最小整数Integer a = null, b = null, c = null;for (int num : nums) {// 跳过已经存在的值,确保去重if (num == a || num == b || num == c) {continue;}if (a == null || num > a) {c = b;b = a;a = num;} else if (b == null || num > b) {c = b;b = num;} else if (c == null || num > c) {c = num;}}System.out.println("a="+a+",b="+b+",c="+c);}

时间复杂度:O(n)
空间复杂度:O(1)


4、PriorityQueue介绍

概述

  • PriorityQueue是Java中的一个基于堆(Heap)实现的优先队列。
  • 元素会根据**优先级(自然顺序或自定义比较器)**自动排序。
  • 常用场景:需要不断获取当前最小或最大元素的队列。

底层实现

  • 基于堆(Heap):通常是完全二叉树,用数组存储。
  • 堆性质
    • 最小堆(Min-Heap):堆顶(根节点)是最小元素。
    • 最大堆(Max-Heap):堆顶是最大元素(通过自定义比较器实现)。
  • 操作offer()poll()操作时间复杂度为O(log n)

主要方法

方法描述复杂度
offer(e)插入元素 e,确保堆性质保持O(log n)
poll()移除并返回堆顶元素(最小或最大)O(log n)
peek()查看堆顶元素(不移除)O(1)
size()获取元素个数O(1)
isEmpty()判断队列是否为空O(1)

默认排序

  • 默认(无参数构造)
    • 是一个最小堆,元素根据元素的自然顺序(比如整数的从小到大)排序。
    • peek()返回最小元素。
  • 示例
    PriorityQueue<Integer> pq = new PriorityQueue<>();
    pq.offer(5);
    pq.offer(2);
    pq.offer(8);
    System.out.println(pq.peek()); // 输出 2
    

自定义排序

  • 通过传入比较器Comparator),可以实现最大堆或其他排序策略。

1. 最大堆(大根堆)

PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,b)->b-a);
maxHeap.offer(5);
maxHeap.offer(2);
maxHeap.offer(8);
System.out.println(maxHeap.peek()); // 输出 8

2. 自定义比较器

PriorityQueue<Person> customQueue = new PriorityQueue<>((Person p1, Person p2) -> p2.getAge() - p1.getAge());

文章转载自:

http://OSos8ph0.kpcdc.cn
http://uU9VyFeE.kpcdc.cn
http://HkHLPxtJ.kpcdc.cn
http://l58xl6GI.kpcdc.cn
http://0HyaBDY6.kpcdc.cn
http://KFApQrCL.kpcdc.cn
http://JKxzSczi.kpcdc.cn
http://b7tn4jBI.kpcdc.cn
http://aAPbBSgr.kpcdc.cn
http://cYPDFwSj.kpcdc.cn
http://GaUsbE7I.kpcdc.cn
http://KIjSc2rn.kpcdc.cn
http://kTIF6uWY.kpcdc.cn
http://B7fYNjWO.kpcdc.cn
http://041Hoi0Z.kpcdc.cn
http://g5UkVwPB.kpcdc.cn
http://fDMf8Asd.kpcdc.cn
http://cHP0QAOE.kpcdc.cn
http://iAzMat3g.kpcdc.cn
http://4QwmUvkf.kpcdc.cn
http://badrKwot.kpcdc.cn
http://gOz5xC1w.kpcdc.cn
http://j6ytumvI.kpcdc.cn
http://OamlHVtY.kpcdc.cn
http://CX0kLKq3.kpcdc.cn
http://UiDbHFIN.kpcdc.cn
http://K4jvUZoE.kpcdc.cn
http://CAg0TaW7.kpcdc.cn
http://8Fktp255.kpcdc.cn
http://n0BVY25u.kpcdc.cn
http://www.dtcms.com/wzjs/707370.html

相关文章:

  • 国外网站用什么dns长春经济技术开发区人才网
  • 做网站的说3年3年包括什么软件wordpress cos
  • 拖拽式建站商场装修
  • jsp体育用品网站建设网站制作案例效果
  • 建网站素材wordpress仿都市头条
  • 免费大数据查询平台网站首页关键词优化
  • 廊坊seo网站排名网站建设申请域名
  • 找工程项目郑州网站优化培训
  • 云虚拟主机和网站建设wordpress预览word
  • 成都网站开发 优帮云网页编辑平台
  • 上海工信部网站备案百度网站排名抓取规则
  • 服务器怎么用数据库建设网站asp网站 上传空间
  • 宝安网站制作网站建设深圳 网站制作需要多少钱 网络服务
  • 网站怎么备份怎么看网站空间多大
  • 网站技术维护费付运费送东西的网站怎么做6
  • 网络营销方案策划报告搜索引擎优化网站
  • 有哪些网站免费做推广787878域名
  • 做网站在哪哈尔滨网站建设赚钱么
  • 青岛找网站建设公司好推广普通话手抄报内容50字
  • 东莞网站优化排名系统手机网站 php
  • 免费打开的网站开通公司网站怎么开通
  • vue做的博客网站舟山论坛网站建设
  • 画册排版设计网站制作网站的步骤和方法
  • 高权重域名做网站网页设计与制作思考建议
  • 吴中区网站建设技术公司网站需要备案
  • 衡水网站建设设计网站建设营销话术
  • 设计网站案例网站推广普通话的手抄报
  • 保险公司网站建设方案网站高中建设工具
  • 义乌做网站公司正规大宗商品交易平台
  • 临沂网站建设铭镇wordpress 单页面翻页