Ruby: Kruskal 算法 - ResultArray 操作

Ruby: Kruskal's Algorithm - ResultArray manipulation

我是 Ruby 的新手,我一直在玩 Kruskal 算法,但现在我遇到了一个问题,我不明白我需要做什么这个阶段。

我一直在处理的代码是这样的:

def partition(arr, clusters)
  edgeValues = []
  index1 = 0
  index2 = 1
  arr = arr.sort # [3, 4, 5, 5, 6, 10, 15, 20, 75, 80, 85]

  arr.length.times{
    val = (arr[index1]-arr[index2]).abs
    edgeValues << [ val, index1, index2]

    index1 += 1
    index2 += 1

    break if (arr.length == index2)
  }

  edgeValues = edgeValues.sort

  #p edgeValues[0][0] # value cost
  #p edgeValues[0][1] # index 1
  #p edgeValues[0][2] # index 2


end

array = [5, 4, 3, 5, 15, 20, 10, 80, 75, 6, 85] 
clusters = 3

partition( array, clusters ) #end result: [ [3, 4, 5, 5, 6], [10, 15, 20], [75, 80, 85] ]

除了最后一部分,我都做到了。

我不知道如何操作排序后的数组:

[3, 4, 5, 5, 6, 10, 15, 20, 75, 80, 85] 

为了达到最终结果:

[ [3, 4, 5, 5, 6], [10, 15, 20], [75, 80, 85] ]

我处理了所有的计算并将这些值存储在 edgeValues 数组中。

如有任何帮助,我们将不胜感激。

没听说过Kruskal's Algorithm 我查了一下,发现这是一种计算最小生成树的方法。 OP 希望在这里使用该算法,但未说明这样做的原因。也没有说明正在解决的潜在问题。我从示例中假设对象是将排序数组划分为给定数量的数组 ("clusters"),这样这些数组的大小最多相差一个,而较大的数组位于开头。如果是这样,有很多方法可以做到这一点——包括我下面的解决方案——不会将问题视为寻找最小生成树的问题之一。

def similar_size_clusters(array, nbr_clusters)
  sorted = array.sort
  smaller_size, nbr_larger = sorted.size.divmod(nbr_clusters)
  nbr_clusters.times.each_with_object([]) do |i,a|
    a << sorted.shift(i < nbr_larger ? smaller_size + 1 : smaller_size)
  end
end

array = [5, 4, 3, 5, 15, 20, 10, 80, 75, 6, 85] 
(1..array.size).each { |i| puts "clusters = #{i}: #{similar_size_clusters(array, i)}" }

clusters =  1: [[3, 4, 5, 5, 6, 10, 15, 20, 75, 80, 85]]
clusters =  2: [[3, 4, 5, 5, 6, 10], [15, 20, 75, 80, 85]]
clusters =  3: [[3, 4, 5, 5], [6, 10, 15, 20], [75, 80, 85]]
clusters =  4: [[3, 4, 5], [5, 6, 10], [15, 20, 75], [80, 85]]
clusters =  5: [[3, 4, 5], [5, 6], [10, 15], [20, 75], [80, 85]]
clusters =  6: [[3, 4], [5, 5], [6, 10], [15, 20], [75, 80], [85]]
clusters =  7: [[3, 4], [5, 5], [6, 10], [15, 20], [75], [80], [85]]
clusters =  8: [[3, 4], [5, 5], [6, 10], [15], [20], [75], [80], [85]]
clusters =  9: [[3, 4], [5, 5], [6], [10], [15], [20], [75], [80], [85]]
clusters = 10: [[3, 4], [5], [5], [6], [10], [15], [20], [75], [80], [85]]
clusters = 11: [[3], [4], [5], [5], [6], [10], [15], [20], [75], [80], [85]]