2013-12-15 3 views
7

Это то, что я до сих пор:граф событие в списке с временной сложностью O (NlogN)

alist=[1,1,1,2,2,3,4,2,2,3,2,2,1] 
def icount(alist): 
    adic={} 
    for i in alist: 
     adic[i]=alist.count(i) 
    return adic 

print(icount(alist)) 

Я сделал некоторые исследования, чтобы выяснить, что временная сложность list.count() является O (n), таким образом, этот код будет O (n^2).

Есть ли способ уменьшить это до O (nlogn)?

+0

См [ 'collections.Counter'] (HTTP: // документы .python.org/3/библиотека/collections.html # collections.Counter). Это для такого рода работы. – falsetru

+0

Если вы просто увеличиваете 'adic [i]', сложность должна быть O (n). – Barmar

+0

Но как узнать временную сложность? –

ответ

11

Вы можете использовать Counter как этот

from collections import Counter 
alist=[1,1,1,2,2,3,4,2,2,3,2,2,1] 
print Counter(alist) 

Если вы хотите использовать ваше решение, вы можете улучшить его, как этот

def icount(alist): 
    adic = {} 
    for i in alist: 
     adic[i] = adic.get(i, 0) + 1 
    return adic 

Даже лучше, вы можете использовать defaultdict как это

from collections import defaultdict 
adic = defaultdict(int) 
for i in alist: 
    adic[i] += 1 
return adic 

Кроме того, вы можете посмотреть на сложность времени v arious операции на другом языке Python объекты here

+0

'get' - функция типа списка справа? alist.get (2,0) дает мне ошибку –

+0

@AswinMurugesh Извините. Починил это. Пожалуйста, проверьте сейчас :) – thefourtheye

+0

Можете ли вы объяснить мне, что именно он делает? –

6

Счетчик ваш помощник:

>>> from collections import Counter 
>>> a = [1,2,1,3,4] 
>>> Counter(a) 
Counter({1: 2, 2: 1, 3: 1, 4: 1}) 
>>> x = Counter(a)  
>>> x[1] 
2 
>>> x[2] 
1 

Получить количество каждого элемента легко с помощью этого метода

Смежные вопросы