BAT面试题——海量整数,找出不重复整数

海量数据
海量数据时代,不是谁都可以一口闷。
海量

题目:在2.5亿个整数中,找出不重复的整数(注,内存不足以容纳这2.5亿个整数)。

构建测试数据

返回顶部

# 构建一个测试数据集:随机生成10000个(-20000, 20000)的整数,以字符串格式存入bigdata中
import random


for i in range(10000):
    with open('bigdata', 'a') as file:
        file.write(str(random.randint(-20000, 20000)) + '\n')

方法一(内存充足):用python字典结构:

返回顶部
在内存充足的情况下,使用python中的字典结构。
对2.5亿个数中的每一个数,出现一次,字典对应的值+1。
最后遍历字典,找出value为1的所有key。

int_dict = {}  # 整数字典,整数为key,次数为value
def dict_int():
    with open('bigdata') as file:
        for str_in in file:
            num = str_in.replace('\n', '')
            if num not in int_dict:  # 第一次出现
                int_dict[num] = 1
            else:
                int_dict[num] += 1

    with open('bigdata') as file:
        for str_in in file:
            num = str_in.replace('\n', '')
            if int_dict[num] == 1:  # 返回一个不重复整数的迭代器
                yield num

if __name__ == '__main__':
    unique_list = list(dict_int())
    print('不重复整数个数:', len(unique_list))
不重复整数个数: 7875

前10个不重复整数

print('前10个不重复整数:', unique_list[:10])
前10个不重复整数: [-3421, -1349, -6778, 16932, 14847, -1504, 15398, 12612, -8009, -1250]

方法二(内存不足):用bool数组:

返回顶部
初始化一个(2.5*10^8) * 2 bool数组,并且初始化为False,对于每一个整数。
使用两个bit,来表示它出现的次数:
0 0:出现0次
0 1:出现一次
1 1:出现多次

import numpy as np


mark =np.zeros((25*(10**7), 2), dtype=np.bool)

存放(2.5*10^8) * 2 bool数组,需要0.47 G 内存

print('(2.5*10^8) * 2 bool数组的大小:',round(mark.size/1024**3, 2), 'G内存')
(2.5*10^8) * 2 bool数组的大小: 0.47 G内存
def get_unique_int():
    with open('bigdata') as file:  # bigdata:原始的2.5亿个整数大文件
        for str_in in file:
            num = int(str_in)
            if mark[num][0] == False and mark[num][1] == False:  # 这个数第一次出现。赋值 0 1
                mark[num][0] = False
                mark[num][1] = True
            else:
                mark[num][0] = True                              # 出现了不止一次的数据,赋值 1 1
                mark[num][1] = True

    with open('bigdata') as file:
        for str_in in file:
            num = int(str_in)
            if mark[num][0] == False and mark[num][1] == True:  # 判断只出现一次,即值为 0 1
                yield num


if __name__ == '__main__':
    unique_list = list(get_unique_int())
    print('不重复整数个数:', len(unique_list))
不重复整数个数: 7875

前10个不重复整数

print('前10个不重复整数:', unique_list[:10])
前10个不重复整数: [-3421, -1349, -6778, 16932, 14847, -1504, 15398, 12612, -8009, -1250]

总结:

两种思路殊途同归,用字典结构可能存不下2.5亿个结果;用bool数组,只需要0.5 G 左右的内存。

欢迎关注,敬请点赞!
返回顶部

原创文章 43 获赞 14 访问量 2848

猜你喜欢

转载自blog.csdn.net/weixin_45221012/article/details/105582798