Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Избавление от нулей в строчке???


Страницы:   1 2

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)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо