算法通过村第十五关-超大规模|青铜笔记|海量找数

news2025/3/10 10:53:53

文章目录

  • 前言
  • 用4KB内存寻找重复数
  • 总结


前言


提示:并不是所有黑暗的地方,都需要光明。 --珍妮特·温特森《句子不是唯一的水果》

在大部分算法中,默认给点给的数据量都是很小的,例如只有几个或者十几个元素,但是如果遇到了相当大的数据量高达百万乃至十亿,那么处理逻辑就会发生很大差异,也就是说算法中常考的,这个很重要。

这里的题目重点是理解怎么处理,面试的时候遇上可以不用慌张,做到心中有数,这一半也不会写代码。这里做如下演示:

在海量数据中,此时普通的数组、链表、Hash、树等等结构这里就没有什么效果了,因为内存空间肯定是放不下的。而常规的递归、排序、回溯、贪心甚至动态规划等思想在大量数据面前也是不顶用的。因为执行超时,必然要另寻他法。这类问题我们要如何下手呢?这里又三种比较今典的思路:

  1. 使用位存储,使用存储最大的好处是占用空间是简单存储整数的 1/8 。例如一个 40亿的整数数组,如果用整数存储需要 16GB 左右的空间,而如果使用位存储,就可以仅用 0.5GB 的空间,这样很多问题就能够解决了。
  2. 如果文件实在太大,无法在能存中存放,则需要考虑将大文件分成若干小块,先处理每块的,最后支部得到想要的结果,这种方式也叫做 外部排序。 这样需要遍历全部遍历至少两次,是经典的用时间换空间的方法。
  3. 。 在处理超大数据中找第K大,第K小,K个最大,K个最小。则特别使用堆来做。而且将超大数据换成流数据也是可以的,而且几乎是唯一的方式,口诀就是“查小用大堆,查大用小堆”。

用4KB内存寻找重复数

题目要求:给定一个数组,包含1到N的整数,N最大为32_000,数组可能还有重复值,且N的值取值不定,若只有4KB的内存可用,该如何打印数组中所有重复的元素。

分析:本身是一道海量数据问题的热身题目,如果去掉只用“4KB”的要求,我们可以先创建一个大小为N的数组,然后将这些数据放进去,但是整数最大为32_000。如果直接才用数组,则需要使用32_000 * 4B = 128KB的空间,而题目只有4kb 的内存限制,我们就必须先解决该如何存放的问题。

如果是只有4KB,那么考虑寻值,只能有 8 * 4 * 2 ^10 个比特。这个值要比32_000要大的多,因此我们可以创建一个32_000比特的维向量(比特数组),其中一个比特位位置就代表一个整数。利用这个位相量,就可以遍历整个数组,如果返现数组元素是v 那么将这个位置的v设置为1,碰到重复元素,就输出一下。

  /**
     * 检查重复项
     * @param array
     */
    public void checkDuplicates(int[] array){
        BitSet bs = new BitSet(32_000);
        for (int i = 0; i < array.length; i++) {
            int num = array[i];
            int num0 = num - 1;
            if(bs.get(num0)){
                System.out.println(num);
            }else{
                bs.set(num0);
            }
        }
    }
    class BitSet {
        int[] bitSet;
        public BitSet(int size){
            // 做数据压缩
            this.bitSet = new int[size >> 5];
        }

        public boolean get(int pos){
            int wordNumber = (pos >> 5); // 除以32
            int bitNumber = (pos & 0x1F); // 除以32
            return (bitSet[bitNumber] & (1 << bitNumber)) != 0;
        }

        public void set(int pos){
            int wordNumber = (pos >> 5); // 除以32
            int bitNumber = (pos & 0x1F); // 除以32
            bitSet[wordNumber] |= 1 << bitNumber;
        }
    }

总结

提示:海量数据去重;大数据筛选;海量找数;流数据过滤;堆的应用

在这里插入图片描述


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何定量对比两个图分类数据集的分布

以下来自gpt&#xff0c;若有勘误&#xff0c;欢迎指正&#xff1a; &#xff08;图片来自links &#xff0c;侵删&#xff09; 对于两个图分类数据集的分布&#xff0c;我们可以使用一些统计指标来进行定量对比。下面介绍一些常用的指标&#xff1a; 图分类准确率 图分类准确…

性能测试的指南:测试类型、性能测试步骤、最佳实践等

近期公司为了节省成本搞了一波机房迁移&#xff0c;整合了一些南美部署架构。有一些上google云和有些下阿里云等大的调整。 在做机房迁移项目当中就需要思考如何进行性能测试&#xff0c;这种大的机房迁移SRE&#xff08;运维&#xff09;会针对组件会做一些单组件的性能测试&a…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

如何通过代码混淆绕过苹果机审&#xff0c;解决APP被拒问题 目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD…

aidl的注意事项

该篇继承自上一篇&#xff0c;上一篇也有一部分的注意事项&#xff0c;这一篇把其他的情况列出 一 客户段和服务端的aidl文件下的package名字要是一样的 二 server中的 manifest中的package名字&#xff0c;这个与上面两个包不能相同&#xff0c;不然在客户端设置intent的pa…

Vulnhub靶场之matrix-breakout-2-morpheus

简介&#xff1a; vulnhub是一个提供靶场环境的平台。今天从首页下载了一个来做&#xff0c;它叫matrix-breakout-2-morpheus。 项目下载地址&#xff1a;Matrix-Breakout: 2 Morpheus ~ VulnHub 0x01 信息收集 查看本机IP&#xff0c;靶机跟kali都是使用NAT模式&#xff0c;所…

【QT开发(4)】Qt Creator编译器修改,应用程序二进制接口(ABI)的版本;API、ABI、系统调用是什么?版本的选择(ABI和CPU版本)

文章目录 1.编译器的简介2 应用程序二进制接口&#xff08;ABI&#xff09;的版本3 API、ABI、系统调用是什么,以及这三个词的区别。3.1 什么是API?3.2 什么是ABI?3.3 API和系统调用有什么区别 4 Qt for Android——关于版本的选择(ABI和CPU版本)参考 1.编译器的简介 编译器…

【Linux】adduser命令使用

我们经常在linux系统中创建用户。有时候用的是 useradd 有时候用的是 adduser &#xff0c;好混乱啊到底用哪个啊。今天咱们一起来学习一下。 adduser与useradd的区别 useradd 命令是内置的 Linux 命令&#xff0c;在任何 Linux 系统中都可用。然而&#xff0c;使用这种低级…

Flink日志收集到数据库/kafka

引言 我们做项目过程中发现flink日志不同模式启动&#xff0c;存放位置不同&#xff0c;查找任务日志很不方便&#xff0c;具体问题如下&#xff1a; 原始flink的日志配置文件log4j-cli.properties appender.file.append false&#xff0c;取消追加&#xff0c;直接覆盖掉上…

Ansible---playbook 剧本

目录 一、playbook 1.1 playbook的组成 二、playbook的编写格式&#xff08;示例&#xff09; 1、定义、引用变量 2、指定远程主机sudo切换用户 3、when条件判断 4、迭代 5、Templates 模块 6、tags 模块 7、Roles 模块 一、playbook playbook是剧本的意思通过 task…

黑客技术(自学)——网络安全

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学&#xff1f;如何学&#xff1f; 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c…

web安全之路的规划

前言 我自学过程中搜集的资料已经整理成一套完整的教程&#xff0c;需要的可以点击链接&#xff1a;CSDN大礼包&#xff1a;零基础到进阶全套学习教程&#xff0c;免费分享&#xff01; 我的web安全学习策略 一、开始前的思考 我真的喜欢搞安全吗? 我只是想通过安全赚钱钱…

2023年【安徽省安全员C证】考试内容及安徽省安全员C证考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安徽省安全员C证考试内容是安全生产模拟考试一点通总题库中生成的一套安徽省安全员C证考试报名&#xff0c;安全生产模拟考试一点通上安徽省安全员C证作业手机同步练习。2023年【安徽省安全员C证】考试内容及安徽省安…

Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用

目录 一、Vue 1.1、标准开发方式 1.2、组件的使用 1.2.1、全局组件 1.2.2、局部组件 1.2.3、props 传递静态数据 1.2.4、props 传递动态数据 1.2.5、事件传递 1.2.6、插槽slot 一、Vue 1.1、标准开发方式 Vue 的标准开发方式是 SPA&#xff08;Single Page Applicatio…

【HCIP】ppp实验

实验要求 1、R1 和 R2 使用 PPP 链路直连&#xff0c;R2和R3 把2条 PPP 链路捆绑为 PPP MP 直连 2、按照图示配置 IP 地址 3、R2对R1的PPP进行单向 chap 验证 4、R2和R3的PPP进行双向 chap 验证 配置 1、如图&#xff0c;R1 和 R2 已使用 PPP 链路直连 2、R2 和 R3上配置…

Linux | Linux权限详解

目录 前言 一、访问角色的分类 1、用户的切换 2、root用户的理解 3、用户切换的理解 二、权限的理解 三、权限管理 1、文件的访问者 2、文件类型与访问权限 &#xff08;1&#xff09;文件类型 &#xff08;2&#xff09;访问权限 3、文件权限的修改 &#xff08…

敏捷开发中,Sprint回顾会的目的

Sprint回顾会的主要目的是促进Scrum团队的学习和持续改进。在每个Sprint结束后&#xff0c;团队聚集在一起进行回顾&#xff0c;以达到以下目标&#xff1a; 识别问题&#xff1a; 回顾会允许团队识别在Sprint&#xff08;迭代&#xff09;期间遇到的问题、挑战和障碍。这有助于…

专业图表绘制软件 OmniGraffle Pro mac v7.22.1中文版软件介绍

OmniGraffle Pro mac是一款Mac平台上的专业绘图软件&#xff0c;主要用于创建各种图形&#xff0c;包括流程图、组织结构图、网络拓扑图、UI原型等。该软件提供了强大的绘图工具和丰富的样式库&#xff0c;可以让用户快速创建出高质量的图形&#xff0c;并支持导入和导出各种常…

BI零售数据分析:以自身视角展开分析

随着零售业务不断扩展&#xff0c;市场竞争不断加剧&#xff0c;各层级的销售管理人员都急需一张能快速查看销售数据分析报表&#xff0c;能从中知道自己管辖内的业务最近或过去的情况&#xff0c;并依次为依据科学优化销售管理措施。这就要求零售数据分析报表信息足够多、数据…

计算机毕业设计 基于SpringBoot产业园区智慧公寓管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【Vue】vue2与WebApi跨域CORS问题

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍1.1 为什么会产生跨越1.2 什么是跨越 二、问题描述三、问题解决3.1 方法一&#xff1a;前端Vue修改3.2 方法二&#…