【问题标题】:Sorting array items by frequency value按频率值对数组项进行排序
【发布时间】:2021-05-06 18:52:09
【问题描述】:

有没有一种好的方法或算法可以根据每个项目中的频率值对数组进行排序?假设我有这个数组:
[3、3、3、5、6、12、5、5、6]。我希望输出为 [3, 5, 6, 12]。我在考虑像插入排序这样的东西,但我相信可能有更简单的方法。

【问题讨论】:

  • 按直方图排序,但这不是频率!!!如果你想按频率排序,那么你首先需要计算频率(计数振荡,所以3,3,33 相同,但3,?,3 不是,除非你将3,3 作为最大频率处理)在这种情况下输出将是 5,6 ; 3,12 而不是您当前的 3; 5; 6; 12。那么它是哪一个......如果第二次修复您的示例,请先修复标题,并说明您想要排序的频率(平均值,平均值,最大值,最小值?),因为它在您的示例中不是恒定的。
  • 我在这里更新了帖子:*.com/questions/67414015/…。我相信我在那里解释得更好。
  • 1.请不要发布重复的问题,而是将新信息编辑到您的原始信息中。 2.所以频率是指发生率(那不是频率...频率具有非常不同的含义?3.所以您只想将 2 个值紧密排列在一起...所以构造 histogram 为您的数组和 index sort 然后按排序顺序打印索引
  • 我想我现在明白了。

标签: arrays algorithm sorting key-value frequency


【解决方案1】:

好吧,您肯定需要每个元素的计数,即 O(n)。然后您可以从中创建一个唯一列表(假设它有 m 个元素),并根据您喜欢的任何排序算法根据频率对其进行排序。这将是 O(n+mlog(m))。 例如在python中:

from collections import Counter

myList = ['a', 'b', 'b', 'a', 'b', 'c']

myCounter = Counter(myList)
myUniqueList = list(myCounter)
sorted(myUniqueList, key=lambda e: myCounter[e])

根据 Paddy3118 的评论编辑

【讨论】:

  • 您可以替换 myUniqueList = list(myCounter),因为计数器键是唯一的,但您的方式也可以:-)
  • 不错的一个!我将其添加到解决方案中。
【解决方案2】:

首先你要数他们

std::unordered_map<int, int> dict;
for(auto &val : array)
   dict[val]++; // O(N)

然后你对它们进行排序

std::vector vec(dict.begin(), dict.end());
std::sort(vec.begin(), vec.end(), [](auto a, auto b) { return a.second > b.second }); // O(M lg M), requires C++14 to use auto

【讨论】: