`

给定包含4300000000个32位整数的顺序文件,如何找到一个出现失少两次的整数

 
阅读更多

给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数?

一、位向量法

思路:考虑两个条件

1. 所有的整数都存储在顺序文件中,因此,读取文件的次数将明显影响算法的效率

2. 顺序文件中包含的整数个数为4300000000,如果全部读取放在内存中的话,必须要考虑内存空间因素。

 

解决方案:

由上面的问题,我们想到了Bit-Map,可以申请537500000个char型数组,数组中每个位对应4300000000个整数中的一个数,刚开始时,都所有的位都置0,如果有存在相对应的数,那么对应的位就置一。

问题又出来了,如何才能表示至少包含两次的整数呢?

这是,我们发现,要表示至少包含两次的整数,仅用一位来表示是不够的。那么用两位呢?00表示没有数据,01表示存在一个,10表示存在两个,11表示存在两个以上。

 

我们需要申请大小为1075000000的char类型的数组,两位对应一个数。

初始时,所有位都置零,然后开始读取顺序文件,读到整数后,相应的位做相应的改变。

这样,我们便只需要一次操作,而且使用了最少的内存便解决这个问题啦。

二、二分查找法

搜索范围从所有的32位正整数开始(全部当成unsigned int,简化问题),即[0, 2^32),中间值即为2^31。然后遍历文件,如果小于2^31的整数个数大于N/2=2^31,则调整搜索范围为[0, 2^31],反之亦然;然后再对整个文件再遍历一遍,直到得到最后的结果。T(n) = T(n/2) + n,总体的复杂度为o(logn)

 

分享到:
评论

相关推荐

    1117 整数去重.cpp

    1117:整数去重 时间限制: 1000 ms 内存限制: 65536 KB ...输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。 【输入样例】 5 10 12 93 12 75 【输出样例】 10 12 93 75 【来源】 No

    c程序设计习题参考(谭浩强三版)习题参考解答

    5.7给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。 13 5.8企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;...

    leetcode2-Data-Structures-and-Algorithms:一些流行算法的CPP代码

    中的一个数字丢失,并且一个数字在数组中出现了两次。 找出这两个数字。 给定一个整数数组 nums,找出其总和最大的连续子数组(至少包含一个数字)并返回其总和。 给定一组区间,合并所有重叠的区间。 输入:区间 = ...

    在其他数都出现偶数次的数组中找到出现奇数次的数

    文章目录在其他数都出现偶数次的数组中找到出现奇数次的数整型数组中其他数都出现偶数次找到唯一出现奇数次的数题目算法思路相应代码整型数组中其他数都出现偶数次找到两个出现奇数次的数题目算法思路相应代码 ...

    javascript文档

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    微软JavaScript手册

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    JScript 语言参考

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    机器翻译(洛谷P1540) 问题描述,内存中有M个单元,每个单元能存储一个单词和意译

    机器翻译(洛谷P1540) ...第2行输入N个非负整数,按照文章的顺序,每个数(大小不超过 1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。 输出:一个整数,为软件需要查词典的次数.

    API之网络函数---整理网络函数及功能

    GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区 GetFullPathName 获取指定文件的完整路径名 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 ...

    世界500强面试题.pdf

    1.3.6. 在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b 52 1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci ...

    算法重的统计数字问题代码

    一、算法实现题:统计数字问题 ...二、解题思路:首先分离N的每一位,用SWITCH语句统计0,1,2,……,9的使用次数,用两个整型数组J[10],10],一个存放分离出来的每一位数字,一个统计0,1,2,……,9的使用次数。

    大数据面试题(2).docx

    1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中...

    lrucacheleetcode-leetcode-collection:leetcode-collection

    给定一个非空的整数数组,每个元素出现两次,除了一个。 找到那一个。 编写一个算法来确定数字n是否“快乐”。 快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,并重复该过程直到该...

    判断链表是否为回文链表leetcode-Leetcode:力码

    您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。 例子: 加两个数 给定两个表示两个非负整数的非空链表。 数字以相反的顺序存储,它们的每个节点都包含一个数字。 将两个数字相加并将其作为...

    C++程序设计练习(2) Online Judge

    问题描述 给定一个非负整数,将其按十进制各位倒置。 输入 输入数据有若干行。每行上有一个非负整数,对应一种情形。 输出 对于每一种情形,直接输出结果,换行。 10 判断同构数 问题描述 给定一个十进制正整数,...

    C 程序指导书及实践指导

    (1) 编写一个函数prime(n),返回给定整数n是否为素数。 (2) 编写一个主函数,输入一个整数,调用(1)中的函数,判断此整数是否为素数,并输出结果。 (3) 对于属于多函数程序,可以采用每个函数分别进行编辑、编译的...

    vb Script参考文档

    InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,...

    算法分析与设计习题集答案

    19、 设有n个正整数,编写一个算法将他们连接成一排,组成一个最大的多位整数。用贪心法求解本题。 20、 键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一...

    CodingChallenge:多重编码挑战和数学问题

    给定一个带符号的32位整数x,请返回x,其数字取反。 如果反转x会使值到符号的32位整数范围[-2 31,2月31日至1日]外面去,然后返回0。 解决方案: 通过了leetcode测试,但不是100%确定该解决方案实际上将允许整数...

    判断链表是否为回文链表leetcode-LeetCode-Solutions:手工和STL实现的LeetCode算法任务的解决方案

    您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。 解决方案: 给定两个表示两个非负整数的非空链表。 数字以相反的顺序存储,它们的每个节点都包含一个数字。 将两个数字相加并将其作为链表...

Global site tag (gtag.js) - Google Analytics