LINUX.ORG.RU

Задачка на самый быстрый подсчет встречаемости слов

 


2

2

Привет,

По мотивам темы: Различия между macOS и GNU/Linux

Есть файлик. Вот он: https://disk.yandex.ru/d/XaavsEkOvCT4HQ

Нужно пройтись по файлику и посчитать встречаемость каждого слова в тексте. Словом считается любая последовательность букв от a до z. Регистр нужно привести к одному. Любой другой символ прерывает слово.

Результат записать в другой файл в формате: <количество> <слово>. Например, текст: «cat, cat, cat». Ответ будет такой: «3 cat». Также, слова при выводе нужно отсортировать по их встречаемости.

Например первые несколько строк вывода из приведенного выше файла будут такими:

3343241 the
1852717 and
1715705 of
1560152 to
1324244 a

Дополнительное условие, нужно, чтобы ваша программа отрабатывала быстрее, чем за 7 секунд на Core i5-4690 @ 3.7 GHz.

Понятно, что железяки у всех разные, поэтому если участвуете, пишите на каком оборудовании вы запускали свою программку.

Вроде как BceM_IIpuBeT хотел поучаствовать. Может еще кто-то присоединится.

Я свою штуку написал. Отрабатывает примерно за 5 секунд на Мак-мини 2012-го года, core i7 @ 2,3 GHz.

★★★★★★★★★★★

Последнее исправление: hibou (всего исправлений: 1)
Ответ на: комментарий от vel

Ага, разобрался. Всё верно у тебя, если исходить из того, что файл в UTF-8 (на самом деле нет). Извини за наезд :) Классный вариант.

anonymous
()
Ответ на: комментарий от vel
@@ -80 +80 @@
-        c = *i;
+        c = *i | 0x20;
@@ -82,2 +82,2 @@
-        if((c & 0xC0) != 0x80) {
-            c = (char)aho_lc[(uint8_t)c];
+        /* if((c & 0xC0) != 0x80) {
+            c = (char)aho_lc[(uint8_t)c]; */
@@ -86,2 +86,2 @@
-        } else
-            i++;
+        /* } else
+            i++;*/

Соответственно, LUT не нужна; не стал её удалять, чтобы в diff не попала.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.