![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функции для работы со строками.
Просто_новичок © (2007-05-31 13:02:00)Подскажите плиз, какие есть функии для работы со строками, но чтобы были как можно быстрее в выполнении. Функция copy как я понял очень медленная, как и Pos.
А задача вобщем в следующем, есть строка, например: s="00101010010111001010101001101001010100101010101011010010111011000010101101011 0101001010110000001111010101", только раз так в 1000 подлиннее, а то и больше...
И есть вторая строка, например: s1="00101". Так вот, мне нужно найти в первой строке комбинацию "00101" и удалить её, она будет первой, так построен алгоритм, все другие комбинации исключены, я делаю так:
s:=copy(s,length(s1)+1,length(s)); Эта функция выполняется в программе очень много раз и очень тормозит её выполнение, как можно сделать тоже самое, но с помощью других функций, болеебыстродействующих, какие есть болеебыстродействующие функции?
G_M_S (2007-06-01 10:41:00) [1]
> понёс несколько моральных травм на форуме программистов
...которые безвозвратно искалечили неокрепшую детскую психику :)))
> не ходил с девочками гулять, не пил
Не, так нагло врать нельзя... Препод все равно не поверит, зато осадочек у него останется.
default (2007-06-01 00:14:00) [2]DrPass © (01.06.07 00:04) [45]
ну почему же
скажет делал как мог, понёс несколько моральных травм на форуме программистов, борос свою лень, не ходил с девочками гулять, не пил и тд
это же на самом деле целый подвиг!
DrPass (2007-06-01 00:04:00) [3]
> У меня времени осталось 2 дня на то, чтобы сдать курсовик.
> ..
А смысл? Если твой препод не полный овощ, ЭТО ты не сдашь... По крайней мере, в качестве алгоритма архивации
G_M_S (2007-05-31 19:03:00) [4]
> А 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;
Просто_новичок (2007-05-31 17:15:00) [5]> CopyVremPam:=VremPam;
> VremPam:=CopyVremPam;
Улыбнуло :)))
А CopyVremPam нужна затем, что у меня в дальнейшем заитрается значение VremPam, пришлось хранить копию и потом присваивать предыдущее значение.
Просто_новичок (2007-05-31 17:13:00) [6]Извиняюсь, срочно отойти нужно было.
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;
G_M_S (2007-05-31 14:47:00) [7]
> но у меня может быть, как 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);
Что за батва? Перевод байта встроку побитово? ее тоже приведи - может, оптимизировать можно.
default (2007-05-31 14:12:00) [8]никому нафиг не интересен твой код!(без обид, я к тому чтобы ты говорил по сути, а не бросаясь кусками кода)
я просто к тому, что если принять
> мне нужно как-то оптимизировать то что уже содано и не более
> того.
хочется узнать что делается ещё со своей строкой чтобы по-быстрому предложить ускорение иными способом(чтобы минимально затронуть уже готовый код)
Просто_новичок (2007-05-31 14:07:00) [9]Записываю в файл найденную комбинацию (удаляемую в строке), вот код:
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:03:00) [10]
> мне нужно как-то оптимизировать то что уже содано и не более
> того.
> Так вот, мне нужно найти в первой строке комбинацию "00101"
> и удалить её, она будет первой, так построен алгоритм, все
> другие комбинации исключены я делаю так:
> s:=copy(s,length(s1)+1,length(s)); Эта функция выполняется
> в программе очень много раз и очень тормозит её выполнение
что ты потом с этой строкой, кроме удаления своего, делаешь ещё?
Просто_новичок (2007-05-31 14:01:00) [11]default, )))
Просто_новичок (2007-05-31 14:00:00) [12]turbouser, почему не слышал, слышал, но не пользовался, разве что or и and только. А на то чтобы с этим разобраться и переделать курсовик уйдёт минимум две недели, да и уверен, что возникнут какие-нибудь проблемы, на решение которых опять же понадобится дополнительное время. А как реализовать с помощью shl,shr,xor,or,and я пока вообще не представляю, надо разбираться, времни нет..., мне нужно как-то оптимизировать то что уже содано и не более того.
turbouser (2007-05-31 13:59:00) [13]
> Просто_новичок (31.05.07 13:54) [33]
http://www.compression.ru/download/huff.html
default (2007-05-31 13:56:00) [14]Просто_новичок (31.05.07 13:54) [33]
когда будешь показывать преподу свой исходник предварительно дай выпить ему валерьянки чтобы не шарахнуло
Просто_новичок (2007-05-31 13:54:00) [15]Сергей М. "Любое изобретение своего велосипеда желательно начать с изучения велосипедов, уже изобретенных другими людьми)" - да, начать можно, скачал я тот файл, но там исполняемы файл и нет исходника, ты педлагаешь его дизассемблировать) У меня времени осталось 2 дня на то, чтобы сдать курсовик...
turbouser (2007-05-31 13:53:00) [16]
> Просто_новичок (31.05.07 13:48) [31]
Тоесть, про shl,shr,xor,or,and ты никогда не слышал...
Понятно.
Просто_новичок (2007-05-31 13:48:00) [17]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" всё равно будет ведь в строке храниться. Или есть ещё какой-то способ, если есть что-то более лучшее, чем работа со строкой, то поделись или я тебя не правильно понял насчёт массива.
default (2007-05-31 13:44:00) [18]а может мы зря всё это начали?:)
так бы и ускорял бы своё строковое удаление до потери пульса...:)
G_M_S (2007-05-31 13:39:00) [19]
> что ты подразумеваешь под битовым числом
Бинарные данные.
> в таблице перекодировки алгоритма Хаффмана
О ужас...
> А потом уже рабоаю с этой строкой.
ААААААА!!! ЛАМЕРЫ, ЛАМЕРЫ!!! СУКСЬ МАЗДАЙНАЯ!!! (с)Админ
Ты гонишь - РАБОТАТЬ СО СТРОКОЙ?!! Если можно делать БИТОВЫЕ операции с элементами массива БАЙТОВ?!!
Сергей М. (2007-05-31 13:37:00) [20]
> Просто_новичок (31.05.07 13:33) [25]
> как ещё можно, пример....
Любое изобретение своего велосипеда желательно начать с изучения велосипедов, ужеизобретенных другими людьми)
http://www.programmersforum.ru/showthread.php?t=3621