一个从四秒到10毫秒 花了1年的算法问题?

  • 时间:
  • 浏览:0
  • 来源:大发快三_快三最新版_大发快三最新版

有点硬注意:本文的算法疑问图片对什么都专业计算机的人来说,很简单,而且 注意看文章的人物背景。

五一后的第一周,不可能 搬家腰扭伤了,没注意由于压迫神经,躺在床上休息了好几天。什么都没事就挂 QQ,一个多 网友视频见面一个劲问了我一个多 算法疑问图片。什么都了这篇文章。感触越深,什么都特发此文,以纪念和写给新给我们都都都,以及那此热爱编程的非专业人事。被委托人不可能 技术含量很低,但都很真实。确实我只花了很少的时间,但防止了某些网友视频见面困惑了1年的疑问图片,某些网友视频见面倒是有点硬感激,而我倒是感觉有点硬心塞。那给我们都都都喝杯茶,看看某些过程吧。

1.人物背景

某些网友视频见面我也是之后 聊天才了解到他的请况。他是一个多 1977年出生的湖北网友视频见面,为了分析相关数据,自学了VB.NET,某些年龄的人还学了某些,真的不容易,而且 利于用VB.NET开发比较多样化的数据分析界面。确实之后 了解到那此,自愧不如啊。什么都对算法疑问图片,某些给我们都都都遇到困难,也可不还要理解。

确实某些给我们都都都很早却说 我的QQ好友,也知道都是做数据分析,所有我有新的算法方面的文章会发给他看,偶尔聊一下,但这么问过我疑问图片。上个月发表了一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍,发表之后 ,他看之后 ,才问我某些疑问图片。

我:确实我也是个半吊子,对算法却说 精通,却说 业余研究感兴趣而已。。说实话我想 我写个二分搜索,我一时半会还搞不定,但我看看论文和资料,可不还要写个马尔可夫链不可能 贝叶斯类事的。。。某些东西怎么会会说呢,在什么都疑问图片中,空间传输速率和时间传输速率,有点硬是在硬件条件这么富裕的请况下,可不还要考虑得更少某些。。当然这里绝对都是说算法是这么用的,却说 对什么都非常普通的人来说,研究的规模太小,而且 不可能 经验和特殊由于,这么算法和数据特性基础,利于不考虑了,以防止实际疑问图片为主吧。

2.原始疑问图片

该网友视频见面的原始疑问图片是那我的,我从QQ聊天记录里直接Copy过来:

有两组随机生成的(0~99999)Int32数据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,可不还要想象30万的数组,传输速率慢也正常 。

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毫秒左右,他把数据扩大到30万,传输速率也挺快的。

4.后记与C#实现

防止他的疑问图片后,第7天 给我们都都都又聊了一会,他表示很感谢,说某些依据传输速率非常快。说这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 = 150000;
//元素最大值,是一个多

假定值
    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);
}

测试了下,我机器是X500+T9500,3G内存。去掉 数据初始化总共时间是4.3秒,什么都实际的时间是4秒左右,和网友视频见面的结论是差越深的。看看我下面的依据:

4.2 C#代码实现上述算法

使用第3节提出的依据,我测试一下时间:

static void ValidateArrayElement()
{
    Stopwatch sp = new Stopwatch();
    sp.Start();
    Random rand = new Random();
    Int32 maxValue = 150000;
//元素最大值,是一个多

假定值
    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,比文章的依据稍微慢了某些,但也非常快了,在一个多 数量级水平吧。不可能 哈希表对某些多样化的类事数据不可能 大数据量更管用。不过无所谓了,都是依据,都能防止疑问图片,暂且纠结那此细节。