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

算法通关村——位运算在查找重复元素中的妙用

用4KB内存寻找重复元素

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

如果不要求使用4KB,最简单就是使用N长的数组然后将元素都存入数组,再打印,但是题目规定了4KB,很显然这种做法就不大行了,一定会超出时间限制。

4KB=4 * 8 * 2 ^ 10 比特,这个值是大于32000,可以使用比特数组来存储相应的元素。利用这个位向量,就可以遍历访问整个数组。如果发现数组元素是v,那么就将位置为v的设置为1,碰到重复元素,就输出。代码就没什么可说的,真要实现起来,还是有一点复杂的。

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);}}}class BitSet {int[] bitset;public BitSet(int size) {this.bitset = new int[size >> 5];}boolean get(int pos) {int wordNumber = (pos >> 5);//除以32int bitNumber = (pos & 0x1F);//除以32return (bitset[wordNumber] & (1 << bitNumber)) != 0;}void set(int pos) {int wordNumber = (pos >> 5);//除以32int bitNumber = (pos & 0x1F);//除以32bitset[wordNumber] |= 1 << bitNumber;}}
}
http://www.lryc.cn/news/155431.html

相关文章:

  • 使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)
  • 【python基础知识】5.for循环和while循环
  • STM32CUBEMX_创建时间片轮询架构的软件框架
  • vue 插槽Slots
  • 论文阅读《Nougat:Neural Optical Understanding for Academic Documents》
  • 较难的换根dp:P6213 「SWTR-04」Collecting Coins
  • Springboot - 15.二级分布式缓存集成-Caffeine
  • 二叉树的介绍及二叉树的链式结构的实现(C语言版)
  • 不同写法的性能差异
  • Bytebase 2.7.0 - ​新增分支(Branching)功能
  • day55 动规.p15 子序列
  • TypeScript DOM类型的声明
  • springboot找不到注册的bean
  • MEMS传感器的原理与构造——单片式硅陀螺仪
  • Redis集群服务器
  • 动态维护直径 || 动态维护树上路径 || 涉及LCA点转序列 || 对欧拉环游序用数据结构维护:1192B
  • MySQL 存储引擎,你了解几个?
  • Java 动态规划 Leetcode 740. 删除并获得点数
  • 算法通关村十三关-青铜:数字与数学基础问题
  • 猜拳游戏小程序源码 大转盘积分游戏小程序源码 积分游戏小程序源码
  • 【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据
  • webpack基础配置【总结】
  • typescript 支持与本地调试
  • 后端面试话术集锦第 十八 篇:JVM面试话术
  • “历久弥新 | 用AI修复亚运珍贵史料”活动震撼来袭!
  • uni-app 之 scroll-view和swiper
  • Harmony网络请求工具类
  • 【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
  • 【前端】webpack打包去除console.log
  • docker使用(二)提交到dockerhub springboot制作镜像