Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48

Оптимизировать программу, которая рассчитывает повторение каждой буквы и сочетания из двух букв

05.02.2015, 06:56. Показов 1313. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Посоветуйте, как можно существенно оптимизировать код. Программа рассчитывает повторение каждой буквы и сочетания из двух букв (для расчета энтропии в дальнейшем) текста из textBox1 по нажатию кнопки. Результат записывается в textBox2 и в файлы. При подсчете использую одномерный и двумерный массивы, индексы которых и есть символы, а их значения - число повторений.
Программа получилась недопустимо тормознутой - с текстом из 3500 слов работает в течении 10 сек (на поточный вывод в файл времени тратится немного), в ОП занимает 11476 К, что слишком много. Оптимизация в настройках включена, режим Release.

C#
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace CountText
{
  
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
 
    private void button1_Click(object sender, EventArgs e)
    { 
      //1) Подсчет общего числа букв и повторений каждой буквы
      int i,j,n=0; int[] b= new int[32]; 
      for (i = 0; i < textBox1.TextLength; i++)
      {
        if (char.ToLower(textBox1.Text[i]) >= 'а' && char.ToLower(textBox1.Text[i]) <= 'я')
        {
          n++;
          b[char.ToLower(textBox1.Text[i])-'а']++ ;
        }
      }
      // 2) Вывод в Textbox2 число повторений каждой буквы
      for (i = 0; i < 32; i++)
        if (b[i] != 0)
          textBox2.Text = textBox2.Text + Convert.ToChar(i+'а')+'-'+b[i]+"; ";
      textBox2.AppendText("\r\n____________________\r\n");
      // 3)  Подсчет повторений сочетаний из двух букв
      int[,] c= new int [32,32];
      for (i = 0; i < textBox1.TextLength-1; i++) 
        if (char.ToLower(textBox1.Text[i]) >= 'а' && char.ToLower(textBox1.Text[i]) <= 'я'&&
          char.ToLower(textBox1.Text[i+1]) >= 'а' && char.ToLower(textBox1.Text[i+1]) <= 'я')
            c[char.ToLower(textBox1.Text[i]) - 'а', char.ToLower(textBox1.Text[i+1]) - 'а']++;
      // 4)  Вывод числа повторений сочетаний из двух букв в TextBox2
      for (i = 0; i < 32; i++)
        for (j=0;j<32;j++)
          if (c[i,j] != 0)
            textBox2.Text = textBox2.Text + Convert.ToChar(i + 'а') + Convert.ToChar(j + 'а')
            + '-' + c[i,j] + "; ";
      // 5) Поточный вывод в файл Vector.out - число повторонений каждой буквы
      StreamWriter sw = new StreamWriter("Vector.out");
      for (i = 0; i < 32; i++)
        sw.WriteLine(b[i]);
      sw.Close();
      // 6) Поточный вывод в файл Matrix.out - число повторонений из двух букв
      StreamWriter sw1 = new StreamWriter("Matrix.out");
      for (i = 0; i < 32; i++)
      {
        for (j = 0; j < 32; j++)
          sw1.Write(c[i, j] + " ");
        sw1.Write("\r\n");
      }
      sw1.Close();
    }
 
    
 
 
  }
}
Добавлено через 26 минут
Ошибся, не 3500 слов, а 3500 символов. Редактировать перенесенные темы нельзя?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2015, 06:56
Ответы с готовыми решениями:

Написать программу, которая выводит все возможные сочетания из двух цифр!
Ребят, помогите написать программу, VBA Excel. Написать программу, которая выводит все возможные сочетания из двух цифр. Первая цифра...

Написать программу, которая рассчитывает значение Z
Написать программу, которая рассчитывает значение Z для числа i=13, где значения a и b вычисляются за формулами ( картинка1) Формула...

Составьте программу, которая рассчитывает количество бактерий
Помогите составить программы. заранее спасибо:) 3)Каждая бактерия делится на две в течение одной минуты. В начальный момент имеется...

16
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.02.2015, 09:49
Миллион символов.
Время 0.29 сек.
Без особой оптимизации.
C#
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication233
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //генерируем произвольный текст (миллион символов)
            var rnd = new Random();
            var sb = new StringBuilder();
            for(int i=0;i<1000000;i++)
                sb.Append((char)rnd.Next(97, 123));
 
            var text = sb.ToString();
 
            //засекаем время
            var sw = Stopwatch.StartNew();
            //считаем статистику
            var res = CalcSingleCharsStat(text);
            var res2 = CalcPairCharsStat(text);
            //
            sw.Stop();
            Console.WriteLine("Time: {0}", sw.Elapsed);
        }
 
        private Dictionary<string, int> CalcPairCharsStat(string text)
        {
            var res = new Dictionary<string, int>();
            //
            var prevChar = '\x0';
 
            foreach (var c in text)
            {
                if (char.IsLetter(c) && char.IsLetter(prevChar))
                {
                    var s = new string(new char[]{prevChar, c});
                    var count = 0;
                    res.TryGetValue(s, out count);
                    res[s] = count + 1;
                }
                prevChar = c;
            }
            //
            return res;
        }
 
        private Dictionary<char, int> CalcSingleCharsStat(string text)
        {
            var res = new Dictionary<char, int>();
            //
            foreach(var c in text)
                if(char.IsLetter(c))
                {
                    var count = 0;
                    res.TryGetValue(c, out count);
                    res[c] = count + 1;
                }
            //
            return res;
        }
    }
}
1
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
05.02.2015, 11:13  [ТС]
Storm23, я работал с компонентами textBox, а Ваш вариант вообще консольный. Поэтому, естественно, времени меньше.
Как только ознакомлюсь с Dictionary, попробую его использовать. Но мне кажется, много времени уходит на взаимодействие как раз с TextBox, поэтому ощутимо быстрей не будет.
Может, кусками считывать из textBox и записывать в какой-нибудь буфер, и обрабатывать эти куски?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.02.2015, 11:16
Цитата Сообщение от BOEH Посмотреть сообщение
Ваш вариант вообще консольный
У меня? Класс Form1 как бе намекает...
Цитата Сообщение от BOEH Посмотреть сообщение
Но мне кажется, много времени уходит на взаимодействие как раз с TextBox
А зачем вы "взаимодействуете" с textbox? Возьмите у него строку из свойства Text и передайте ее в метод CalcSingleCharsStat.
А в моем примере мне просто было лень вставлять строку в текстбокс, что бы тут же ее оттуда забирать. На скорость обработки это никак не влияет.
1
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
05.02.2015, 11:47  [ТС]
Storm23,
Цитата Сообщение от Storm23 Посмотреть сообщение
У меня? Класс Form1 как бе намекает...
Просто мало пространств имен подключили, вот и решил, что консоль. Кстати, видимо, из-за инклудов у меня столько памяти и занимает.

Добавлено через 11 минут
Избавление от лишних пространств имен никак не повлияло на занимаемую память
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.02.2015, 12:03
Цитата Сообщение от BOEH Посмотреть сообщение
Избавление от лишних пространств имен никак не повлияло на занимаемую память
А вы думали это влияет??? Смешно, честное слово) Использование using-ов сделано просто для облегчения труда программистов (не надо писать полностью квалифицированные имена членов), и на память никакого влияния не оказывает. Кстати, в IL коде всегда используются полностью заданные имена.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.02.2015, 12:11
BOEH, Это не cpp, здесь нет "инклудов", а пямять - управляемая. Не обращайте внимания на объем занимаемой памяти, утечек в коде нет. Почитайте про организацию памяти в .NET.
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
05.02.2015, 14:20  [ТС]
insite2012,
Цитата Сообщение от insite2012 Посмотреть сообщение
А вы думали это влияет??? Смешно, честное слово) Использование using-ов сделано просто для облегчения труда программистов (не надо писать полностью квалифицированные имена членов), и на память никакого влияния не оказывает. Кстати, в IL коде всегда используются полностью заданные имена.
А я думал, using библиотеки в проект подключает.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.02.2015, 14:52
Цитата Сообщение от BOEH Посмотреть сообщение
я думал, using библиотеки в проект подключает.
Библиотеки подключаются через ссылки. А using - просто синтаксическая конструкция, облегчающая написание кода (снижающая многословность).
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
06.02.2015, 18:49  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
А зачем вы "взаимодействуете" с textbox? Возьмите у него строку из свойства Text и передайте ее в метод CalcSingleCharsStat.
А в моем примере мне просто было лень вставлять строку в текстбокс, что бы тут же ее оттуда забирать. На скорость обработки это никак не влияет.
Как можно вывести i-тое значение Dictionary? Ни textBox2.Text.Append(res[i].ToString()), ни textBox2.AppendText(res.Values[i].ToString()), ни через Convert не получается
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:09
Цитата Сообщение от BOEH Посмотреть сообщение
Как можно вывести i-тое значение Dictionary
А что такое i-е значение Dictionary? Словарь хранит пары ключ-значение. Доступа по индексу у словаря нет.
Если вам нужно перебрать все пары ключ-значение из словаря, то используйте foreach:

C#
1
2
3
4
foreach(var pair in dictionary)
{
   ...
}
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
07.02.2015, 05:21  [ТС]
Но ведь во время отладки видно, что пара ключ-значение индексируются.
Миниатюры
Оптимизировать программу, которая рассчитывает повторение каждой буквы и сочетания из двух букв  
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
07.02.2015, 05:22  [ТС]
В любом случае, как определенное значение ключа вывести в textBox?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.02.2015, 13:38
Цитата Сообщение от BOEH Посмотреть сообщение
В любом случае, как определенное значение ключа вывести в textBox?
C#
1
2
string key = "...";
textBox1.Text = dict[key].ToString();
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
07.02.2015, 17:42  [ТС]
Storm23, а какой-нибудь метод для сортировки dictionary по ключам есть?

Добавлено через 2 минуты
И еще хотел спросить, вот это для чего:
C#
1
 var prevChar = '\x0'
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.02.2015, 18:00
Цитата Сообщение от BOEH Посмотреть сообщение
а какой-нибудь метод для сортировки dictionary по ключам есть?
Поймите, каждая структура данных имеет свои строго определенные свойства. Dictionary это структура которая хранит пары ключ-значение. ВСЕ. Ее нельзя сортировать, ее нельзя получать по индексу. Если вам нужны эти возможности, значит вам нужно использовать другую структуру данных (либо изначально, либо потом).
Если вам нужен отсортированный словарь ключ-значение, можно использовать SortedDictionary. Однако эта структура данных имеет время поиска и вставки O(log n), в то время как Dictionary имеет O(1). То есть в процессе поиска сочетаний нежелательно использовать SortedDictionary, потому что оно существенно медленнее.
Но если на выходе вам все же нужен упорядоченный словарь, то вам нужно при поиске использовать словарь, а затем создать сортированный сорварь из исходного:
C#
1
var sortedDict = new SortedDictionary(dict);
1
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
08.02.2015, 06:29  [ТС]
Заменил "textBox2.Text=textBox2.Text+... " на "textBox2.AppendText(...)" в своем первоначальном варианте, и это ускорило выполнение раза в 4. Но все еще недостаточно быстро.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2015, 06:29
Помогаю со студенческими работами здесь

Написать программу, которая рассчитывает 10-й член последовательности
Написать программу, которая рассчитывает 10-й член последовательности b1 =5 , bn=bn-1/(n2+n+1) с помощью рекурсивного алгоритма и также...

Составить программу, которая рассчитывает значение этой функции :
(На СИ) Составить программу, которая рассчитывает таблицу значений этой функции в указанном диапазоне значений x0 — xk с заданным шагом...

Написать программу, которая рассчитывает плату за расход воды
Напишите программу &quot;расхода воды &quot; , которая рассчитывает плату за расход воды . Пользователь вводит текущие и предыдущие показатели...

Составьте программу, которая распечатывает заданную строку, после каждой второй буквы вставляя “быр”
Среди детей встречается игра, заключающаяся в зашифровке своей речи “для секретности” за счет вставки в произносимые слова какого-нибудь...

Написать программу, которая в заданном слове, состоящем из строчных букв, определяет состовляющие его буквы
написать программу, которая в заданном слове, состоящем из строчных букв, определяет состовляющие его буквы: все согласные и все...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru