Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Arrays Ruby中的数组元素求和_Arrays_Ruby - Fatal编程技术网

Arrays Ruby中的数组元素求和

Arrays Ruby中的数组元素求和,arrays,ruby,Arrays,Ruby,Coderbyte中的一个练习旨在确定数组中的某些整数子集是否与数组中的最大数相加 下面的代码似乎在我的计算机上运行,但当我在线提交它时,它似乎会导致一个无休止的循环。(无论传递的参数是什么,都不会有任何输出) 你知道为什么会这样吗?上面的代码是有效的ruby代码 结果是“正确的” 这可能有点不寻常,因为虽然循环很少出现,但因为它是有效的ruby代码,所以它也应该在远程站点上工作 联系在Coderbyte运行在线ruby解释器的人-他们的版本似乎与MRI ruby不兼容 你的代码似乎在倒计时;请

Coderbyte中的一个练习旨在确定数组中的某些整数子集是否与数组中的最大数相加

下面的代码似乎在我的计算机上运行,但当我在线提交它时,它似乎会导致一个无休止的循环。(无论传递的参数是什么,都不会有任何输出)


你知道为什么会这样吗?

上面的代码是有效的ruby代码

结果是“正确的”

这可能有点不寻常,因为虽然循环很少出现,但因为它是有效的ruby代码,所以它也应该在远程站点上工作

联系在Coderbyte运行在线ruby解释器的人-他们的版本似乎与MRI ruby不兼容


你的代码似乎在倒计时;请看一看10.downto(1)-根据需要替换为变量。

我怀疑您实际上并没有陷入一个无止境的循环,而只是花了很长的时间,因为您的算法效率低下

def ArrayAdditionI(arr)
  arr_size         = arr.size
  ary              = arr.sort
  largest          = ary.pop
  ary_size         = arr_size - 1
  combination_size = ary_size
  result           = false

  while combination_size > 1
    ary.combination(combination_size) {|combination| 
      result |= (combination.inject( 
        :+
      ) == largest)
    }
    combination_size -= 1
  end
  result.to_s
end
我引入了一个新变量,并重命名了其他一些变量,以便更容易讨论算法。我还重新格式化了它,使三个嵌套的“循环”更加明显

让我们看一下算法

def ArrayAdditionI(arr)
  arr_size         = arr.size
  ary              = arr.sort
  largest          = ary.pop
  ary_size         = arr_size - 1
  combination_size = ary_size
  result           = false

  while combination_size > 1
    ary.combination(combination_size) {|combination| 
      result |= (combination.inject( 
        :+
      ) == largest)
    }
    combination_size -= 1
  end
  result.to_s
end
外部
while
循环执行
ary\u size-1==arr\u size-2
次,其中
combination\u size
的范围为
2
ary\u size==arr\u size-1

组合
“循环”执行的次数是
ary\u size
组合大小
次,这是一个快速增长的数字

最里面的“循环”(由
composition.inject执行的操作)执行
composition\u size-1次

这将给出以下最内部操作的总执行计数:

  • 2
    arr\u size-1
    的总和
  • arr\u size-1
    选择
    combination\u size
    时间
  • 组合尺寸-1
在Wolfram语言中,也就是Wolfram Alpha告诉我们的是
2^(a-2)(a-3)+1
,在O(2^n)中

稍微玩弄一下数字:

  • 对于10项,我们执行了1793次
    inject
    操作
  • 对于15个项目,我们已经有98个 305
  • 对于20个项目,我们有4个 456 449
  • 在28项中,我们跨越了10亿项业务的门槛:1 677 721 601
  • 对于1000个项目,我怀疑CoderBytes可能使用的输入大小是合理的,我们有2个 670 735 203 411 771 297 463 949 434 782 054 512 824 301 493 176 042 516 553 547 843 013 099 994 928 903 285 314 296 959 198 121 926 383 029 722 247 001 218 461 778 959 624 588 092 753 669 155 960 493 619 769 880 691 017 874 939 573 116 202 845 311 796 007 113 080 079 901 646 833 889 657 798 860 899 142 814 122 011 828 559 707 931 456 870 722 063 370 635 289 362 135 539 416 628 419 173 512 766 291 969次行动。哎呀
使用长度为5、10、15(所有瞬时)、20(明显的停顿)和23、24、25的数组尝试您的算法,以了解运行时的增长速度

假设您可以构建一个CPU,它可以在一条指令中执行内部循环。进一步假设一条指令只需要一个普朗克时间单位(即CPU的频率约为20 000 000 000 000 000 000 000 000 000 000 太赫兹)。进一步假设可观测宇宙中的每一个粒子都是这样一个CPU。对于一个不到500项的数组,执行您的算法仍然需要比当前宇宙时代更多的时间

请注意,对于大多数编程难题,它们实际上不是编程难题,而是数学难题。它们通常需要数学洞察力,以便能够有效地解决它们。或者,在这种情况下,认识到它是NP完全的

顺便说一句,就风格而言,这里是您的算法(略有变化)以惯用的Ruby风格编写的。正如您所看到的,在惯用Ruby中,它几乎变成了英语问题语句到代码的1:1翻译

虽然它的效率与您的算法一样低,但只要答案为
true
(与您的算法不同,它将继续运行,即使它已经找到了解决方案)。(
any?
将自动为您执行此操作。)

这是对(不清楚的)问题陈述的另一种解释:

def ArrayAdditionI(arr)
  2.upto(arr.size).any? {|combination_size|
    arr.combination(combination_size).any? {|combination|
      combination.inject(:+) == arr.max
    }
  }.to_s
end

关于您在何处提交的详细信息,请访问Coderbyte.com。问题描述如下:“让函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true,否则返回字符串false。例如:如果arr包含[4、6、23、10、1、3]输出应该返回true,因为4+6+10+3=23。数组不会为空,不会包含所有相同的元素,并且可能包含负数。“您的代码错误地为
[0,0,5]
返回
,例如,@sawa或just
[5]
@sawa:我明白您的意思,但我的问题是,不管传入的参数是什么,解释器都不会返回true或false(或其他任何内容)。谢谢你的提示。我将while循环更改为:“size.down为(2){n}a.composition(n){c}result}=(c.inject{r,a{r+a}==lgst}”。在irb中仍然有效,但在Coderbyte的解释器中不起作用。我看看能不能和那边的人联系上。嗯。。。我将循环更改为:“size.down到(2){n}a.composition(n){c}result}=(c.inject:+)=
def ArrayAdditionI(arr)
  2.upto(arr.size).any? {|combination_size|
    arr.combination(combination_size).any? {|combination|
      combination.inject(:+) == arr.max
    }
  }.to_s
end