-1

我试图在不使用哈希的情况下找到一种模式,但现在不知道它是否可能,所以我想知道是否有人可以帮助我将我附近工作的数组代码转换为哈希模式以使其工作。

我已经看到了一个较短的解决方案,我将发布它,但我并不完全遵循它,我希望这个翻译能帮助我更好地理解哈希。

这是我的代码,附有我的评论 - 我将我知道不起作用的部分加粗,因为我正在将频率值与元素本身的值进行比较

@new = [0] 

def mode(arr)
    arr.each do |x|                                                 #do each element in the array
    freq = arr.count(x)                                             #set freq equal to the result of the count of each element

    if freq > @new[0] && @new.include?(x) == false                  #if **frequency of element is greater than the frequency of the first element in @new array** and is not already there
        @new.unshift(x)                                             #send that element to the front of the array
        @new.pop                                                    #and get rid of the element at the end(which was the former most frequent element)
    elsif freq == @new[0] && @new.include?(x) == false              #else **if frequency of element is equal to the frequency of the first element in @new array** and is not already there
        @new << x                                                   #send that element to @new array
    end
end

if @new.length > 1                                                  #if @new array has multiple elements
    @new.inject(:+)/@new.length.to_f                                #find the average of the elements
end

@new                                                                #return the final value
end

mode([2,2,6,9,9,15,15,15])
mode([2,2,2,3,3,3,4,5])

现在我已经阅读了这篇文章: Ruby:如何在数组中找到出现次数最多的项目?

并查看了这段代码

arr = [1, 1, 1, 2, 3]
freq = arr.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
arr.sort_by { |v| freq[v] }.last

但我不太明白。

我希望我的代码做的是,当它找到最频繁的元素时,
将该元素存储为键,并将其频率存储为其值。
然后我想将下一个元素的频率与现有对的频率进行比较,
如果它等于最频繁的,也将其存储,
如果更大,则替换现有的,
如果小于, 忽略并移至下一个元素。

然后当然,我想返回频率最多的元素,而不是频率的数量,
如果两个或多个元素共享最多的频率,然后找到这些数字的平均值。

我很想看到它带有我的数组尝试的一些提示,也许是我在上面发布的那个哈希方法的解释,或者一个更简单地分解的方法。

4

1 回答 1

0

这似乎符合您的要求:

def mode(array)
  histogram = array.each_with_object(Hash.new(0)) do |element, histogram|
    histogram[element] += 1
  end
  most_frequent = histogram.delete_if do |element, frequency|
    frequency < histogram.values.max
  end
  most_frequent.keys.reduce(&:+) / most_frequent.size.to_f
end

它创建了一个频率散列histogram,其中键是输入数组的元素,值是该元素在数组中的频率。然后,它会删除除最常见的元素之外的所有元素。最后,它平均剩余的键。

于 2013-09-11T03:49:22.817 回答