Как получить следующий вывод наиболее эффективным способом? - PullRequest
1 голос
/ 20 июня 2011

Прочитать файл этого формата:

japan
usa
japan
russia
usa
japan
japan
australia

Распечатайте вывод в следующем формате:

<country> : <count>

Таким образом, для вышеприведенного файла вывод будет:

japan : 4
usa : 2
australia : 1
russia : 1

Обратите внимание, что, поскольку Австралия и Россия считаются как 1, имя сортируется, 'a' перед 'r'. Сделайте это наиболее эффективным способом.

Вот что я попробовал:

Read the entire file and insert into a HashMap.
We will have pairs like <japan, 4> in there.
Now read the HashMap and insert in another TreeMap<Integer, List<String>>
Iterate over TreeiMap using a Comparator, which will iterate in reverse-sorted order.
Sort value (which will be a List<String>) and print the result.

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

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

arr <- HashSet<String>[NumberOfElements]
map <- HashMap<String,int>
for each country:
   if country in map.keySet():
        count <- map.get(country)
        arr[count].del(country)
        map.delete(country)
        count <- count + 1
   else:
        count <- 1
   arr[count].add(country)  
   map.put(country,count)
for i=arr.length-1;i>=0;i--:
   sorted <- radixSort(arr[i])
   for each country in sorted:
      print country, i

arr здесь это «гистограмма», поскольку для каждой итерации «размер» увеличивается не более чем на 1, мы используем его для хранения данных.

объяснения сложности:
этот алгоритм использует radix sort , где «цифра» фактически является символом и представляет собой O (n), и его использование предотвратит O (nlogn) для других алгоритм сортировки или использование TreeSet
мы перебираем массив, размер которого не превышает n (если каждая страна появляется только один раз).

Трюк - это сортировка внутри цикла: это все равно O (n), потому что в общем случае вы сортируете не более n элементов (а не n элементов на одну итерацию!), Поэтому это O (2n) = O (n) ,
мы можем предварительно найти NumberOfElements за одну итерацию.

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

1 голос
/ 20 июня 2011

A java.util.Map должен помочь вам.

0 голосов
/ 20 июня 2011

Самый эффективный способ с точки зрения времени кодирования - забыть о Java и использовать sort | uniq -c | sort -n (кстати, один из моих любимых фрагментов оболочки).Следуйте этому с awk, если вам действительно нужно форматирование, как показано.Время выполнения даже не будет таким плохим для больших входных данных (поскольку это довольно эффективные программы), но время запуска будет доминировать в вашем списке примеров.Конечно, вы можете запустить его где-то порядка 10 000 раз, прежде чем сможете запустить Eclipse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...