通过降低出现频率对元素进行排序

Posted

技术标签:

【中文标题】通过降低出现频率对元素进行排序【英文标题】:Sorting elements by decreasing frequency of occurence 【发布时间】:2018-06-09 15:09:36 【问题描述】:

我正在尝试解决这个问题:

如果 2 个数字具有相同的频率,则以递减的频率打印数组的元素,然后打印第一个出现的数字。 (https://www.geeksforgeeks.org/sort-elements-by-frequency/)

我正在尝试自己实施解决方案。我曾想过创建以下数据结构:

map<int,pair<int,int>> mymap

我将数字本身存储在第一个int 中,并将数字的索引和计数存储在上图中的数组对中。

我想编写一个自定义比较器来对对进行排序,如下所示:

bool cmp(pair<int,int>&a, pair<int,int>&b)

    if (a.first == b.first) 
         return a < b;
    else
         return a > b;

我仍在学习编写自定义比较器。我无法绕过我的头,我怎样才能通过比较器对地图进行排序。另外,如果pairs是排序的,那么map中的key会被排序吗?

请告诉我!谢谢!

【问题讨论】:

虽然自己做这个排序是一个很好的练习,但一旦你完成了它并了解了它,就把它扔掉并改用std::stable_sort。 :) 【参考方案1】:

您不需要为此使用地图,或者更好的是,不用这种方式。您可以使用包含元素的基本数组arr,而不是使用map cnt&lt;int,int&gt;,它将保留数组中每个元素的出现次数,另一个firstIndex&lt;int,int&gt; 将保留第一次出现的索引元素。在这种情况下,排序功能变得简单:

bool cmp(int a, int b)

    if(cnt[a] != cnt[b])
      return cnt[a] > cnt[b];
     else 
      return firstIndex[a] < firstIndex[b];
    

像这样使用它:

sort(arr, arr+n, cmp);

其中n 是数组中元素的数量。

【讨论】:

我假设我仍然会传递用于在排序函数和比较器中存储元素的向量/数组?我的意思是,我不会使用比较器作为输入对地图进行排序,对吗?另外,无论如何我可以在这里优化一些空间吗?我的意思是,你有什么建议吗?我正在考虑使用成对的向量来一次存储所有信息,然后将其传递给排序函数。 太棒了。有用。关于空间优化部分的任何输入?谢谢! 关于空间优化,假设数组的最大值不太大,您可以做的是删除地图并使用数组来计算出现次数和记住第一个索引出现。除此之外,我认为从内存消耗的角度来看,没有什么重要的方法可以改进代码。

以上是关于通过降低出现频率对元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按 C 中元素出现频率的降序对数组进行排序

在python中,如何按元素的频率对列表进行排序

根据元素的频率对数组进行排序

我想要一些关于如何根据元素频率对列表进行排序的帮助[重复]

首先按频率对字符串中的字符进行排序,然后按字母顺序排序

根据Rust中元素的频率和位置排序向量