词典中频率最高的元素

时间:2019-02-25 16:43:17

标签: swift

我正在尝试找到以下给定频率最高的元素。

首先,我正在尝试构建字典并根据频率对每个元素进行计数。

我被困在如何从构造的字典中提取最大值。

  

输入:[3,2,3]

     

输出:3

func majorityElement(_ nums1: [Int]) -> Int {

    var num1Dict = Dictionary(nums1.map{ ($0, 1) }, uniquingKeysWith : +)
    return num1Dict.values.max() // ????

}

3 个答案:

答案 0 :(得分:1)

您已经正确构造了games(){ var selectAllGames = [ {'gametitle': 'All Games', gid: null} ] return selectAllGames.concat(this.$store.getters.games); } ,对于输入num1Dict来说应该是这样的:

[3,2,3]

[2:1, 3:2] 将返回2,因为在字典(1和2)的所有值中,2是最高的。

现在看到您的错误了吗?

您需要返回与最大值(而不是最大值)关联的键。

一种非常简单的方法是这样做:

values.max()

答案 1 :(得分:1)

您可以使用reduce(into:)来生成包含元素及其频率的Dictionary,然后使用这些频率对数组进行排序,然后简单地返回已排序数组的最后一个元素(基于升序)

extension Array where Element: Comparable & Hashable {
    func sortByNumberOfOccurences() -> [Element] {
        let occurencesDict = self.reduce(into: [Element:Int](), { currentResult, element in
            currentResult[element, default: 0] += 1
        })
        return self.sorted(by: { current, next in occurencesDict[current]! < occurencesDict[next]!})
    }

    func elementWithHighestFrequency() -> Element? {
        return sortByNumberOfOccurences().last
    }
}

免责声明:sortByNumberOfOccurences方法是从another answer of mine复制而来的。

答案 2 :(得分:0)

您要查找的数学名称(集合中最常见的元素)称为 mode 。可能存在联系(例如[1, 1, 2, 2, 3, 3]具有3种模式:[1, 2, 3]

如果要使用任何一种模式(特别是不关心哪种模式),则可以使用Dictionary.max(by:),该模式可用于查找计数最高的(元素,计数)对(即字典值)。然后,您可以获得这对钥匙,即模式元素。

extension Sequence where Element: Hashable {
    func countOccurrences() -> [Element: Int] {
        return self.reduce(into: [:]) { (occurences, element) in occurences[element, default: 0] += 1}
    }

    func mode() -> Element? {
        return self.countOccurrences()
            .max(by: { $0.value < $1.value })?
            .key
    }

    func modes() -> [Element] {
        var firstModeNumOccurences: Int? = nil
        let modes = countOccurrences()
            .sorted { pairA, pairB in pairA.value > pairB.value } // sorting in descending order of num occurences
            .lazy
            .prefix(while:) { (_, numOccurences) in
                if firstModeNumOccurences == nil { firstModeNumOccurences = numOccurences }
                return numOccurences == firstModeNumOccurences
            }
            .map { (element, _) in element }

        return Array(modes)
    }
}

print([1, 2, 3, 3, 4, 4].mode() as Any) // => 3 or 4, non-deterministic
print([1, 2, 3, 3, 4, 4].modes() as Any) // => [3, 4]