Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Google Code Jam 2010大型数据集提交时间过长_Ruby - Fatal编程技术网

Ruby Google Code Jam 2010大型数据集提交时间过长

Ruby Google Code Jam 2010大型数据集提交时间过长,ruby,Ruby,我参加了2010年的代码阻塞,解决了小数据集的两个问题,但我甚至没有在8分钟的时间范围内解决大数据集的问题 我想知道是否有人已经解决了这个大数据集: 你用的是什么硬件 你用的是什么语言 为了尽可能快地运行代码,您在代码上采用了哪些性能调优技术 我正在用Ruby编写解决方案,Ruby不是我的日常语言,并在我的MacBookPro上执行它们 我对问题A和问题C的解决方案位于github上 如果您有任何建议,我将不胜感激 我在大学里有很多C++的经验,我的主要语言是PHP,我的“沙箱”语言是露比。p>

我参加了2010年的代码阻塞,解决了小数据集的两个问题,但我甚至没有在8分钟的时间范围内解决大数据集的问题

我想知道是否有人已经解决了这个大数据集:

  • 你用的是什么硬件
  • 你用的是什么语言
  • 为了尽可能快地运行代码,您在代码上采用了哪些性能调优技术
  • 我正在用Ruby编写解决方案,Ruby不是我的日常语言,并在我的MacBookPro上执行它们

    我对问题A和问题C的解决方案位于github上

    如果您有任何建议,我将不胜感激

    我在大学里有很多C++的经验,我的主要语言是PHP,我的“沙箱”语言是露比。p>
    我只是有点雄心勃勃,在Ruby中尝试了一下,不知道语言在性能上的挣扎,或者是否有人认为我无法及时完成大数据集提交的原因有什么问题。

    通常,小数据集设计为使用简单算法解决,但大数据集需要一些聪明的想法来减少计算所需的时间。如果你有正确的算法,语言应该不会是一个大问题。

    我犯了同样的错误。我用Python编写,由于Python的解释性,它天生比其他语言慢。我试着用ShedSkin编译它到C++代码,但是我的算法仍然太慢。 我对笛鲷鱼链的解决方案只是“表演”了这个场景。伪代码:

    set first snapper to powered and off // because it is always powered
    set all other snappers to unpowered and off
    repeat K times:
       for each snapper in chain: // process changes in on-off-ness
          if powered and on:
             turn off
          elif powered and off:
             turn on
       for each snapper in chain: // process changes in powered-ness
          if not first snapper and previous snapper is powered and on:
             set to powered
          else:
             set to unpowered
    
    后来,我实现了一个基于(2^n)-1==一个具有n-1右对齐1的二进制数这一事实的解决方案,但到那时,我在大集合上的时间已经很长了


    编辑:在代码阻塞控制面板的竞赛分析页面中有一种更好的解决方案。

    因为您使用的是ruby,所以您必须找到最有效的算法。我还将尝试使用分析器来查找占用您大部分时间的点。有一些是可用的。一个开源选项是

    首先,查看您正在使用的算法,并尝试计算其复杂性。然后,研究一下您用来实现它的语言。众所周知,Ruby的速度比其他语言慢,它可能会产生影响,特别是当集合非常大且时间限制很短时


    看看这个网站。它在速度、性能和内存消耗方面比较了各种语言。

    要在GCJ中取得成功,您需要正确的算法。我还认为,如果允许有限的编码时间,用这种语言编写程序的速度比它的速度重要得多

    我在GCJ中使用了Python,没有一次语言速度让我“失望”。可以说Python比Ruby快2倍(perlang.benchmarks shootout);当我使用Psyco(JIT编译器模块)时,我得到了大约5倍的速度提升——但这只是小菜一碟,语言的选择只能带来线性速度提升。说10次,大呼

    另一方面,GCJ中的问题是在设计时考虑到的,较大的输入会导致所需的时间(或内存)大大增加。 以GCJ 2010-1C《制作棋盘》为例。为简单起见,假设使用方形板,则朴素实现的复杂性为O(n4)。快速而复杂的判断实现被描述为O(n2log(n2))。我的更简单的解决方案是O(n3),不幸的是,这一方案在回合结束后出现了。3次方与4次方之间的差异似乎不显著,但在大输入中,有512x512个表要处理,因此3个算法必须在

    naive   68,719,476,736
    mine       134,217,728
    judge's      4,718,592
    
    因此,我对该输入的实现将比judge的解决方案大约慢30倍,比原始代码快500倍。在我的老式桌面(1.2GHz Athlon)上,我的python代码运行大型输入的时间略低于4分钟。我可以推测,最佳解决方案将在10秒内运行——但谁在乎呢,只要你在8分钟内适应就行了

    另一方面,n**4算法运行大约需要500*4分钟=33小时。这是非常不可接受的,没有优化的编译器或时钟过多的CPU可能会把我们从困境中拯救出来

    当然,有些优化是可能的——只需添加psyco.full()就可以将我的运行时时间减少5倍到46秒。在我速度更快的笔记本电脑(2GHz双核)上运行代码,速度提高了3倍。这是“仅”的15倍-更不用说我们将速度提高了50倍-这仍然是10倍太慢,无法在大输入上使用“幼稚”算法


    因此,如果您的算法不好,那么就没有优化/编译器/硬件来帮助您。另一方面,如果你想到了最好的算法,你可以使用比我九年前的PC慢30倍的计算机,并且仍然可以使用python/ruby级别的脚本语言按时得到结果。顺便说一句,这是GCJ问题作者的主要目标——参赛者根据编程技能而不是编译器/硬件/网络连接来区分自己。

    语言不是问题,问题是算法本身,您必须获得另一种算法,而不是暴力技术,如动态规划或分而治之

    谢谢马克。我想我应该专注于一个问题,然后写一个更好的算法。我在MacBook上用Python3.0解决了这三个问题,使用了2GHz的Core2Duo。它们在大数据上花费的时间都不到一秒钟。感谢您在分析页面上提供有关解决方案的信息。我一定去看看。