码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法通关村第十五关:青铜-用4KB内存寻找重复元素


    青铜挑战-用4KB内存寻找重复元素

    位运算在查找元素中的妙用

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

    思路分析

    本题是非常典型的海量数据处理的问题,使用的是位运算结构

    内存大小关系
    1字节 = 1byte(拜特) = 1B = 8bit(比特,位)
    1KB = 1024B
    1MB = 1024KB
    1GB = 1024MB

    如果没有内存要求,创建一个大小为N的数组,然后将这些整数(32位)放进来,N最大为32000,则需要 320004B ≈ 128KB
    如果只有4KB的空间,那么只能寻址 4KB = 4*1024B = 4*1024
    8bit(比特) 该值大于32000
    因此我们可以创建32000比特的位向量(比特数组),其中一个比特位置就代表一个整数,类似索引

    利用这个位向量,就可以遍历访问整个数组。如果发现数组元素是v,那么就将位置为v的位设置为1,碰到重复元素,就输出一下

    代码实现

    1个数组元素存储 32 个数字信息,如索引为0的元素存储1~32

    def check_duplicates(array):
        bitset = [0] * (32000 // 32)
        for num in array:
            num0 = num - 1
            if (bitset[num // 32] >> (num0 % 32)) & 1:
                print(num)
            else:
                bitset[num // 32] |= (1 << (num0 % 32))
    
    
    if __name__ == '__main__':
        check_duplicates([1, 2, 3, 2])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    public class FindDuplicatesIn32000 {
        public void checkDuplicates(int[] array) {
            BitSet bs = new BitSet(32000);
            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);
                }
            }
    
        }
    
        static class BitSet {
            int[] bitset;
    
            public BitSet(int size) {
                this.bitset = new int[size >> 5];
            }
    
            boolean get(int pos) {
                int wordNumber = (pos >> 5);// 除以32
                int bitNumber = (pos & 0x1F); // 求32的余数
                return (bitset[wordNumber] & (1 << bitNumber)) != 0;
            }
    
            void set(int pos) {
                int wordNumber = (pos >> 5);// 除以32
                int bitNumber = (pos & 0x1F);// 求32的余数
                bitset[wordNumber] |= 1 << bitNumber;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    压测工具Jmeter介绍及使用
    项目平台——项目首页设计(五)
    在MySQL中创建新的数据库,可以使用命令,也可以通过MySQL工作台
    阿里云函数计算 1024云上见 AIGC小说创作大赛:如何搭建自定义的阿里通义千问
    分布式--OpenResty+lua+Redis实现限流与防爬虫
    极智AI | TensorRT Parser 构建模型推理方法
    3.搭建增长模型-数据洞察
    【JavaScript】制作一个抽奖转盘页面
    小程序源码:超强大教育培训学校源码微信小程序源码下载,带课件/习题/活动插件,支持小程序与公众号双版本
    西工大&ANU&CSIRO&IIAI提出基于排序的伪装目标检测网络RankNet,并提供了最大的COD数据集!...
  • 原文地址:https://blog.csdn.net/qq_41662142/article/details/132692010
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号