四十个亿个整数,快速判断是否存在

 class Program
    {
        static void Main(string[] args)
        {
            //10
            //524156
            //5465
            //4546
            //1234567891
            //999999999
            //4
            //8
            //82
            //54654
            //564465456
            uint number;
            number = Convert.ToUInt32(Console.ReadLine());
            for (uint i = 0; i < number; i++)
            {
                string temp = Console.ReadLine();
                Control.buildByte(temp);
            }

            while (true)
            {
                uint temp = Convert.ToUInt32(Console.ReadLine());
                if (Control.judgeExist(temp))
                {
                    Console.WriteLine("存在");
                }
                else
                {
                    Console.WriteLine("不存在");
                }
            }
        }
 class Control
    {
        public static byte[] data = new byte[FileContorl.LIMIT_MAX / 8 + 1];
        public static bool judgeExist(uint number)
        {
            uint index_data = number / 8;
            uint pos_wei = number % 8;
            byte positioning = data[index_data];
            string tempPositioning = Convert.ToString(positioning, 2);
            int len = tempPositioning.Length;
            if (tempPositioning.Length < 8)
            {
                for (int i = len; i < 8; i++)
                {
                    tempPositioning = ‘0‘ + tempPositioning;
                }
            }
            char[] positioningChar = tempPositioning.ToCharArray();
            if (positioningChar[pos_wei] == ‘1‘)
                return true;
            else
                return false;
        }

        public static void buildByte(string dataString)
        {
            uint temp = Convert.ToUInt32(dataString);
            uint index_data = temp / 8;
            uint pos_wei = temp % 8;
            byte positioning = data[index_data];
            char[] positioiningChar = byteToChar(positioning);
            positioiningChar[pos_wei] = ‘1‘;
            data[index_data] = CharToByte(positioiningChar);
        }

        public static char[] byteToChar(byte positioning)
        {
            string tempPositioning = Convert.ToString(positioning, 2);
            int len = tempPositioning.Length;
            if (len < 8)
            {
                for (int i = len; i < 8; i++)
                {
                    tempPositioning = ‘0‘ + tempPositioning;
                }
            }
            char[] positioningChar = tempPositioning.ToCharArray();
            return positioningChar;
        }

        public static byte CharToByte(char[] positioningChar)
        {
            byte temp;
            string result = "";
            for (int i = 0; i < positioningChar.Length; i++)
            {
                result += positioningChar[i];
            }
            temp = Convert.ToByte(result,2);
            return temp;
        }
    }

判读一个整数是否存在,其实就是0跟1的区别,用了位图法,用byte存储,一个byte一个字节,有八位,可以存储8个数字是否存在。

原文地址:https://www.cnblogs.com/zquan/p/9813865.html

时间: 2024-11-05 20:43:14

四十个亿个整数,快速判断是否存在的相关文章

布隆过滤器 - 如何在100个亿URL中快速判断某URL是否存在?

题目描述 一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节.这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中? 题目解析 这是一道经常在面试中出现的算法题.凭借着题目极其容易描述,电面的时候也出现过. 不考虑细节的话,此题就是一个简单的查找问题.对于查找问题而言,使用散列表来处理往往是一种效率比较高的方案. 但是,如果你在面试中回答使用散列表,接下来面试官肯定会问你:然后呢?如果你不能回答个所以然,面试官就会面无表情的通

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

vuex中filter的使用 &amp;&amp; 快速判断一个数是否在一个数组中

vue中filter的使用 computed: mapState({ items: state => state.items.filter(function (value, index, arr) { return index < 5 }) }), 如上所示,对于vuex,我们在使用mapState获取state时, 可以使用filter来过滤其中的元素,在filter的回调函数中接受三个参数,第一个是value,即每一个元素的值: 第二个是index, 即每一个元素所在的index, 第三个

快速判断二叉树先序遍历 后序遍历

一.知道二叉树的先序/后序遍历和中序遍历(中序必须要知道,不然无法判断),要快速判断后序/先序遍历,首先要了解二叉树的遍历规律 二.二叉树遍历规律 1.三种遍历都有一个规律,就是:逆时针沿着二叉树外缘移动,即方向相同,如下图1: 图1 2. 3.  不同的是他们出发点不同,下面说明他们的出发点和遍历顺序序列 三.二叉树三种遍历 1.先序遍历 先序遍历先从二叉树的根开始,然后到左子树,再到右子树,,如图2 图2 先序遍历序列是ABDCEF,重点是记住第一个字母“A”是根,出发点是根“A” 2.中序

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

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

输入一个整数,判断其是否是2^n,是就输出这个数,不是就输出和它最接近的为2^n的那个整数。

输入一个整数,判断其是否是2^n,若是,输出这 //个数,若不是,输出和它最接近的为2^n的那个整数. 附加源代码1: #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int input;//键盘输入一个整数input int i,j;//i,j待会儿存放input与左边和右边的为2^n的差值 int m,n;//保存左边,右边的与inout最接近的2^n printf("请

js快速判断IE浏览器(兼容IE10与IE11)

在很多时候,我们一般采用navigator.userAgent和正则表达来判断IE浏览器版本,下面介绍用IE浏览器中不同特性来判断IE浏览器   1 判断IE浏览器与非IE 浏览器 IE浏览器与非IE浏览器的区别是IE浏览器支持ActiveXObject,但是非IE浏览器不支持ActiveXObject.在IE11浏览器还没出现的时候我们判断IE和非IE经常是这么写的 ? 1 2 3 function isIe(){        return window.ActiveXObject ? tr

如何利用一些小工具快速判断电脑是否中毒

在这个网上支付流行的时代,人们最害怕的事情莫过于电脑病毒了.以前不装杀毒软件"裸奔"是一件再平常不过的事情.现在估计很少有人敢这么干了,生怕自己网银里的钱被别人神不知鬼不觉的偷走了.今天,我就写一篇新手小白文来告诉大家如何快速判断自己的电脑是否已经中毒. 在讨论如何判断电脑是否中毒之前,我们先来说一下病毒常见的一些的特征. 1. 计算器里运行的各种程序我们都可以找到相对应的进程.病毒的进程名通常会比较奇怪.比如一串奇怪的随机名,再比如伪装成一些系统进程名.举个栗子,svchost.ex

原来四万亿是这样的,市场的事情,政府的事情,

中国病了,病在经济发展模式不可持续,病在社会发展严重落后于经济发展,病在政府职能错位.而这些病灶都源于"政府'看得见的手'伸得太长,抢夺了本该由市场掌握的要素流动决定权".与此同时,我们在2012年年底迎来了锐意改革的新一任政府,并在一年后等到了"市场的归市场,政府的归政府"的施政纲领,而这正是著名经济学家郎咸平教授在过去几年一直强调和向政府谏言的. 面对当下中国的困顿与改变,以及对中国经济.社会发展一直秉承的审慎态度,我延续"以数据说话".&q