按发生频率顺序打印列表唯一商品

时间:2017-03-23 11:29:00

标签: algorithm sorting frequency find-occurrences

假设我们有一个整数数组甚至连续的整数流。其思想是根据出现频率以降序打印唯一元素。例如,对于7,4,2,4,9,6,5,6,2,0,2,1我们应该得到:2,4,6,7,9,5,0,1,因为2出现三时间,4和6两次,其余只有一次。

是否有比(sorting map based by value)计算元素出现更好更有效的方法,将它们存储在地图中,然后根据值对地图进行排序。?

3 个答案:

答案 0 :(得分:2)

  

然而,在我看来应该有更多有效的算法,因为可能有一种方法可以在飞行中对频率进行排序。

这个问题在代数树模型中实际上是Omega(nlogn)(在该模型下不允许哈希),从 Element Distinctness Problem 减少,所以如果你希望得到解决它的一个(或常数)迭代,没有任何辅助数据结构来解决它 - 这是不可能的,因为它将允许我们在代数树模型中解决O(n)中的元素清晰度

针对这些类型问题的规范解决方案是:

  1. (您的建议):制作地图,删除重复项并按频率排序
  2. 与1类似,但不是使用地图 - 对项目进行排序,并使用二进制搜索查找每个元素重复的次数。

答案 1 :(得分:0)

如果您使用的是Python,那么请使用collections.Counter类及其Counter.most_common()方法

{!! Form::select('category[]', $categories['all_cat']['categories'], null, ['multiple' => true, 'class' => 'form-control', 'id' => 'category']) !!}

source可用,显示在most_common()

中使用的heapq

答案 2 :(得分:0)

专注于可能接受输入作为整数流的问题的要求,一个解决方案将是修改后的插入排序......

创建一个列表(此处命名为countlist),最初为空。每次接受新值时,都会迭代countlist中的每个列表,查找值。如果您在countlist[i]中找到该值,请从当前列表中删除该值并将其插入countlist[i+1],并在必要时向countlist添加新列表。如果您从未找到该值,请将值插入countlist[1]

迭代降序而不是升序的目的是,如果您在countlist[i]中找到它,它允许您维护一个指针,指向值将插入countlist[i-1]的位置。如果您不需要对共享相同计数的值进行子排序,则可以跳过此指针并迭代迭代。

我认为这个算法总体上是O(n 2 )。处理每个新值是O(n),结果将按照您的方式进行排序。在任何时候,您都可以通过迭代countlist下降并打印每个列表来打印正确的订单(到目前为止)。

使用问题中的示例运行示例...

input: 7, 4, 2, 4, 9, 6, 5, 6, 2, 0, 2, 1

After accepting 7:
countlist[1] = 7

After accepting 4:
countlist[1] = 4, 7

After accepting 2:
countlist[1] = 2, 4, 7

After accepting 4:
countlist[1] = 2, 7
countlist[2] = 4

After accepting 9:
countlist[1] = 2, 7, 9
countlist[2] = 4

After accepting 6:
countlist[1] = 2, 6, 7, 9
countlist[2] = 4

After accepting 5:
countlist[1] = 2, 5, 6, 7, 9
countlist[2] = 4

After accepting 6:
countlist[1] = 2, 5, 7, 9
countlist[2] = 4, 6

After accepting 2:
countlist[1] = 5, 7, 9
countlist[2] = 2, 4, 6

After accepting 0:
countlist[1] = 0, 5, 7, 9
countlist[2] = 2, 4, 6

After accepting 2:
countlist[1] = 0, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2

After accepting 1:
countlist[1] = 0, 1, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2