给定包含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:整数去重 时间限制: 1000 ms 内存限制: 65536 KB ...输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。 【输入样例】 5 10 12 93 12 75 【输出样例】 10 12 93 75 【来源】 No
本文探讨的问题是“删数问题算法程序(排列成一个新的正整数)”,该问题要求从一个给定的正整数中删除指定数量的数字,使剩余数字按原有顺序排列形成的新数尽可能小。 **问题描述:** - 给定一个长度为 \( n \)(\...
根据给定文件的信息,我们可以提炼出以下相关的IT知识点: ### 1. 进制转换的基本概念 在计算机科学中,进制(或基数)是指数值系统中的基础计数单位的数量。常用的进制包括二进制(2进制)、八进制(8进制)、十...
在查找特定值的问题中,给定一个整数数组和一个待查找的值,需要在数组中搜索这个值,并输出它在数组中的位置索引(如果存在的话)。如果数组中没有找到该值,则输出“-1”。实现这一功能的程序中,使用了一个for...
给定一个整数数组`nums`和一个整数`target`,我们要找到数组中两个不重复的元素,它们的和等于`target`。返回这两个元素的索引,顺序不限。因为数组中元素不能重复出现,所以每个元素只能使用一次。 为了高效地解决...
根据给定的文件信息,我们可以总结出以下关键知识点: ### 1. 文件概述 该程序主要实现了从键盘输入一系列整数后,通过冒泡排序算法对这些整数进行排序,并进一步使用二分查找(也称为折半查找)来确定用户指定的...
3. **振兴中华**:这是一个关于路径规划的问题,要求从“从”字跳到“华”字,且路径上的字顺序正确。可以采用深度优先搜索或广度优先搜索的方法来解决,确保路径的合法性。 4. **幻方填空**:这是一道关于幻方的...
对于C语言的32位无符号整数,可以将其视为8个16进制位,每轮处理一个位,依次进行分配和收集,直到所有位处理完毕,完成排序。 - 哈希表用于存储数据,当出现冲突时,二次探测再散列是一种解决冲突的方法,即将...
顺序查找的代码实现通常是一个简单的循环,逐个比较元素,而折半查找则需要更复杂的逻辑,包括计算中间索引、判断目标值与中间元素的关系并相应地调整查找范围。在实际编程中,我们还会考虑到边界条件和错误处理,...
题目 "只出现一次的数字(分组+异或)1" 是 LeetCode 上的一个经典算法问题,要求在给定的整数数组 `nums` 中找出仅出现一次的两个元素。数组中其他元素均出现两次,返回这两个单次出现的元素,顺序不限。此题的关键...
具体来说,对于一个整数链表,其中每个节点的键值为一个不超过三位数的整数(形式为ABC,其中A代表百位数,B代表十位数,C代表个位数),我们需要通过三次分拆和链接操作来对链表进行排序。 - **第一次分拆和链接**...
"第k个最小整数"是一个常见的问题,特别是在排序和搜索算法中。在这个问题中,我们需要从给定的n个正整数中找出第k个最小的数字,其中相同大小的整数只计数一次。以下是对这个问题的三种不同实现方法及其时间复杂度...
中的一个数字丢失,并且一个数字在数组中出现了两次。 找出这两个数字。 给定一个整数数组 nums,找出其总和最大的连续子数组(至少包含一个数字)并返回其总和。 给定一组区间,合并所有重叠的区间。 输入:区间 = ...
在给定的问题中,我们需要对一个整数顺序表进行特殊排序,即把所有的奇数移到偶数的前面。这里我们使用C++编程语言来实现这个算法。首先,顺序表是一种数据结构,它将元素存储在连续的内存位置中,便于直接访问每个...
具体来说,我们需要设计一种算法,输入参数为一个正整数n,输出结果是0至9这十个数字各自出现的次数。每个页码都是以十进制形式表示,并且不包含任何前导零,即不会出现类似006这样的页码表示方式。 ### 解决方案一...
给定一个包含n个元素的多重集合S,每个元素在集合中出现的次数称为该元素的重数。多重集S中的众数是指重数最大的元素。例如,考虑集合S={1,2,2,2,3,5},在这个例子中,元素2的重数为3,是S的众数,因为没有其他...
- **目标**: 对一个包含10个整数的数组进行排序。 - **程序分析**: - 使用选择排序算法,每次循环找到当前未排序部分的最小值,并与第一个元素交换。 - 这种方法的时间复杂度较高,适合小型数组的排序。 #### ...
根据给定的文件信息,我们可以总结出以下相关的IT知识点: ### 1. C#语言基础 这段代码是用C#编写的。C#是一种面向对象的编程语言,它结合了各种现代编程语言的特点,旨在提高程序员的生产力。C#由微软开发,并且...
- **解析**: 设计一个两位数加法测验程序,要求能够记录用户的答题情况,并统计答对和答错的题目数量。涉及到循环结构的设计以及基本的错误处理机制。 **E31. 循环嵌套、穷举法** - **知识点**: 穷举法、循环结构。...
练习题 32 要求编写程序,从键盘上输入一个乘车里程数,计算出车费(车费以元为单位,四舍五入),并输出在屏幕上。这道题目与练习题 30、31 类似,但有所不同。 这些练习题涵盖了 C 语言的基本概念和编程技巧,为...