算法通关村第十五关-白银挑战继续海量数据问题

大家好我是苏麟 , 今天继续聊聊海量数据问题 .

理解了前面的题目之后,本文,我们来详细看几道典型的海量数据场景下的查找问题

从40个亿中产生一个不存在的整数

题目要求: 给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务
本题不用写代码,如果能将方法说清楚就很好了,我们接下来一步步分析该如何做

位图存储大数据的原理

假设用哈希表来保存出现过的数,如果 40 亿个数都不同,则哈希表的记录数为 40 亿条,存一个 32 位整数需要 4B,所以最差情况下需要 40 亿*4B=160 亿字节,大约需要16GB 的空间,这是不符合要求的。

40 亿*4B=160 亿字节,大约需要16GB 16GB / 32 = 0.5GB

40 亿/8 字节=5亿字节,大约0.5GB的数组就可以存下40亿个 

如果数据量很大,采用位方式(俗称位图)存储数据是常用的思路,那位图如何存储元素的呢? 我们可以使用 bit map 的方式来表示数出现的情况。具体地说,是申请一个长度为 4 294 967 295 的 bit 类型的数组 bitArr (就是boolean类型),bitArr 上的每个位置只可以表示0或1 状态。8个bit 为 1B,所以长度为 4 294 967 295 的 bit 类型的数组占用 500MB 空间,这就满足题目给定的要求了。

那怎么使用这个 bitArr 数组呢? 就是遍历这 40 亿个无符号数,遇到所有的数时,就把 bitArr 相应位置的值设置为 1。例如,遇到 1000,就把bitArr[1000]设置为 1。

遍历完成后,再依次遍历 bitArr,看看哪个位置上的值没被设置为 1,这个数就不在 40 亿个数中。例如,发现 bitArr[8001]==0,那么 8001 就是没出现过的数,遍历完 bitArr 之后,所有没出现的数就都找出来

位存储的核心是: 我们存储的并不是这40亿个数据本身,而是其对应的位置。这一点明白的话,整个问题就迎刃而解了。

40 亿个非负整数中找到出现两次的数

题目要求:32 位无符号整数的范围是 0~4 294 967 295,现在有 40 亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数。

本题可以看做第一题的进阶问题,这里将出现次数限制在了两次

首先,可以用 bit map 的方式来表示数出现的情况。具体地说,是申请一个长度为4 294 967 295x2 的bit 类型的数组bitArr,用 2 个位置表示一个数出现的词频,1B 占用 8 个bit,所以长度为 4 294 967295x2 的 bit 类型的数组占用 1GB 空间。怎么使用这 bitArr 数组呢? 遍历这 40 亿个无符号数,如果初次遇到 num,就把bitArr[num*2 + 1]和 bitArr[num*2]设置为 01,如果第二次遇到 num,就把bitArr[num*2+1]和bitArr[num*2]设置为 10,如果第=次遇到 num,就把bitArr[num*2+1]和bitArrInum*21设置为11。以后再遇到 num,发现此时 bitArrInum*2+11和 bitArrInum*2]已经被设置为11,就不再做任何设置。遍历完成后,再依次遍历 bitArr,如果发现bitArr[i*2+1]和bitArrli*2]设置为10,那么 i就是出现了两次的数。


这期就到这里 , 下期见!

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
头歌(K-means)聚类算法是一种常用的无监督机器学习方法,用于将数据集划分为多个具有相似特征的簇。在K-means的第一步,也就是加载数据,你需要按照以下步骤操作: 1. **数据准备**:首先,你需要确保你有一个包含数值特征的数据集。这些特征可以是连续的,如身高、体重等,或者是离散的,如年龄组别、颜色编码等。数据可以存储在CSV、Excel、数据库或其他适合处理的文件格式中。 2. **数据导入**:使用合适的编程语言和库,如Python的Pandas库,读取数据。例如: ```python import pandas as pd data = pd.read_csv('your_data.csv') # 替换为你的数据文件路径 ``` 3. **数据预处理**:对数据进行清洗,处理缺失值、异常值或标准化/归一化数值特征,使其适合K-means算法的要求。 4. **选择特征**:如果数据包含大量特征,可能需要选择影响聚类效果的键特征。可以使用相性分析或降维技术(如PCA)来确定。 5. **创建数据矩阵**:将数据转化为数值型矩阵,方便算法处理。如果数据已经是数组形式,可以直接使用。 6. **定义参数**:设置K-means的参数,如簇的数量(k)、迭代次数、初始化簇中心的方法(如随机或K-means++)等。 完成这些步骤后,你就为K-means算法做好了数据加载和预处理的准备,可以进入算法的实际运行阶段了。接下来,你可能会进行数据划分到初始簇、迭代更新簇中心以及评估结果等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值