![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копирование нестандартной длины строки [D6, Win95/98, WinXP]
Yurij-7 © (2005-02-23 16:44:00)Господа прошу помочь в следующей ситуации:
есть строка вида : "обороты 2180."
как из нее вытянуть только числовую векличину, в данном случае 2180, но может быть и 3 числа в конце строки.
Спасибо.
olookin (2005-02-23 18:30:00) [1][50] Юрий Зотов © (23.02.05 18:28)
Да, это убедительно...
Юрий Зотов (2005-02-23 18:28:00) [2]> olookin © (23.02.05 18:19) [46]
Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.
Почти то же самое происходит и в реальности. Никаких циклов.
Юрий Зотов (2005-02-23 18:28:00) [3]> olookin © (23.02.05 18:19) [46]
Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.
Почти то же самое происходит и в реальности. Никаких циклов.
olookin (2005-02-23 18:25:00) [4][47] begin...end © (23.02.05 18:24)
Внушительное различие. Складаю оружие и признаю Вашу правоту...
begin...end (2005-02-23 18:24:00) [5]> olookin © (23.02.05 18:18) [45]
Pentium 3, 533 МГц (только не смейтесь).
1. SymbolsCount = 100000: Count1 = 3953, Count2 = 3953, множество: 10 мс; Pos: 110 мс.
2. SymbolsCount = 1000000: Count1 = 39218, Count2 = 39218, множество: 10 мс; Pos: 1031 мс.
olookin (2005-02-23 18:19:00) [6][44] Юрий Зотов © (23.02.05 18:18)
Good а как?
olookin (2005-02-23 18:18:00) [7][43] begin...end © (23.02.05 18:13)
Да я не сомневаюсь. Насчет теста QueryPerformanceCounter - я тест этой функции делал с секундомером в руках. Что уж совсем по идиотски звучит...
А насколько различно по времени выполнение Ваших двух тестов (множество vs Pos)? Ну чтоб мне не пробовать....
Юрий Зотов (2005-02-23 18:18:00) [8]> olookin © (23.02.05 18:04) [39]
Все не так.
begin...end (2005-02-23 18:13:00) [9]> olookin © (23.02.05 18:11) [42]
Не думаю, что GetTickCount может в данном случае дать ошибку в 100 раз и более. Но если сомневаетесь - используйте QueryPerformanceCounter и сообщите, пожалуйста, о результатах.
olookin (2005-02-23 18:11:00) [10][40] begin...end © (23.02.05 18:07)
Может я и ошибаюсь, но GetTickCount не является точным методом определения времени выполнения КОНКРЕТНОЙ задачи. Может, лучше использовать QueryPerformanceFrequency/QueryPerformanceCounter?
Palladin (2005-02-23 18:07:00) [11]обойдешься всего лишь одним оператором IN
begin...end (2005-02-23 18:07:00) [12]> olookin © (23.02.05 17:54) [32]
Убыстряет.
const
SymbolsCount = 100000;
DecimalSymbols = '0123456789';
var
I: Integer;
S: string;
T1, T2, Count1, Count2: Cardinal;
begin
// Заполнение строки
SetLength(S, SymbolsCount);
Randomize;
for I := 1 to SymbolsCount do
S[I] := Chr(Random(255));
// Тест с множеством
Count1 := 0;
T1 := GetTickCount;
for I := 1 to Length(S) do
if S[I] in ['0'..'9'] then
Inc(Count1);
T1 := GetTickCount - T1;
// Тест с Pos
Count2 := 0;
T2 := GetTickCount;
for I := 1 to Length(S) do
if Pos(S[I], DecimalSymbols) > 0 then
Inc(Count2);
T2 := GetTickCount - T2;
ShowMessageFmt('Count1 = %d, Count2 = %d, множество: %d мс; Pos: %d мс', [Count1, Count2, T1, T2])
end.
olookin (2005-02-23 18:04:00) [13][38] Юрий Зотов © (23.02.05 18:02)
А реально? Согласитесь, что простым AND я не обойдусь, пытаясь выяснить вхождение элемента в множество. Надо так или иначе перебирать все эелемнты этого множества и проверять их на соответствие элементу. Тот же цикл.
Юрий Зотов (2005-02-23 18:02:00) [14]> olookin © (23.02.05 17:57) [35]
Отличается принципиально.
Проверка вхождения символа в строку - это цикл.
Проверка вхождения элемента во множество - близко к обыкновенному AND.
olookin (2005-02-23 18:01:00) [15][36] Antonn © (23.02.05 17:58)
Знаем. Инчае что мы вообще обрабатываем? Неизвестного формата данные?
Antonn (2005-02-23 17:58:00) [16]olookin © (23.02.05 17:56) [34]
но мы же не знаем какой сепаратор в тексте. Или знаем?
olookin (2005-02-23 17:57:00) [17][33] Юрий Зотов © (23.02.05 17:56)
Вот как? Почему? Есть множество из 10 элементов и строка из 10 символов. Неужели механизм сравнения для них отличается?
Юрий Зотов (2005-02-23 17:56:00) [18]> olookin © (23.02.05 17:54) [32]
В сотни раз. Если не в сотни тысяч раз.
olookin (2005-02-23 17:56:00) [19][31] Antonn © (23.02.05 17:54)
Нет, DecimalSeparator задается перед вызовом функции. Просто при конвертации строки будет считаться валидным сепаратором именно тот, что задан DecimalSeparator. Например, если есть строка "0,1235", а DecimalSeparator равен ".", то при вызове StrToFloat возникнет ошибка. А если перед этим установить DEcimalSeparator:=',', то ошибки не будет.
Antonn (2005-02-23 17:54:00) [20]olookin © (23.02.05 17:49) [27]
А при конвертации строки сепаратором является тот, которрый указан в DecimalSeparator. Так что разделителем может быть хоть символ "%"... Лишь бы это было учтено...
значит нужно еще прогнать строку и назначить сепаратор? А не накладно-ли?