С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Заблокирован
1

Частота повторений для всех символов в тексте

01.01.2020, 10:14. Показов 2542. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть текст, допустим: фывфыв ывфваавв ( на практике тут будет 200 символов ).
Мне нужно вывести в алфавитном порядке количество каждого символа
Каким примерно алгоритмом это можна сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.01.2020, 10:14
Ответы с готовыми решениями:

Частота повторений для всех символов в тексте
У меня есть текст, допустим: фывфыв ывфваавв ( на практике тут будет 200 символов ). Мне нужно...

Частота встречаемости символов в тексте
Привет. Помогите, пожалуйста. Нужно, чтобы программа брала текст из txt файла и подсчитывала...

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

Определить количество повторений в тексте заданного слова. Считать, что слова в тексте отделены друг от друга
1)В строке удалить введённое буквосочетание. 2)Определить количество повторений в тексте заданного...

18
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
01.01.2020, 12:11 2
Каждый символ — это, по сути, число. Число можно использовать в качестве индекса для массива. Создаёшь массив размером с максимальный символ (буква 'я') и начинаешь обходить текст. Если встречаешь символ, то увеличиваешь счётчик по данному индексу (array[*символ*]++;). Под спойлером достаточно простой вариант решения
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.Random;
 
public class Test {
    public static void main(String[] args) {
        String line = generateLine();
        int[] letters = new int['я' + 1];
        
        char c;
        for (int i = 0; i < line.length(); i++) {
            c = line.charAt(i);
            
            if (Character.isLetter(c)) {
                letters[c]++;
            }
        }
        
        for (int i = 0; i < letters.length; i++) {
            if (letters[i] != 0) {
                System.out.println((char) i + ": " + letters[i]);
            }
        }
    }
    
    private static String generateLine() {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random(System.currentTimeMillis());
        
        int letter;
        for (int i = 0; i < 200; i++) {
            if (rand.nextInt() % 2 == 0) {
                letter = rand.nextInt(26) + (rand.nextInt() % 3 == 0 ? 'A' : 'a');
            } else {
                letter = rand.nextInt(32) + (rand.nextInt() % 3 != 0 ? 'А' : 'а');
            }
            
            sb.append((char) letter);
        }
        
        return sb.toString();
    }
}
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 16:56 3
Gungala, int[] letters = new int['я' + 1]; я не тестил, но неверное так
int[] letters = new int['я'- 'а' + 1];

Не по теме:

П.С. не то чтобы я тебя учил, тут люди прям пластами копипастят)



Добавлено через 2 минуты
Точно, есть же еще большие, надо значит на 2 еще.
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:18 4
Цитата Сообщение от ViktorFX Посмотреть сообщение
неверное так
у Gungala, все хорошо, ваш второй вариант не желателен, ибо требует дополнительных расчетов в параметрах и + к времени выполнения.

Цитата Сообщение от ViktorFX Посмотреть сообщение
еще большие
легким движением руки подставляются маленькие буквы

Добавлено через 1 минуту
Цитата Сообщение от Gungala Посмотреть сообщение
for (int i = 0; i < letters.length; i++) {
здесь правильнее было бы
Java
1
for (int i = 'а'; i < 'я' + 1; i++) {
Добавлено через 1 минуту
Цитата Сообщение от Gungala Посмотреть сообщение
if (Character.isLetter(c)) {
лишнее условие, прохождение будет все равно только по алфавиту
0
Эксперт PythonЭксперт Java
19509 / 11049 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
01.01.2020, 17:18 5
Java
1
2
3
4
Arrays.stream(generateLine().split(""))
                .sorted()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .forEach((key, value) -> System.out.println(key + ": " + value));
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 17:28 6
Цитата Сообщение от sdasdaw Посмотреть сообщение
второй вариант не желателен, ибо требует дополнительных расчетов в параметрах и + к времени выполнения.
Ну не знаю letters.length дает 1104 что тоже на память и время влияет ))
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:33 7
ViktorFX, 4,5 килобайта - это память?
0
ViktorFX
01.01.2020, 17:38
  #8

Не по теме:

sdasdaw, ну так и операции 'я'-'a' + 1, или 2*('я'-'a') + 1 тоже не слижком много занимают времени вычисления ))

0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 17:43 9
ViktorFX, операции сложения / вычитания - знаимают больше времени умножения, а прямое обращение к индексу - o(1)
вы похоже не учитываете на перед, что каждый символ вам придется обрабатывать:
Java
1
arr[myChar - 'a']++;
Java
1
2*('я'-'a') + 1
здесь будет еще труднее логика для обработки, чтобы правильно расположить большие / маленькие буквы, чем сразу распологать готовой картой
1
Эксперт PythonЭксперт Java
19509 / 11049 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
01.01.2020, 17:45 10
Парни, а чего вы к буквам прицепились? В ТЗ все символы...

С Новым Годом!
3
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.01.2020, 18:09 11
Цитата Сообщение от sdasdaw Посмотреть сообщение
операции сложения / вычитания - знаимают больше времени умножения,
спасибо, я этого просто не знал.
Цитата Сообщение от sdasdaw Посмотреть сообщение
а прямое обращение к индексу - o(1)
вы похоже не учитываете на перед, что каждый символ вам придется обрабатывать:
о, а это именно суть. В изначальном коде Gungala, обращение происходило к каждому из элементов, и мое предложения было не в оптимизации а логике где letters содержит алфавит и ничего лишнего. А вот с этим for (int i = 'а'; i < 'я' + 1; i++) мне стало сейчас понятно (я это раньше не учитывал), хорошее решение!

Добавлено через 9 минут
iSmokeJC, Присоединяюсь, С Новым Годом Всех!!!

Не по теме:

П.С. да мы не прицепились, просто до меня долго доходит. Я не претендую на правоту в спорах с программисами, я многого не знаю и пока у меня есть интерес мне пригодится любая "накрутка" (как механизм в детских игрушках, его надо время от времени подручивать чтобы он двигался)

2
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
01.01.2020, 18:18 12
Если честно, мне тож больше нравится вариант с меньшим потреблением памяти (пусть и несколько килобайт — это ничтожное количество), но всё таки sdasdaw прав. Лучше ведь, шоб программа быстрее работала и выполнялось меньше вычислений
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 19:28 13
Gungala, если меньше потребление памяти, тогда лучше использовать XOR

Bash
1
2
3
4
5
      PLUS, 10 run(s) took    0.932s tot,    0.093s avg,    0.082s min,    0.150s max
     MULTI, 10 run(s) took    0.846s tot,    0.085s avg,    0.080s min,    0.091s max
   PERCENT, 10 run(s) took    2.084s tot,    0.208s avg,    0.204s min,    0.214s max
     SHIFT, 10 run(s) took    0.824s tot,    0.082s avg,    0.079s min,    0.090s max
       XOR, 10 run(s) took    0.765s tot,    0.077s avg,    0.073s min,    0.086s max
Исходник
Java
1
2
3
int[] flaggers = new int[27];
 
for (int i = 0; i < source.length(); i++) flaggers[source.charAt(i) ^ 96]++;
Добавлено через 6 минут
Перегнал тесты с двух сторон, XOR все равно победитель

Bash
1
2
3
4
5
6
7
8
9
    NATIVE, 100 run(s) took    8.174s tot,    0.082s avg,    0.074s min,    0.135s max
     SHIFT, 100 run(s) took    8.077s tot,    0.081s avg,    0.079s min,    0.089s max
      PLUS, 100 run(s) took    8.370s tot,    0.084s avg,    0.081s min,    0.123s max
       XOR, 100 run(s) took    7.458s tot,    0.075s avg,    0.072s min,    0.086s max
 
       XOR, 100 run(s) took    7.570s tot,    0.076s avg,    0.072s min,    0.157s max
      PLUS, 100 run(s) took    8.236s tot,    0.082s avg,    0.081s min,    0.092s max
     SHIFT, 100 run(s) took    8.058s tot,    0.081s avg,    0.079s min,    0.089s max
    NATIVE, 100 run(s) took    8.091s tot,    0.081s avg,    0.075s min,    0.084s max
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
01.01.2020, 21:35 14
Внезапно от заказчика приходят новые требования - считать ae, oo, au и т.д. за одну букву (типа дифтонги). И вся затея с массивом оказывается бесполезной
1
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
01.01.2020, 21:36 15
Цитата Сообщение от xoraxax Посмотреть сообщение
оказывается бесполезной
неа, дальше идут хешкоды
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
02.01.2020, 00:16 16
Цитата Сообщение от sdasdaw Посмотреть сообщение
неа, дальше идут хешкоды
так может сразу надо hashMap взять?
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
02.01.2020, 00:45 17
xoraxax, можно
0
Заблокирован
03.01.2020, 10:02  [ТС] 18
I have a text, let's say: fyvfyv yvfvaavv (in practice, there will be 200 characters).
I need to display in alphabetical order the number of each character.
What approximately algorithm can this be done?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37412 / 20784 / 4277
Регистрация: 12.02.2012
Сообщений: 34,194
Записей в блоге: 14
03.01.2020, 12:35 19
Как вариант (без алфавитного порядка, зато частоты всех букв и задаваемых контекстов):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
     Map<String, Integer> hashMap = new HashMap<>();
     String letters  = "йцукенгшщзхъфывапролджэячсмитьбю";
     String [] words = {"аб", "бра", "брак","ра"};
     String text     = "абракадабра";
     String k,tmp;
     char a;
     int i,ltext,lw,n;
     for (i=0; i<text.length(); i++)
     {
        k=""+text.charAt(i);
        if (hashMap.get(k)==null)
        {
           hashMap.put(k,1);
        }
        else
        {
           hashMap.put(k,1+hashMap.get(k));
        }
     }
     ltext=text.length();
     for (i=0; i<words.length; i++)
     {
       lw=words[i].length();
       tmp=text.replace(words[i],"");
       n=(ltext-tmp.length())/lw;
       hashMap.put(words[i],n);             
     }
     System.out.println(hashMap);
    }
}
0
03.01.2020, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2020, 12:35
Помогаю со студенческими работами здесь

Частота слов в тексте
с файлом сам разберусь, как реализовать алгоритм?

Частота появления биграмм в тексте
Доброго времени суток Искала по форуму похожую проблему -не нашла. Задание такое, нужно посчитать...

Частота встречаемости слов в тексте
Здравствуйте, потихоньку осваиваю С# нашел задачу : Дан небольшой текст на английском языке....

Частота повторения слов в тексте
Привет всем Помогите пожалуйста с Си: Разработать программу, подсчитывающую частоту повторения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru