Arrays 循环查找与Ruby中原始数组具有相同位数的数组

Arrays 循环查找与Ruby中原始数组具有相同位数的数组,arrays,ruby,loops,Arrays,Ruby,Loops,给定一个初始数组,比如[1,2,13],我如何实现一种通过子数组数组循环的方法,所有子数组都与初始数组大小相同,例如,arr=[[2,13,1],[13,1,1],[13,2,2]],并找出是否至少一个子数组的值与初始数组中的值相同,在两个数组中,这些值的计数都是相同的 在上面的示例中[1,2,13]和[2,13,1]都有一个1、一个2和一个13,因此应该返回true。如果arr的第一个元素改为[2,1,1],则应返回false,因为arr的任何元素的元素计数都与初始数组中的元素计数相同。假设所

给定一个初始数组,比如[1,2,13],我如何实现一种通过子数组数组循环的方法,所有子数组都与初始数组大小相同,例如,arr=[[2,13,1],[13,1,1],[13,2,2]],并找出是否至少一个子数组的值与初始数组中的值相同,在两个数组中,这些值的计数都是相同的


在上面的示例中[1,2,13]和[2,13,1]都有一个1、一个2和一个13,因此应该返回true。如果arr的第一个元素改为[2,1,1],则应返回false,因为arr的任何元素的元素计数都与初始数组中的元素计数相同。

假设所有数组都已在内存中,只需执行以下操作:

sorted_initial_arr = [1, 2, 3].sort
arr_list = [[2, 3, 1], [3, 1, 1], [3, 2, 2]]

arr_list.any? { |arr| arr.sort == sorted_initial_arr }
在概念上:

# some function to do "unordered equality"
unordered_equality_to_inital_arr = ->(arr) { arr.sort == sorted_initial_arr }

# apply that function across the array of arrays
arr_list.any?(&unordered_equality_to_inital_arr)

无序的_equality _to _inital _arr组件可以通过几种方式实现,例如,使用您提到的排列,不同之处在于它们的执行方式。

假设所有数组都已在内存中,只需执行以下操作:

sorted_initial_arr = [1, 2, 3].sort
arr_list = [[2, 3, 1], [3, 1, 1], [3, 2, 2]]

arr_list.any? { |arr| arr.sort == sorted_initial_arr }
arr = [[2, 3, 1, 3], [3, 1, 1, 3], [3, 2, 2, 1]]
target = [1, 2, 3, 2].group_by(&:itself)
  #=> {1=>[1], 2=>[2, 2], 3=>[3]}

arr.any? { |a| a.group_by(&:itself) == target }
  #=> true
在概念上:

# some function to do "unordered equality"
unordered_equality_to_inital_arr = ->(arr) { arr.sort == sorted_initial_arr }

# apply that function across the array of arrays
arr_list.any?(&unordered_equality_to_inital_arr)
无序的_equality _to _inital _arr组件可以通过几种方式实现,例如,使用您提到的置换,不同之处在于它们的执行方式

arr = [[2, 3, 1, 3], [3, 1, 1, 3], [3, 2, 2, 1]]
target = [1, 2, 3, 2].group_by(&:itself)
  #=> {1=>[1], 2=>[2, 2], 3=>[3]}

arr.any? { |a| a.group_by(&:itself) == target }
  #=> true

对于arr的每个元素,使用作为单程计算的,比排序更有效。就计算复杂度而言,group_by几乎为On,散列查找几乎为O1,而quicksort位于日志n上,n是arr元素的大小

另一种方法是使用计数哈希:

这也是一个单程操作

以下可能更快,因为arr的每个元素与目标的比较在得出计数不匹配的结论后立即终止。比如说,如果像以前一样,

target
  #=> {1=>1, 2=>2, 3=>1}

只要检查a中的第二个1,就会得出结论,即不存在匹配项。计算如下

arr.any? do |a|
  t = target.dup
  a.each do |n|
    break false unless t.key?(n)
    t[n] > 1 ? (t[n] -= 1) : t.delete(n)
  end && t.empty?        
end
  #=> true

对于arr的每个元素,使用作为单程计算的,比排序更有效。就计算复杂度而言,group_by几乎为On,散列查找几乎为O1,而quicksort位于日志n上,n是arr元素的大小

另一种方法是使用计数哈希:

这也是一个单程操作

以下可能更快,因为arr的每个元素与目标的比较在得出计数不匹配的结论后立即终止。比如说,如果像以前一样,

target
  #=> {1=>1, 2=>2, 3=>1}

只要检查a中的第二个1,就会得出结论,即不存在匹配项。计算如下

arr.any? do |a|
  t = target.dup
  a.each do |n|
    break false unless t.key?(n)
    t[n] > 1 ? (t[n] -= 1) : t.delete(n)
  end && t.empty?        
end
  #=> true

是否要查找数组中每个元素的所有排列?如果是,提示:。您可以对这两个列表进行排序,然后检查排序后的列表是否相等。jeporcher,我相信您会同意我对您的问题进行的编辑。你接受了@Kache的回答,这让我相信我对这个问题的理解是正确的。为了避免犹豫,通常最好用实际的Ruby代码来表达你的问题:你有什么输入,你需要什么输出。这里的歧义是,如果您要比较的数组是生成的、派生的,或者是作为输入提供的。当你的问题措辞时,试着把它画成代码,例如def find_permutationsmatch,*列出几个演示调用,尽管没有实现,但会让你的意图更清楚。@tadman谢谢你的输入。将从现在开始记住它。是否要查找数组中每个元素的所有排列?如果是,提示:。您可以对这两个列表进行排序,然后检查排序后的列表是否相等。jeporcher,我相信您会同意我对您的问题进行的编辑。你接受了@Kache的回答,这让我相信我对这个问题的理解是正确的。为了避免犹豫,通常最好用实际的Ruby代码来表达你的问题:你有什么输入,你需要什么输出。这里的歧义是,如果您要比较的数组是生成的、派生的,或者是作为输入提供的。当你的问题措辞时,试着把它画成代码,例如def find_permutationsmatch,*列出几个演示调用,尽管没有实现,但会让你的意图更清楚。@tadman谢谢你的输入。从现在起,我们将牢记这一点。非常感谢您周到的回复。通过比较排序后的数组,我得到了理想的结果。非常感谢您周到的回复。通过比较排序的数组,我得到了理想的结果。非常好!非常感谢您的周到和透彻的回复。非常好!非常感谢您的周到和彻底的答复。