传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法

本文主要是介绍传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 using System;
using System.IO;
using System.Collections;


namespace bucketSort
{
   
class Program
    {
       
public const int maxCount = 25 * 1000 * 10000;//2.5亿不算大,还没超过整数范围呢
        public const string FileName = @"c:/test.txt";

       
public static void Main(string[] args)
        {

           
//写文件,用来实验的;写一遍就可以了;         
           
//writeFile();
           
//Console.ReadLine();
           
//return;

            FileStream  FileReader
= new FileStream(FileName, FileMode.Open);        

           
//循环读入全部正个整数,每次读1个整数,产生1个bit,读到结尾标记就不读了;

           
int index = 0;
           
//创建两个够长的BitArray    
           
//发现了.NET一个Bug,就是BitArray并不是可以按照int.MaxValue构造,所以限制了一下数字范围,期待微软能修改这个Bug。
           
//即使是在最大整数范围内,-2,147,483,648 到 2,147,483,647是4亿个Bit,1亿多字节, New这两个容器应该是2个100多M,在600M范围内。
           
//一个数组表示有没有这个数字

            BitArray CountorSingle
= new BitArray(250000000 + 1);

           
//第二个数组表示是否多次出现这个数字
            BitArray CountorMore = new BitArray(250000000 + 1);

           
//循环检测,复杂度是O(N)
            while (true)
            {
               
byte[] tempByte = new byte[4];
                index
+= FileReader.Read(tempByte, 0, 4);
               
int tempInt = System.BitConverter.ToInt32(tempByte, 0);

               
if (tempInt == -1)
                {
                   
break;
                }
               
else
                {
                   
if (CountorSingle.Get(tempInt))
                    {
                       
//出现多次,设置这个值,复杂度是O(1)
                        CountorMore.Set(tempInt, true);
                    }
                   
else
                    {
                       
////出现一次,设置这个值,复杂度是O(1)
                        CountorSingle.Set(tempInt, true);
                    }
                }
            }
            FileReader.Close();

           
//从CountorSingle中排除CountorMore,采用逻辑Xor运算,复杂度是O(n)          
           
//Xor运算如果两者值相同,为False,1,0=1 ; 0,1=1 ; 1,1=0 ; 0,0=0  前边已经排除了0,1的可能性。             
            CountorSingle = CountorSingle.Xor(CountorMore);//复杂度是O(n)           
           
//再读负数那个文件。
           
           
//关键时刻到来了
            int sum = 0;

           
//复杂度是O(n)
            foreach (bool isExists in CountorSingle)
            {
               
if (isExists)
                {
                    sum
++;
                }
            }

            Console.WriteLine(
"全部计算复杂度是O(n),结果是:" + sum);
            Console.ReadLine();
           
//几分钟后,看到屏幕上显示:全部计算复杂度是O(n),结果是:91836109


        }
       
public static long getIndex(int x)
        {
           
//int.MinValue的下标位于0,负整数n的下标是0-(long)int.MinValue;
           
//0的下标位于1-(long)int.MinValue,正整数n的下标是n+1-(long)int.MinValue;
            if (x >= 0)
            {
               
return (x + 1 - (long)int.MinValue) / 4;
            }
           
else
            {
               
return (0 - x) / 4;
            }
        }
       
public static void writeFile()
        {
           
//写文件,用来实验的;写一遍就可以了,正数和零写到正数文件里,负数写到负数文件里。
           
//写2个文件是因为.NET的BitArray类只有构造函数是int的,如果都写一起,那么就超出了处理范围。


            FileStream FileWriter
= new FileStream(FileName, FileMode.OpenOrCreate);

            System.Random rand
= new Random();
           
int i = 0;
           
for (; i < maxCount; i++)
            {
               
//写入2.5亿个整数,一个整数是4个Byte[],随机在250000000范围内;
               
//发现了.NET一个Bug,就是BitArray并不是可以按照int.MaxValue构造。
               
//所以就只好限制在250000000内了,先只考虑正数和0,
               
//负数可以另外改一下,放另外文件里计算。
                int tempInt = rand.Next(0, 250000000);
                FileWriter.Write(System.BitConverter.GetBytes(tempInt),
0, 4);

            }
           
//结尾写一个-1做标记。
            FileWriter.Write(System.BitConverter.GetBytes(-1), 0, 4);
            FileWriter.Close();
          
//靠,970多兆的文件。实验完赶紧删除。
            Console.WriteLine("写文件完毕!");
        }


    }
}



这篇关于传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742344

相关文章

捷瑞数字业绩波动性明显:关联交易不低,募资必要性遭质疑

《港湾商业观察》施子夫 5月22日,山东捷瑞数字科技股份有限公司(以下简称,捷瑞数字)及保荐机构国新证券披露第三轮问询的回复,继续推进北交所上市进程。 从2023年6月递表开始,监管层已下发三轮审核问询函,关注到捷瑞数字存在同业竞争、关联交易、募资合理性、期后业绩波动等焦点问题。公司的上市之路多少被阴影笼罩。​ 业绩波动遭问询 捷瑞数字成立于2000年,公司是一家以数字孪生驱动的工

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

二进制文件转化成文本文件

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~   1.区别 如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇) 如果一

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

百度OCR识别结构结构化处理视频

https://edu.csdn.net/course/detail/10506

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要