40亿个有序不同的数的文件中找一个缺失的数

编程珠玑第二题。。。

如果是用位图的话。。。

如果内存不够,那么就需要二分,注意思想就是先找到中间数mid,然后把文件以mid分为两个文件,肯定丢失的数在数目小的那个文件中,然后递归去那个小的文件中找就行了。

复杂度是o(2n)  n+n/2+n/4+n/8+.....

看了别人写了一个代码:

int split(int* a, int* b, int*c, int alen, int bit)
{
    int biter, citer, i;
    int v=0, re = 0, *t;

    while(bit--){
        v = (1 << bit);
        for(i=biter=citer=0; i < alen; i++) {
            if(a[i] & (1<<bit)) {
                b[biter++] = a[i];
            } else {
                c[citer++] = a[i];
            }
        }
        if(biter <= citer) {
            re += v;
            t = a;
            a = b;
            b = t;
            alen = biter;
        } else {
            t = c;
            c = a;
            a = t;
            alen = citer;
        }
    }
    return re;
}

  

时间: 2024-10-12 17:00:01

40亿个有序不同的数的文件中找一个缺失的数的相关文章

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

1061: 从三个数中找出最大的数Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][Web Board] Description 定义一个带参的宏(或者模板函数),从三个数中找出最大的数. Input 3个短整型数,空格隔开 3个实数,空格隔开 3个长整数,空格隔开 Output 最大的数,对于实数保留2位小数. Sample Input 1 2 3 1.5 4.7 3.2 123456

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

推断一组数的规律,并填充缺失的数

最近笔试中遇到这样一系列题型,即数列推理题:给出一组数,找出规律,并填充缺失的数.有些规律好找, 有些则需要动点脑子了.下面我是总结出的一些题及其解决方法. 1).  19.17.15.13.(11) 解析:这里填11,是比较简单的,可以看出来,是一个递减的等差数列,公差为-2. 2).  1/2.1/2.1/4 .1/12 .(1/48) 解析:第0项是:1/2: 第1项是:1/2*1/1,即前一项*1/1: 第2项是:1/2*1/2,即前一项*1/2: 第3项是:1/4*1/3,即前一项*1

统计代码文件中的实际有效行数,去掉空行、单行注释、多行注释

#coding=gbk import os #rootdir='f:\\pylianxi' def count_line_core(file_name): ##传入单个文件,统计行数,之后返回该文件的实际代码行数:区分utf-8.gbk有待优化 print('core_file_name:',file_name) lines_count=0 flag=True try: with open(file_name,'r',encoding='gbk') as fp: print('gbk file_

删除数组中某一个指定的数

javascript原生写法: Array.prototype.indexOf = function(val){ for(var i=0;i<this.length;i++){ if(this[i] == val){ return i } } return -1; } Array.prototype.remove = function(val){ var index = this.indexOf(val); if(index >-1){ rerurn this.splice(index,1);

【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?

这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如 [面试现场]如何判断一个数是否在40亿个整数中? [算法技巧]位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话. 20亿级别 面试官:如果我给你 2GB 的内存,并且给你 20 亿个 int 型整数,让你来找出次数出现最多的数,你会怎么做? 小秋:(嗯?怎么感觉和之前的那道判断一个数是否出现在这 40 亿个整数中有点一样?可是,如果还是采用 bitmap 算法的话,好像无法统计一个数出现的次数,只能判断一个数是

位运算 找出给定的数中其他数都是两个,有两个是一个的数

题目大意: 给定你n个数, 其中有n-2个数都是两两成对的,有两个是单独出现的,如n = 8, 2 3 2 5 3 6 4 6, 这时候4和5是单独的两个,所以答案就是4,5,其中n的范围是1e6. 思路: 之前做过找一个单独的数的题,那个题是用一个比较巧妙的方法来做的,不过这个也是一类经典问题,用到了强大的位运算,有了那个题的基础再来做这个题就简单了.(附:找一个的题目链接). 刚开始我是用了O(nlogn)的时间复杂度来做的,先排序,然后用类似找一个的方法找出第二个.我觉得对于1e6的数据量

6.3 40亿个非负整数中找到没出现的数

[题目]: 32位无符号整数的范围是0~4294967295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现过的数.可以使用最多1GB的内存,怎么找到所有没出现过的数 [进阶]: 内存限制为10MB,但是只用找到一个没出现过的数即可 原文地址:https://www.cnblogs.com/latup/p/9942103.html