Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

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

 
Просто_новичок   (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]

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

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

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

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


 
G_M_S ©   (2007-05-31 14:47) [41]


>  но у меня может быть, как 1 бит, так и 12 бит и даже больше

Какая разница? Тебе надо удалить первые n бит из набора - проверь, сколько целых байт надо откинуть (n div 8) и сделай с остальными байтами массива shl (n mod 8) - ВСЕ!!! Любые операции можно провернуть с битовыми сдвигами, операторами AND, OR, XOR.


> И что по твоему проще брать 13, представлять как биты,
Это УЖЕ биты! Вся инфа в компе - биты!


> и ведь "00001101" всё равно будет ведь в строке храниться

Зачем?!!


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

Не факт - я знаю преподов, которые студентам могут и не такую фигню преподать...


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

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


>  CopyVremPam:=VremPam;  
>  VremPam:=CopyVremPam;

Улыбнуло :)))


>  s:=obr10in2(VremPam);
Что за батва? Перевод байта встроку побитово? ее тоже приведи - может, оптимизировать можно.


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

Извиняюсь, срочно отойти нужно было.
G_M_S ,
>  s:=obr10in2(VremPam);
Что за батва? Перевод байта встроку побитово? ее тоже приведи - может, оптимизировать можно. - да, перевод байта в строку бит. Вот функция:
function obr10in2(var VremPam:byte):string;
var
i:integer;
a,b,c:byte;
s:string;
begin
c:=VremPam;
s:="";
while c>=2 do
begin
 a:=trunc(c/2);
 b:=c-a*2;
 c:=a;
 s:=IntToStr(b)+s;
end;
b:=c;
s:=IntToStr(b)+s;
if length(s)<8 then
begin
 for i:=1 to 8-length(s) do
 s:="0"+s;
end;
Result:=s;
end;


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

>  CopyVremPam:=VremPam;  
>  VremPam:=CopyVremPam;

Улыбнуло :)))

А CopyVremPam нужна затем, что у меня в дальнейшем заитрается значение VremPam, пришлось хранить копию и потом присваивать предыдущее значение.


 
G_M_S ©   (2007-05-31 19:03) [44]


> А CopyVremPam нужна затем, что у меня в дальнейшем заитрается
> значение VremPam, пришлось хранить копию и потом присваивать
> предыдущее значение.

Строки ПОДРЯД идут. Смотриться глупо.


> function obr10in2

Ну-у-у, блин... Ессно тормозит.

function obr10in2(a: BYTE): String;
var
 i: Integer;
 b: Byte;
begin
 result := "";
 for I := 0 to 7 do
 begin
   b := a and (255 AND (1 shl i));
   if b = 0 then result := "0" + result
     else result := "1" + result;
 end;
end;


 
DrPass ©   (2007-06-01 00:04) [45]


> У меня времени осталось 2 дня на то, чтобы сдать курсовик.
> ..

А смысл? Если твой препод не полный овощ, ЭТО ты не сдашь... По крайней мере, в качестве алгоритма архивации


 
default ©   (2007-06-01 00:14) [46]

DrPass ©   (01.06.07 00:04) [45]
ну почему же
скажет делал как мог, понёс несколько моральных травм на форуме программистов, борос свою лень, не ходил с девочками гулять, не пил и тд
это же на самом деле целый подвиг!


 
G_M_S ©   (2007-06-01 10:41) [47]


> понёс несколько моральных травм на форуме программистов

...которые безвозвратно искалечили неокрепшую детскую психику :)))


> не ходил с девочками гулять, не пил

Не, так нагло врать нельзя... Препод все равно не поверит, зато осадочек у него останется.



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

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.049 c
9-1154357882
Nikss
2006-07-31 18:58
2007.06.24
.Net Framework&amp;Tetris


2-1180711141
WebSQLNeederr
2007-06-01 19:19
2007.06.24
Нужна информация по сокетам в Делфи 7 !!


1-1177569767
StriderMan
2007-04-26 10:42
2007.06.24
List из TNotifyEvent ов


4-1166968703
vertal
2006-12-24 16:58
2007.06.24
Нахождение имен всех com-портов в системе


10-1134298458
GanibalLector
2005-12-11 13:54
2007.06.24
COM-сервер