2013-06-05 3 views
-2

Я выполняю некоторые упражнения по кодированию и сталкиваюсь с этим вопросом при сортировке строкового массива и перечисляю все вхождения каждой уникальной строки в массиве. Я пытался выяснить, могу ли я сделать это лучше, чем O (n), но без везения. У кого-нибудь есть хороший образец для этой проблемы?Сортировка и список всех вхождений в строковом массиве

ВХОД:

str_array = ['opq', 'def', 'mno', 'abc', 'def', 'xyz', 'abc', 'mno', 'abc'] 

ВЫВОД:

'abc' : 3 
'def' : 2 
'mno' : 2 
'xyz' : 1 
'opq' : 1 
+0

Есть много образцов решения, если вы Google для них. Если у вас есть конкретный вопрос, я предлагаю вам указать один интересующий язык. –

+2

Как вы можете сделать лучше, чем O (n) ??? –

+1

Как бы вы могли пройти все элементы быстрее, чем 'O (n)'? – Keppil

ответ

1

В Python очень легко

>>> str_array = ['opq', 'def', 'mno', 'abc', 'def', 'xyz', 'abc', 'mno', 'abc'] 
>>> from collections import Counter 
>>> Counter(str_array).most_common() 
[('abc', 3), ('def', 2), ('mno', 2), ('xyz', 1), ('opq', 1)] 
+0

Это правильно, кроме основной невозможности избиения O (n) для подсчета элементов в несортированном списке, но обратите внимание, что 'Counter' является новым для Python версии 2.7. До этого вам придется использовать словарь и увеличивать счеты самостоятельно - это не сложно, но вы должны быть немного более явным. –

0

алгоритм не будет в состоянии сделать это в лучшее время, чем O (п), потому что вы должны смотреть на каждый элемент в массиве хотя бы один раз (что в основном означает минимум n шагов).

В Java вы можете использовать HashMap, чтобы сохранить количество для каждой строки:

import java.util.HashMap; 

HashMap<String, Integer> counter; 

for(String s : str_array) 
{ 
    counter.put(s, counter.get(s) + 1); 
} 

Чтобы получить выход:

for(String s : counter.keySet()) 
{ 
    System.out.println(s + " : " + counter.get(s)); 
} 
0

В Ruby

str_array.group_by{|s| s}.tap{|h| h.each{|k, v| h[k] = v.length}} 

с результатом:

{ 
    "opq" => 1, 
    "def" => 2, 
    "mno" => 2, 
    "abc" => 3, 
    "xyz" => 1 
} 
Смежные вопросы