![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Избавление от нулей в строчке???
CCCatch © (2002-08-21 12:40:00)Как удалить все имеющиеся нули из Edit1??
Alx2 (2002-08-22 08:28:00) [1]>Anatoly Podgoretsky © (21.08.02 17:33)
>Не вижу смысла в оптимизации, речь идет об Edit.Text не те
>размеры, даже цикл while Pos("0", ) будет слишком быстрый
Да, конечно. В этом частном случае.
Но когда, например, в UBPFD появляются "кривые" в этом плане примеры, невольно задумаешся откуда же растут ноги....
McSimm (2002-08-21 17:56:00) [2]>Anatoly Podgoretsky © (21.08.02 17:33)
Разумеется. Весь этот спор шутки ради.
Мы уже закончили.
Ученик (2002-08-21 17:47:00) [3]>CCCatch (21.08.02 12:40)
Так может просто не давать их вводить ? :)
Anatoly Podgoretsky (2002-08-21 17:33:00) [4]Не вижу смысла в оптимизации, речь идет об Edit.Text не те размеры, даже цикл while Pos("0", ) будет слишком быстрый
Alx2 (2002-08-21 17:14:00) [5]>Толик © (21.08.02 16:29)
Так... пальцы размять, отдохнуть...
Alx2 (2002-08-21 17:03:00) [6]>Alx2 © (21.08.02 17:02)
Ребята, сорри!
Веткой ошибся.
Alx2 (2002-08-21 17:02:00) [7]
procedure UniversalDelete(Var Arr; ArrSize : Integer; ElemSize, DeleteIdx : Integer);
Var
Source, Dest : Integer;
DummyArr : array of char absolute Arr;
Begin
ArrSize := ArrSize * ElemSize;
Source := (DeleteIdx+1)*ElemSize;
Dest := Source-ElemSize;
Move(DummyArr[Source],DummyArr[Dest],ArrSize-(DeleteIdx+1)*ElemSize);
SetLength(DummyArr,ArrSize div ElemSize - 1);
End;
Пример использования:
Var
SS : array of integer;
begin
setlength(SS,10);
for k := 0 to 9 do SS[k] := (k);
UniversalDelete(SS,Length(SS),SizeOf(SS[0]),2);
Первый параметр - массив.
Второй - количество элементов в нем
Третий - размер одного элемента массива
Четвертый - номер удаляемого элемента (считая с нуля).
PS.
Будь осторожен. Написано в черновую, хоть глюков пока не замечено (но потенциально может испортить работу менеджера памяти - надо проверить)
McSimm (2002-08-21 16:56:00) [8]Толик © (21.08.02 16:29)
Не очень понятно о чём спор?
На самом деле абсолютно ни о чем :)
Толик (2002-08-21 16:29:00) [9]Не очень понятно о чём спор? Т.к. последовательность не сортированная, то кроме последовательного перебора здесь ничего не придумать. Весь вопрос сводится к тому, что "очищенные" данные надо не сдвигать, а переносить предварительно выделенное место.
Ученик (2002-08-21 16:20:00) [10]A2 = 1.44675868796185E-6
A3 = 1.44675868796185E-6
A2 - A3 = 0
Alx2 (2002-08-21 16:14:00) [11]>McSimm © (21.08.02 16:09)
Ничья - нечестно :)
В предлагшаемой оценке времени есть случайные колебания. Посему время испытания должно быть достаточным, чтобы достаточно уменьшить влияние помех.
McSimm (2002-08-21 16:09:00) [12]>Alx2 © (21.08.02 15:27)
A2 = 2,16435000766069E-6
A3 = 2,17592605622485E-6
A2 - A3 = -1,15760485641658E-8
Предлагаю ничью и завязываем с этой темой :)
>Вдесятеро больший цикл
Это уже другая ситуация:
"для некоторыхситуаций следующая функция работает быстрее"
Alx2 (2002-08-21 15:34:00) [13]Вдесятеро больший цикл:
Memo1
A2 = 1.73842563526705E-5
A3 = 1.69328704942018E-5
A2 - A3 = 4.51385858468711E-7
Снова мой алгоритм победил.
Alx2 (2002-08-21 15:27:00) [14]Memo1:
A2 = 1.62037031259388E-6
A3 = 1.50463165482506E-6
A2 - A3 = 1.15738657768816E-7
УГУ :(
-------------
Ха-ха!
???
McSimm (2002-08-21 15:20:00) [15]Соревнования !
Дуель !
:)
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
D2, D3: TDateTime;
begin
D2 := Now;
for I := 1 to 100000 do
A2(IntToStr(I));
D2 := Now - D2;
D3 := Now;
for I := 1 to 100000 do
A3(IntToStr(I));
D3 := Now - D3;
Memo1.Lines.Add("A2 = "+FloatToStr(D2));
Memo1.Lines.Add("A3 = "+FloatToStr(D3));
Memo1.Lines.Add("A2 - A3 = "+FloatToStr(D2-D3));
if D2 < D3 then ShowMessage("АГА :)")
else ShowMessage("УГУ :(")
end;
Ага !
Alx2 (2002-08-21 15:07:00) [16]>lak_b © (21.08.02 14:32)
Не мешай извращаться :)
>McSimm © (21.08.02 14:41)
При таком подходе это все-таки быстрее: :)
function a3(const S: string): string;
var k, l: integer;
begin
Result := S;
l := pos("0", Result);
if l > 0 then
begin
for k := l + 1 to Length(Result) do
if Result[k] <> "0" then
begin
Result[l] := Result[k];
inc(l);
end;
SetLength(Result, l - 1);
end;
end;
McSimm (2002-08-21 14:41:00) [17]>lak_b © (21.08.02 14:32)
:) Не придирайся, ну не спросил, пусть самим интересно, какая разница ?
>Alx2 ©
например на таком тесте:
for I := 1 to 100000 do A2(IntToStr(I))
McSimm (2002-08-21 14:33:00) [18]>Alx2 ©
Согласен, твой вариант быстрее. Но, как ты уже сам подметил, это не тот случай где нужна подобная оптимизация :)
Хотя, ты наверное будешь удивлен, для некоторых ситуаций следующая функция работает быстрее :)
function A2(const S: String): String;
var i: Integer;
begin
Result := S;
for i := Length(Result) downto 1 do
if Result[i] = "0" then Delete(Result, i, 1)
end;
lak_b (2002-08-21 14:32:00) [19]не... ну запарили с такими вопросами... можд ещё компонент такой забацать?! вот они - программисты... ладнаб ещё спросил, какой самый быстрый способ сабжа...
Alx2 (2002-08-21 14:24:00) [20]>McSimm © (21.08.02 13:32)
>if S1[i] <> "0" then S2 := S2 + S1[i],
>то IMHO это намного медленнее
Того же порядка: O(n^2)