zoukankan      html  css  js  c++  java
  • 如何判断一个数是否在40亿个整数中?

    问题的提出:

    如何判断一个数是否在40亿个整数中?

    问题的解决方案:

    1、分钟级方法:用一个map集合来存储数据,新的数判断是否在map集合中。

    2、分钟级方法:使用set集合来存储数据,新的数判断是否在set集合中。此时如果整数为32位,那么set集合就需要占用大约16G的空间。

    3、秒级方法:使用分布式将数据分在8个机器上,然后同时查找,返回是否存在。

    4、毫秒级方法:32位int的范围,总共就是2的32次方,大概42亿多点。所以你可以申请2的32次方个位。40亿个数中,存在的数就在相应的位置1,其他位就是0。新的数就去找相应的位,比如来了一个1234,就找一下第1234位,如果是1就存在,是0就不存在啦。此时2的32次方个位,相当于2的29次方个字节,才500MB,真是节省了不少内存呢。其实这是一种非常有名的大数据算法,叫位图法,英文名叫bitmap。顾名思义,就是用位来表示状态,从而节省空间。

    5、首先,32位int的范围是42亿,40亿整数中肯定有一些是连续的,我们可以先对数据进行一个外部排序,然后用一个初始的数和一个长度构成一个数据结构,来表示一段连续的数,举个例子。如果数据是1 2 3 4 6 7……这种的,那么可以用(1,4)和(6,2)来表示,这样一来,连续的数都变成了2个数表示。来了一个新数之后,就用二分法进行查找了。这样一来,最差情况就是2亿多的断点,也就是2亿多的结构体,每个结构体8个字节,大概16亿字节,1.6GB,在内存中可以放下。

  • 相关阅读:
    跨平台的图形软件Dia
    Marvel
    How to install Freemind 1.0.1 to Ubuntu 14
    PHP环境搭建
    java 调用wsdl接口同时将返回数据解析成json
    WSDL接口调用
    struts2 使用装饰页面 /decorators
    Android WebView中的JavaScript代码使用(转载)
    android WebView 显示网页
    linux vi 编辑器命令
  • 原文地址:https://www.cnblogs.com/zsh-blogs/p/10561141.html
Copyright © 2011-2022 走看看