zoukankan      html  css  js  c++  java
  • 如何在大量的数据中找出不重复的整数

    题目描述:

    在 2.5 亿个整数中找出不重复的整数。注意:内存不足以容纳这 2.5 亿个整数。

    分析与解答:

    由于这道题目与前面的题目类似,也是无法一次性把所有数据加载到内存中,因此也可以采用类似的方法求解。
    方法一:分治法
    采用 hash 函数的方法,把这 2.5 亿个整数划分到更小的文件中,从而保证每个文件的大小不超过可用的内存大小。然后对每个小文件而言,所有的数据都可以一次性被加载到内存中,因此可以使用 hash_map 或 hash_set 来找到每个小文件中不重复的整数。当处理完所有的文件后就可以找出这 2.5 亿个整数中所有的不重复的整数。
    方法二:位图法
    对于整数相关的算法的求解,位图法是一种非常实用的算法。对本题而言,如果可用的内存空间超过 1GB 就可以使用这种方法。具体思路:假设整数占用 4B(如果占用 8B,则求解思路类似,只不过需要占用更大的内存),也就是 32bit,可以表示的整数的个数为 232。由于本题只查找不重复的数,而不关心具体数字出现的次数,因此可以分别使用 2 个 bit 来表示各个数字的状态:用 00 表示这个数字没有出现过,01 表示出现过 1 次,10 表示出现了多次, 11 暂不使用。
    根据上面的逻辑,在遍历这 2.5 亿个整数时,如果这个整数对应的位图中的位为 00,那么就修改成 01;如果为 01,则修改为 10;如果为 10,则保持原值不变。这样当所有数据遍历完成后,可以再遍历一遍位图,位图中值为 01 的 bit 对应的数字就是没有重复的数字。

  • 相关阅读:
    Docker笔记
    使用NextCloud搭建私有云盘
    docker轻量级管理工具
    docker仓库使用+harbor私有仓库部署
    防DDOS攻击解决方案
    MongoDB非关系型数据库
    监控磁盘使用率解决方案
    部署SonarQube代码质量检查7.7版本
    Jenkins的权限控制
    Jenkins分布式构建
  • 原文地址:https://www.cnblogs.com/hardy-wang/p/13072964.html
Copyright © 2011-2022 走看看