Обычно Heap - это структура данных, которая хорошо подходит, когда мы должны определить что-то вроде наиболее / наименее используемых.
Четный Python; Counter.nlargest s , который используется для этих целей, реализуется через структуру данных кучи.
Структура данных двоичной кучи имеет следующую сложность
CreateHeap - O(1)
FindMin - O(1)
deleteMin - O(logn)
Insert - O(logn)
Я запустил сравнение для Hash (используя словарь по умолчанию в Python) и Heap (используя Collections.Counter.nlargest в Python), и Hash справляется немного лучше, чем Heap.
>>> stmt1="""
import collections, random
somedata=[random.randint(1,1000) for i in xrange(1,10000)]
somehash=collections.defaultdict(int)
for d in somedata:
somehash[d]+=1
maxkey=0
for k,v in somehash.items():
if somehash[maxkey] > v:
maxkey=k
"""
>>> stmt2="""
import collections,random
somedata=[random.randint(1,1000) for i in xrange(1,10000)]
collections.Counter(somedata).most_common(1)
"""
>>> t1=timeit.Timer(stmt=stmt1)
>>> t2=timeit.Timer(stmt=stmt2)
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=10)/10)
38168.96 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=10)/10)
33600.80 usec/pass