【分分一分快三倍投】一个从四秒到10毫秒 花了1年的算法问题?

  • 时间:
  • 浏览:0
  • 来源:大发快三app-大发快三官网

有点痛 注意:本文分分一分快三倍投的算法大问题对全都专业计算机的人来说,很简单,之后注意看文章的人物背景。

五一后的第一周,可能性搬家腰扭伤了,没注意原应着压迫神经,躺在床上休息了好几分分一分快三倍投天。全都没事就挂 QQ,另另另几次 女男友见面另几次劲问了我另另另几次 算法大问题。全都了这篇文章。感触太深了,全都特发此文,以纪念和写给新亲戚.我.我.我 ,以及哪此热爱编程的非专业人事。买车人可能性技术含量很低,但都很真实。嘴笨 我只花了很少的时间,但处置了你是什么 女男友见面困惑了1年的大问题,你是什么 女男友见面倒是有点痛 感激,而我倒是感觉有点痛 心塞。那亲戚亲戚.我.我.我 喝杯茶,看看你是什么 过程吧。

1.人物背景

你是什么 女男友见面我也是之后聊天才了解到他的状态。他是另另另几次 1977年出生的湖北女男友见面,为了分析相关数据,学精了VB.NE分分一分快三倍投t,你是什么 年龄的人还学了你是什么 ,真的不容易,然还可否 用VB.NET开发比较冗杂的数据分析界面。嘴笨 之后了解到哪此,自愧不如啊。全都对算法大问题,你是什么 亲戚.我.我.我 遇到困难,还会能理解。

嘴笨 你是什么 亲戚.我.我.我 很早全都的QQ好友,也知道全是做数据分析,所有我有新的算法方面的文章会发给他看,偶尔聊一下,但只能问过我大问题。上个月发表了一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍,发表之后,他看到后,才问我你是什么 大问题。

我:嘴笨 我也是个半吊子,对算法全都精通,全都业余研究感兴趣而已。。说实话之后你我写个二分搜索,我一时半会还搞不定,但我看看论文和资料,不能写个马尔可夫链可能性贝叶斯例如 的。。。你是什么 东西怎样会会说呢,在全都大问题中,空间数率和时间数率,有点痛 是在硬件条件只能富裕的状态下,不能考虑得更少全都。。当然这里绝对全是说算法是只能用的,全都对全都非常普通的人来说,研究的规模太小,之后可能性经验和特殊原应着,只能算法和数据特征基础,只能不考虑了,以处置实际大问题为主吧。

2.原始大问题

该女男友见面的原始大问题是曾经的,我从QQ聊天记录里直接Copy过来:

有两组随机生成的(0~99999)Int分分一分快三倍投32数据A和B,将A按顺序判断在B中算不算居于并记录在Boolean型的C中,我分别尝试了Array与List(Of T),在VS2010下以我的破电脑的数率Array合适需用4秒,而List(Of T)则要24秒,以下是我用Array和List(of T)的代码,请高手指点, 顺便问下算不算秒杀的最好的土办法。(注:他的VB代码之后你不分分一分快三倍投贴了,思路知道就不能了)

之后你看看用哪此最好的土办法处置,谢谢

这么 人说用哈希,可惜我还会,也没百度到

他的开发环境是VS2010 + VB.NET

我收到他的消息的之后是正在用手机QQ上的,他还贴了段VB的代码,我是比较反感直接贴代码的人。不过当时躺在床上,也没啥事,好奇嘛,就仔细看到一下你是什么 大问题,代码真的没看。

3.处置大问题的过程

可能性是手机上的,全都也没开电脑敲代码。就想了一下。

女男友见面的原始代码中的比较全是使用Array.IndexOf,不能想象5万的数组,数率慢也正常 。

1.首先我是把哈希给否定了的。嘴笨 之后想起来,是我错了,我以为我说的哈希是把每个元素求哈希值后对比,这全是多此一举么。。曾经计算哈希就要时间,还是要比较。。。那何必 呢。。。之后我才想到,我说的可能性是“哈希表”,这是后话,不提了,哈希表你是什么 最好的土办法怎样会会样告诉我,应该也还不能吧;但还是先看看我的最好的土办法。

2.我.我.我 当时先给了他另另另几次 初步的方案,处置大问题有之后全是一步到位的,先试试看咯。我的想法是使用IndexOf查找会浪费全都时间。全都,你先把B排序,可能性B在实际构造过程中就不能进行排序存储,之后A依次对比的之后,采用二分法搜索,甚至有条件,A还会能先排序,之后搜索的之后记录起点,二分法搜索,曾经不能节省不少时间。A和B排序的大问题,嘴笨 根据他的状态,是不能在实际过程中就排序好的,而全是生成后排序,曾经就更费时间了。

你是什么 女男友见面也很好快,过了合适另另另几次 小时,测试出来说:“我用的随机数测试了下,数率提升相当明显,比Array.indexof要快多了”

3.里边手机沟通不方便,也就随便说了一下,没想到他变慢做出来了。嘴笨 快了全都,但具体时间我也没问。之后我洗澡的之后,感觉你是什么 大问题全是只能回事,我之后貌似也做过例如 的,应该还有变慢的最好的土办法。之后洗澡过程中,思考了若干秒。。。另另另几次 思路全是了,嘴笨 你是什么 想法我感觉很土,但之后你实际效果应该很好,全都洗完澡,马上开电脑,跟女男友见面说了一下思路,考虑到他有可能性无法理解算法的伪代码可能性比较严格的表述(实际上告诉我该怎样会会严格表述),全都就直接打了另另另几次 比方,在这里为了方便亲戚亲戚.我.我.我 理解,我先合适写了个思路,应该会看得懂吧。至于大问题中的记录在C中,我具体没问他怎样会会记录,嘴笨 这和大问题关系不大,核心在前面怎样选取算不算包括:

我给那位女男友见面是只能借喻的(原始有点痛 乱,我写博客的之后稍微埋点了下),告诉我亲戚亲戚.我.我.我 有只能歧义,感觉还是里边的伪代码容易理解,之后开心的是,你是什么 女男友见面还是理解了 :

A数组:不管,随意,全都用排序,
B数组:[5,2,4,1],假设最大为5,注意只能3
 
初始化另另另几次

长度为5(最大数)的布尔数组:a[1],[2],[3],[4],[5]
循环B,将B中值作为a的下标,对应位置标记为true,例如

a[5]= true;
a[2]= true;
a[4]= true;
a[1]= true;
注意a[3]只能,为false
 
最后循环A,直接对比下标,可能性A={2,3},只能:
a[2]=true,说明居于,则C[2]=true,到C中标记true
a[3]=false,则只能。C中标记为false
可能性你最大为99999,只能你是什么

数组要只能长之后你直接设置为99999,浪费全都空间;
可能性你业务中不能直接求出最大值,那是最好的了。买车人试一试。

你是什么 思路理解了非常简单。你是什么 女男友见面也变慢理解了,过了一会就把他的结果告诉我了。

下降到10毫秒左右,他把数据扩大到5万,数率也挺快的。

4.后记与C#实现

处置他的大问题后,第十天亲戚亲戚.我.我.我 又聊了一会,他表示很感谢,说你是什么 最好的土办法数率非常快。说这1年来,他问过全都人,也找过全都计算机方面的人,但效果全是好。。。

据说还问过另另另几次 拿过哪此微软认证的人。。。说他的电脑不行,要去换一下。。。你是什么 有点痛 过份操蛋了。。才几万的数组,能耗几次内存,全是简单的比较计算,需用很好的CPU么。。。

之后我也给他分析过说,买车人可能性只能完整理解你的大问题,都根小筋考虑数率和数率的大问题了,全都考虑的东西多了,之后你的建议全都一定合适。对哪此小大问题,牺牲全都空间,何况又这么 来越多,之后内存也便宜,现在动不动2G,4G。。换时间也是够划算的。我这里说的空间,是直接初始化数组C的长度包括所有的数字个数,可能性我全都了解他实际的数据怎样会会来的,当然可能性能计算最大值,肯定最好了。曾经稍微计算一下时间冗杂度,循环2遍就能处置大问题。至于我第一次提到的排序和二分法的大问题,也全都之后之后现在现在开始想到的,只能更深入的思考,可能性也是考虑到他的数据是不能在生成的之后就进行排序的,曾经还会能省时间,而全是所有的都IndexOf,不慢才怪。

4.1 C#代码实现原始最好的土办法

闲的没事,我用C#实现了一下女男友见面原始的最好的土办法,代码如下:

static void ValidateArrayElement2()
{
    Stopwatch sp = new Stopwatch();
    sp.Start();
//之后现在现在开始英文计时
    Random rand = new Random();
    Int32 maxValue = 1300000;
//元素最大值,是另另另几次

假定值
    Int32 length = 70000;
// A,B的长度
    Int32[] A = new Int32[length];
    Int32[] B = new Int32[length];
    Boolean[] C = new Boolean[length];
    
//随机初始化A,B数组
    for (int i = 0; i < length; i++)
    {
        A[i] = rand.Next(maxValue);
        B[i] = rand.Next(maxValue);
    }
    
//循环A,验证算不算居于,将C对应位置标记为true
    for (int i = 0; i < A.Length; i++) if (B.Contains(A[i])) C[i] = true;
    sp.Stop();
    Console.WriteLine(sp.ElapsedMilliseconds);
}

测试了下,我机器是X3000+T9300,3G内存。加进数据初始化总共时间是4.3秒,全都实际的时间是4秒左右,和女男友见面的结论是差这么 来越多的。看看我下面的最好的土办法:

4.2 C#代码实现上述算法

使用第3节提出的最好的土办法,我测试一下时间:

static void ValidateArrayElement()
{
    Stopwatch sp = new Stopwatch();
    sp.Start();
    Random rand = new Random();
    Int32 maxValue = 1300000;
//元素最大值,是另另另几次

假定值
    Int32 length = 70000;
// A,B的长度
    Int32[] A = new Int32[length];
    Int32[] B = new Int32[length];
    Boolean[] C = new Boolean[length];
    Boolean[] Atemp = new Boolean[maxValue];
//临时的辅助变量
    
//随机初始化A,B数组
    for (int i = 0; i < length; i++)
    {
        A[i] = rand.Next(maxValue);
        B[i] = rand.Next(maxValue);
    }          
    
//循环B,验证元素算不算居于
    foreach (var item in B) Atemp[item] = true;
    
//循环A,验证算不算居于,将C对应位置标记为true
    for (int i = 0; i < A.Length; i++) if (Atemp[A[i]]) C[i] = true;
    sp.Stop();
//停止计时
    Console.WriteLine(sp.ElapsedMilliseconds);
}

实际时间只能5ms左右,可能性不算数据初始化的时间,基本只能1ms,和女男友见面的10ms有点痛 差别,可能性和机器有关吧。总的来说,数率的确是提高了不少。

至于所谓的哈希表最好的土办法,这里就不实现了,可能性够快了。

最后感谢哪此和我一样,热爱编程的业余人事。。。嘴笨 亲戚亲戚.我.我.我 全是正规军,嘴笨 亲戚亲戚.我.我.我 只能学过数据特征,也只能系统学习过专业的算法课程,只能接受过专业的编程培训,但可是我细心和动脑筋,处置全都小规模的大问题,还是不能的。至于哪此多量数据的数率大问题,算法大问题就交给大牛吧。

剩下的时间交给女男友见面,你是什么 大问题简单吗?之后你怎样会会处置?期待评论有更好更佳的答案。。。可能性是喷,说大问题简单那就算了吧,没必要,何苦为难我呢。。。

4.3 HashSet测试

感谢passer.net女男友见面,说用HashSet,你是什么 类之后知道,但很少用,既然提出来了,就测试一下,代码如下:

Stopwatch sp = new Stopwatch();
sp.Start();
Random rand = new Random();
Int32 length = 70000;
// A,B的长度
Int32[] A = new Int32[length];
Int32[] B = new Int32[length];
Boolean[] C = new Boolean[length];
var tmp = new HashSet<int>();
//随机初始化A,B数组
for (int i = 0; i < length; i++)
{
    A[i] = rand.Next();
    B[i] = rand.Next();
    if (!tmp.Contains(B[i]))
        tmp.Add(B[i]);
}
 
//循环A,验证算不算居于,将C对应位置标记为true
for (int i = 0; i < A.Length; i++) C[i] = tmp.Contains(A[i]);
sp.Stop();
//停止计时
Console.WriteLine(sp.ElapsedMilliseconds);

测试了一下,合适17ms,比文章的最好的土办法稍微慢了全都,但也非常快了,在另另另几次 数量级水平吧。可能性哈希表对全都冗杂的例如 数据可能性大数据量更管用。不过无所谓了,全是最好的土办法,都能处置大问题,何必 纠结哪此细节。