Вы пытаетесь реализовать подсчет сортировки , который действительно равен O (n) при определенных условиях.Однако ваша реализация имеет две ошибки в конце, которые означают, что фактическая временная сложность вашей реализации составляет O (n 2 + n * m):
for ch in s:
if ch not in sort_fmt: # <--- "in" requires a linear search. O(n*m)
sorted_str += ch # <--- Ouch! Concatenation! O(n^2)
- ВыПостроение результата неэффективно, потому что вы используете конкатенацию в цикле.
- Использование
in
для строки является линейным по длине строки, и вы делаете это в цикле.
Попробуйте вместо этого.Требуется Python 2.7 или новее из-за использования collections.Counter
, но Counter
можно легко заменить на defaultdict
для более старых версий Python):
from collections import Counter
def sort_str(s, sort_fmt):
counter = Counter(s)
d = set(sort_fmt)
result = ''.join(c * counter[c] for c in sort_fmt)
result += ''.join(c for c in s if c not in d)
return result
if __name__ == '__main__':
print sort_str('abdcdfs', 'dacg')
Вот более краткий способчтобы получить желаемый результат, если вы отбросите требование, чтобы оно было O (n):
>>> d = dict((v,k) for (k,v) in enumerate('dacg'))
>>> sorted('abdcdfs', key = lambda c:d.get(c, len(d)))
['d', 'd', 'a', 'c', 'b', 'f', 's']