Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

Функции для работы со строками.   Найти похожие ветки 

 
Просто_новичок   (2007-05-31 13:02) [0]

Подскажите плиз, какие есть функии для работы со строками, но чтобы были как можно быстрее в выполнении. Функция copy как я понял очень медленная, как и Pos.
А задача вобщем в следующем, есть строка, например: s="00101010010111001010101001101001010100101010101011010010111011000010101101011 0101001010110000001111010101", только раз так в 1000 подлиннее, а то и больше...
И есть вторая строка, например: s1="00101". Так вот, мне нужно найти в первой строке комбинацию "00101" и удалить её, она будет первой, так построен алгоритм, все другие комбинации исключены, я делаю так:
s:=copy(s,length(s1)+1,length(s)); Эта функция выполняется в программе очень много раз и очень тормозит её выполнение, как можно сделать тоже самое, но с помощью других функций, болеебыстродействующих, какие есть болеебыстродействующие функции?


 
Reindeer Moss Eater ©   (2007-05-31 13:07) [1]

Скорее всего тормозят не эти функции, а перераспределение памяти под строки.


 
Сергей М. ©   (2007-05-31 13:07) [2]


> я делаю так:
> s:=copy(s,length(s1)+1,length(s));


А зачем ты делаешь копию ?
Тебе ведь всего лишь удалить нужно найденный фрагмент ?


 
Просто_новичок   (2007-05-31 13:09) [3]

Сергей М, да, нужно удалить, я его и удаляю, то есть если у меня было: s="00101001101", и надо удалить s1="00101", то после выполнения: s:=copy(s,length(s1)+1,length(s)); - у меня в s хранится уже "001101". А как можно ещё удалить?


 
Плохиш ©   (2007-05-31 13:10) [4]


> А как можно ещё удалить?

"удалить" в переводе на англитцкий "delete"...


 
G_M_S ©   (2007-05-31 13:11) [5]


> s:=copy(s,length(s1)+1,length(s));

1. Проще юзать StringReplace (он, скорее всего, и работать быстрее будет),
да и вызов у нее будет всего 1, а немного раз.
2. Вызванный 2 раза length тоже может замелять. length(s1) можно выполнить заранее, т.к. во время работы он не меняется (как я понял из ТЗ).
3. Можно почитать Кнута на предмет алгоритмов поиска, хотя это путь для одептов.


 
default ©   (2007-05-31 13:12) [6]


> Так вот, мне нужно найти в первой строке комбинацию "00101"
> и удалить её, она будет первой, так построен алгоритм, все
>


> Эта функция выполняется в программе очень много раз


что-то думается мне что у тебя ошибка дизайна


 
Просто_новичок   (2007-05-31 13:12) [7]

Плохиш, ты думаешь эта функция работать бустрее будет, чем copy?


 
Просто_новичок   (2007-05-31 13:14) [8]

G_M_S, нет, length(s1) во время работы меняется, всего может быть до 255 различных комбинаций.
А как пользоваться StringReplace?


 
Просто_новичок   (2007-05-31 13:15) [9]

default, в смысле ошибка дизайна?


 
Сергей М. ©   (2007-05-31 13:16) [10]


> после выполнения: s:=copy(s,length(s1)+1,length(s)); - у
> меня в s хранится уже "001101"


Сам-то убедился в том что утверждаешь ?


 
Amoeba ©   (2007-05-31 13:16) [11]


> Просто_новичок   (31.05.07 13:02)
>
> Подскажите плиз, какие есть функии для работы со строками,
>  но чтобы были как можно быстрее в выполнении.

Вагон и маленькая тележка всевозможных хорошо оптимизированных ф-ий для работы со строками содержится в этой библиотеке:
http://www.torry.net/vcl/vcltools/text/adqstrings.zip


 
default ©   (2007-05-31 13:16) [12]

Просто_новичок   (31.05.07 13:15) [9]
ошибка проектирования
то есть ты загнал себя в яму, а теперь ищёшь способ оттуда вылезти вместо того чтобы обойти яму


 
G_M_S ©   (2007-05-31 13:16) [13]

Вдогонку:


> да и вызов у нее будет всего 1, а немного раз.


Лажанулся.


 
Плохиш ©   (2007-05-31 13:20) [14]


> Просто_новичок   (31.05.07 13:12) [7]
> Плохиш, ты думаешь эта функция работать бустрее будет, чем
> copy?

Проверить - это твоё домашнее задание.


 
G_M_S ©   (2007-05-31 13:21) [15]


>  length(s1) во время работы меняется, всего может быть до
> 255 различных комбинаций.

Ты из строки, которая представляет битовое представление неких данных в виде символов "0" и "1" вырезаешь первый байт? А, случайно, ты перед этим не конвертишь битовое число в строку? Тогда до конвертации можно было бы битовую операцию сделать, это во МНОГО РАЗ быстрее.


> А как пользоваться StringReplace?

Пишешь в редакторе: "StringReplace", давишь Ctrl+F1

PS: пиши ТЗ внятнее. Может, подскажут более простой способ решить проблему.


 
Просто_новичок   (2007-05-31 13:23) [16]

default, какую яму? Какая ошибка проектирования?
G_M_S, "да и вызов у нее будет всего 1, а немного раз" - какой один раз? Это зависит от того какая длина строки s, говорю же, там может быть до 1 миллиона символов 0 й 1. А в строке s1 от 1-го симваола до 12-ти к примеру. И строка s1 постоянно меняется, с каждым новым удалением.

Сергей М.
"> после выполнения: s:=copy(s,length(s1)+1,length(s)); - у
> меня в s хранится уже "001101"
Сам-то убедился в том что утверждаешь ?"
Сергей М. - конечно убедился!! Вот напиши вот так, если в уме не можешь) и посмотри...
procedure TForm1.Button1Click(Sender: TObject);
var
s,s1:string;
begin
s:="0010100110";
s1:="00101";
s:=copy(s,length(s1)+1,length(s));
Edit1.Text:=s;
end;
Ребят! Вы вообще программировать умеете))


 
G_M_S ©   (2007-05-31 13:24) [17]


> Проверить - это твоё домашнее задание.

Издеваешься над чайником?!!


 
DVM ©   (2007-05-31 13:25) [18]


> Просто_новичок  

Откуда такая строка? Почему там одни нули и единицы?


 
G_M_S ©   (2007-05-31 13:27) [19]


> И строка s1 постоянно меняется, с каждым новым удалением.

Чего ты ваяешь-то?!! Если что-то с битами - то битовые операции САМЫЕ БЫСТРЫЕ, и потому переводить что-то встроки глупо.


> Ребят! Вы вообще программировать умеете))

Нет, нам платят на работе бабки за то, что мы целый день висим на форумах и отвечаем навопросы :)))


 
default ©   (2007-05-31 13:27) [20]

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


 
Просто_новичок   (2007-05-31 13:28) [21]

G_M_S, "А, случайно, ты перед этим не конвертишь битовое число в строку?" - что ты подразумеваешь под битовым числом? Переменную s1? Я не понял.
"Ты из строки, которая представляет битовое представление неких данных в виде символов "0" и "1" вырезаешь первый байт?" - можно и так сказать, вырезаю первые n-символов, символов может быть не только 8, в зависимости от представления в таблице перекодировки алгоритма Хаффмана.


 
Сергей М. ©   (2007-05-31 13:28) [22]


> Просто_новичок   (31.05.07 13:23) [16]


> Вы вообще программировать умеете


Да куда уж нам, крестьянам, в лаптях по асфальту)


 
Сергей М. ©   (2007-05-31 13:32) [23]


> таблице перекодировки алгоритма Хаффмана


Хафман, наверно, завещал тебе работать с бин.данными не иначе как в строковом виде ?)


 
Просто_новичок   (2007-05-31 13:32) [24]

DVM, "Откуда такая строка? Почему там одни нули и единицы?" - я пишу архиватор, сжатие реализовал, разархивирование тоже. Так вот разархивирование и проходит таким способом, что беру первый байт в файле в символе ASCII и перевожу его в двоичное представление (8 бит), добавляю в строку, потом следующий байт и также добавляю в строку, затем след. и так пока не закончится весь файл, все байты в нём, в итоге в строке очень длинная последовательность нудей и единиц. А потом уже рабоаю с этой строкой.


 
Просто_новичок   (2007-05-31 13:33) [25]

Сергей М., "Хафман, наверно, завещал тебе работать с бин.данными не иначе как в строковом виде ?)" - а как ещё можно, пример....


 
Сергей М. ©   (2007-05-31 13:33) [26]

Мда ..


 
Плохиш ©   (2007-05-31 13:34) [27]


> G_M_S ©   (31.05.07 13:24) [17]
>
> > Проверить - это твоё домашнее задание.
>
> Издеваешься над чайником?!!

Ну судя по [16] чайника здесь нет...


 
Сергей М. ©   (2007-05-31 13:37) [28]


> Просто_новичок   (31.05.07 13:33) [25]


> как ещё можно, пример....


Любое изобретение своего велосипеда желательно начать с изучения велосипедов, уже изобретенных другими людьми)

http://www.programmersforum.ru/showthread.php?t=3621


 
G_M_S ©   (2007-05-31 13:39) [29]


> что ты подразумеваешь под битовым числом

Бинарные данные.


>  в таблице перекодировки алгоритма Хаффмана

О ужас...


> А потом уже рабоаю с этой строкой.

ААААААА!!! ЛАМЕРЫ, ЛАМЕРЫ!!! СУКСЬ МАЗДАЙНАЯ!!! (с)Админ

Ты гонишь - РАБОТАТЬ СО СТРОКОЙ?!! Если можно делать БИТОВЫЕ операции с элементами массива БАЙТОВ?!!


 
default ©   (2007-05-31 13:44) [30]

а может мы зря всё это начали?:)
так бы и ускорял бы своё строковое удаление до потери пульса...:)


 
Просто_новичок   (2007-05-31 13:48) [31]

G_M_S, "Ты гонишь - РАБОТАТЬ СО СТРОКОЙ?!! Если можно делать БИТОВЫЕ операции с элементами массива БАЙТОВ?!!" - ты имеешь ввиду всё загнать в массив байт, например mass="13;86;255;34;211;77;63;149;54;83" и тд? Если бы у меня в s1 было бы ровно 8 бит, то так было бы может и проще, но у меня может быть, как 1 бит, так и 12 бит и даже больше, в зависимости от того, какая была входная комбинация при архивировании. И что по твоему проще брать 13, представлять как биты, проверять, если не хватает бит в символе ASCII 13, то добавлять ещё и след. символ, опять проверять, если же наоборот меньше, то удалить из 13, то есть "00001101", например "00001" а оставшееся как сделать, добавить нулями чтоли... и ведь "00001101" всё равно будет ведь в строке храниться. Или есть ещё какой-то способ, если есть что-то более лучшее, чем работа со строкой, то поделись или я тебя не правильно понял насчёт массива.


 
turbouser ©   (2007-05-31 13:53) [32]


> Просто_новичок   (31.05.07 13:48) [31]

Тоесть, про shl,shr,xor,or,and ты никогда не слышал...
Понятно.


 
Просто_новичок   (2007-05-31 13:54) [33]

Сергей М. "Любое изобретение своего велосипеда желательно начать с изучения велосипедов, уже изобретенных другими людьми)" - да, начать можно, скачал я тот файл, но там исполняемы файл и нет исходника, ты педлагаешь его дизассемблировать) У меня времени осталось 2 дня на то, чтобы сдать курсовик...


 
default ©   (2007-05-31 13:56) [34]

Просто_новичок   (31.05.07 13:54) [33]
когда будешь показывать преподу свой исходник предварительно дай выпить ему валерьянки чтобы не шарахнуло


 
turbouser ©   (2007-05-31 13:59) [35]


> Просто_новичок   (31.05.07 13:54) [33]

http://www.compression.ru/download/huff.html


 
Просто_новичок   (2007-05-31 14:00) [36]

turbouser, почему не слышал, слышал, но не пользовался, разве что or и and только. А на то чтобы с этим разобраться и переделать курсовик уйдёт минимум две недели, да и уверен, что возникнут какие-нибудь проблемы, на решение которых опять же понадобится дополнительное время. А как реализовать с помощью shl,shr,xor,or,and я пока вообще не представляю, надо разбираться, времни нет..., мне нужно как-то оптимизировать то что уже содано и не более того.


 
Просто_новичок   (2007-05-31 14:01) [37]

default, )))


 
default ©   (2007-05-31 14:03) [38]


> мне нужно как-то оптимизировать то что уже содано и не более
> того.


> Так вот, мне нужно найти в первой строке комбинацию "00101"
> и удалить её, она будет первой, так построен алгоритм, все
> другие комбинации исключены я делаю так:
> s:=copy(s,length(s1)+1,length(s)); Эта функция выполняется
> в программе очень много раз и очень тормозит её выполнение


что ты потом с этой строкой, кроме удаления своего, делаешь ещё?


 
Просто_новичок   (2007-05-31 14:07) [39]

Записываю в файл найденную комбинацию (удаляемую в строке), вот код:
AssignFile(ResFile,Directory+imfile+"."+ras);
Rewrite(ResFile,1);
kol:=0;
j:=0;
smas:="";
Reset(IshFile,1);
while not Eof(IshFile) do
begin
 inc(j); //
 BlockRead(IshFile,VremPam,1);
 CopyVremPam:=VremPam;
 VremPam:=CopyVremPam;
 if kol>=3 then
 begin
   s:=obr10in2(VremPam);
   smas:=smas+s;
 end;
 if VremPam=ord("|") then inc(kol);
end;
if j=FileSize(IshFile) then
begin
 smas:=copy(smas,1,length(smas)-32);
 ChElinFile:=length(smas)-StrToInt(CHdopsym);
 smas:=copy(smas,1,ChElinFile);
end;
if CHtypetree=50 then
begin
 n:=0;
 s:="";
 while n<>length(smas) do
 begin
  s:=s+smas[n+1];
  inc(n);
  m:=0;
  for i:=0 to length(MassTabPer)-1 do
  if copy(MassTabPer[i],1,length(s))=s then inc(m);

  k:=0;
  if m=1 then
  for i:=0 to length(MassTabPer) do
  if copy(MassTabPer[i],1,length(s))=s then break else inc(k);

  if m=1 then
  begin
   //inc(u);
   VremPam:=StrToInt(CopyDynMassBuk[k]);
   //mass[u]:=StrToInt(CopyDynMassBuk[k]);
   BlockWrite(ResFile,VremPam,1);
   smas:=copy(smas,length(MassTabPer[k])+1,length(smas));
   s:="";
   n:=0;
  end;
В массиве MassTabPer - как раз и хранится некая строка s1, в smas - строка s, то есть вся эта последовательность битов


 
default ©   (2007-05-31 14:12) [40]

никому нафиг не интересен твой код!(без обид, я к тому чтобы ты говорил по сути, а не бросаясь кусками кода)

я просто к тому, что если принять

> мне нужно как-то оптимизировать то что уже содано и не более
> того.

хочется узнать что делается ещё со своей строкой чтобы по-быстрому предложить ускорение иными способом(чтобы минимально затронуть уже готовый код)



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.031 c
2-1180680961
Gringoire
2007-06-01 10:56
2007.06.24
Защита БД


2-1180708978
FireMan_Alexey
2007-06-01 18:42
2007.06.24
Kak uznat MAC adres udalennogo COMPA?


15-1180338322
Капибара из дома
2007-05-28 11:45
2007.06.24
История про рогалики


2-1180679385
сирх
2007-06-01 10:29
2007.06.24
немогу разобраться с мемо


2-1180972887
crypt
2007-06-04 20:01
2007.06.24
Как из Memo сохранять и добавлять информацию в файл или в БД?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский