Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск символов 
:(
    Опции темы
Stecya
Дата 27.6.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.5.2007

Репутация: нет
Всего: нет



можно как нибуть одним махом найти росположение 2-3 разних символов .... цикл просьба не предлогать ибо очень долго (для 30 000 букв)
PM MAIL   Вверх
zkv
Дата 27.6.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



Stecya, в любом случае это будет цикл, даже если это будет какая то стандартная функция, то внутри у нее будет цикл. 
Исключение - если данные предварительно хешированы.
PM MAIL   Вверх
Klin
Дата 27.6.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(Stecya @  27.6.2007,  15:37 Найти цитируемый пост)
(для 30 000 букв)

хи-хи-хи напугал smile, Обычного целого типа хватит на подсчет. А занимается этим занимается функция POS (любой AnsiString). Можно и самому функцию писать, но все равно будет цикл. Или можешь создать 30 000 условий( денька два займет smile)


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Stecya
Дата 27.6.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.5.2007

Репутация: нет
Всего: нет



Ок тогда как можна оптимизировать етот код
Код

     int level = 0;
     int temp = 1;
     for(int i = 1; i<= red_Text->Text.Length(); i++)
     {
         if(red_Text->Text[i] == '{')
         {
             ColorItem(temp,i,level);
             temp = i;
             level++;
         }
         if(red_Text->Text[i] == '}')
         {
             ColorItem(temp,i,level);
             temp = i;
             level--;
         }
     }

 где red_Text переменная типу TRichEdit .... CоlorItem раскрашиваєт текст между символами "{", "}"  в зависимости от значения level .... для текста длиною 30 000 символов прога работает почти 2 минути

Это сообщение отредактировал(а) Stecya - 27.6.2007, 16:10
PM MAIL   Вверх
Klin
Дата 27.6.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



У вас условие два раза идет. Сначало пробивает один символ и тут же следующий. Оператор else тебе знаком? Да и красить каждый символ не слишком удобно... Немного упростил, через Pos работает лучше, но почему-то не до конца документ читает, позже и сним разберусь, а пока, попробуй этот код:

Код

 for (int i = 1; i<=RichEdit1->Text.Length(); i++)
  if (RichEdit1->Text[i]=='{') RichEdit1->SelStart = i-1;
  else if (RichEdit1->Text[i]=='}') {
   RichEdit1->SelLength = i - RichEdit1->SelStart;
   RichEdit1->SelAttributes->Color = clRed;
   RichEdit1->SelAttributes->Size = 20;
  }


У меня 30 000 символов (забитого скобками) читало примерно секунд 20 при 3,2 гц проца. Проверьте этот у себя и скажите, что у вас, дальше буду думать с Pos.


ps. о том как измерить время действия функций прочитайте в FAQ


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
Дата 27.6.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



вот комбинированный вариант - 17 секунд. За счет уничтожения одного условия:

Код

 for (int i = 1; i<=RichEdit1->Text.Length(); i++)
  if (RichEdit1->Text[i]=='{') {
   RichEdit1->SelStart = i;
   RichEdit1->SelLength = RichEdit1->Text.SubString(i,RichEdit1->Text.Length()).Pos("}")-2;
   RichEdit1->SelAttributes->Color = clRed;
   i = RichEdit1->SelStart + RichEdit1->SelLength;
  }



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Stecya
Дата 27.6.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.5.2007

Репутация: нет
Всего: нет



на таком тексте( http://spectral.clan.su/_fr/1/30452506.txt )  вашим кодом прога работаєт 10,1 секунд (Celeron 2.0 Ггц)
но функциональность немножко не та ...привожу свой код

Код

     int level = 0;
     int start = 1;
     for(int i = 1; i<= red_Text->Text.Length(); i++)
     {
         if(red_Text->Text[i] == '{')
         {
             ColorItem(start,i,level);
             start = i;
             level++;
         }
         else if(red_Text->Text[i] == '}')
         {
             ColorItem(start,i,level);
             start = i;
             level--;
         }
      }

Функция  ColorItem
Код

void __fastcall TForm1::ColorItem(int start,int end,int level)
{
      if(end-start > 1)
      {
          red_Text->SelStart = start;
          red_Text->SelLength = end-start-1;
          switch(level)
          {
              case 0:
                  red_Text->SelAttributes->Color = clBlack;
                  break;
              case 1:
                  red_Text->SelAttributes->Color = clGreen;
                  break;
              case 2:
                  red_Text->SelAttributes->Color = clBlue;
                  break;
              case 3:
                  red_Text->SelAttributes->Color = clGray;
                  break;
              case 4:
                  red_Text->SelAttributes->Color = clPurple;
                  break;
                         }
      }
      red_Text->SelStart = end-1;
      red_Text->SelLength = 1;
              red_Text->SelAttributes->Color = clRed;
}

Такой код работает 19,6 сек.  ..... мне нужно штоб укладивалось в 7-8 секунди

P.S. Если заменить switch на іf поднимет ли ето бистродействие?



Это сообщение отредактировал(а) Stecya - 27.6.2007, 20:35
PM MAIL   Вверх
Klin
Дата 27.6.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Мало вероятно, но можно вообще его не использовать в моем варианте №2. Но в функции ColorItem можно swicth ваше убрать, просто в level записывать цвет, тогда производительность улучшиться, но имхо много хотите, можно побробовать разгрузить код или подумать над кешированием...


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Stecya
Дата 27.6.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.5.2007

Репутация: нет
Всего: нет



Хочу не я а потенциальний роботодатель .... помогите пожалуста

Добавлено @ 20:47
Заменил switch на іf .... теперь 13 сек. 
Цитата

можно swicth ваше убрать, просто в level записывать цвет

Не могу я вместо левела цвет передать потомушто не знаю на каком уровне нахожусь в момент визова ColorItem

Это сообщение отредактировал(а) Stecya - 27.6.2007, 20:50
PM MAIL   Вверх
Klin
Дата 27.6.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(Stecya @  27.6.2007,  21:40 Найти цитируемый пост)
Хочу не я а потенциальний роботодатель .... помогите пожалуста

Постараюсь помочь... Стоп, ты же писал 2 секунды? 

Цитата(Stecya @  27.6.2007,  21:40 Найти цитируемый пост)
Заменил switch на іf .... теперь 13 сек. 

В принципе, как я и говорил 5 условий... switch пожалуй можно назвать условием с разделениями.  Хотя 3 секунды разницы? Else использовали? 

Цитата(Stecya @  27.6.2007,  21:40 Найти цитируемый пост)
Не могу я вместо левела цвет передать потомушто не знаю на каком у

Нет можите, скажем создать массив типа TColor и переменная level будет указывать на индекс цвета. Т.е. освободим программу, от необходимости думать в этом месте. 


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Stecya
Дата 27.6.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.5.2007

Репутация: нет
Всего: нет



Цитата

Постараюсь помочь... Стоп, ты же писал 2 секунды? 

Cорь ... я перепутал тести ... 2 секунди ето для 2000 символов ....

Кстати проблема решилась .... Очень много времени занимает такое обращение
Код

if(red_Text->Text[i] == '{')

Перевел ето дело в сhar и дострупаюсь через указатель .... итого бистродействие проги упало с 13 сек до 2 сек
Попробую еще масив TColor сделать может еще бистрее будет ....

Р.S. Спосибо большое што не остался равнодушним к чужой проблеме
P.S.S. Правда на етом проект не закончен ... думаю я еще наделаю тут много топиков))) 

 
PM MAIL   Вверх
Klin
Дата 27.6.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Всегда рад помочь smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.