![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сколько различных символов содержит строка. [D7, XP]
Б © (2010-01-19 21:11:00)Здрасти!
Остановился тут на 1-й задачке:
Определелить сколько различных символов содержит строка.
Anatoly Podgoretsky (2010-01-20 11:50:00) [1]> Германн (20.01.2010 01:16:18) [18]
На некоторых процессорах ADD M, 1 выполняется быстрее INC M.
А еще увеличение может быть на больший размер.
Я бы не старался угадать, что будет быстрее и использовал бы всегда M + N
Anatoly Podgoretsky (2010-01-20 11:46:00) [2]> Юрий Зотов (20.01.2010 00:54:16) [16]
и плюс второй цикл
N :=0;
for I := Low(arr) to High(Arr) do
if Arr[i]> 0 then N := N +1;
Б (2010-01-20 11:35:00) [3]Всем спасибо, выручили.
Воспользовался antonn'овским методом. ;)
Sha (2010-01-20 10:46:00) [4]> Самое элегантное решение.
Интересно, есть ли минусы у этого решения? :)
> использовать Inc вместо +1 ввиду "повышенной скорости"?
> он все равно +1 заменяет на inc()
И правильно делает, на современных процессорах машинная Inc может только уменьшить скорость
Германн (2010-01-20 02:19:00) [5]
> antonn © (20.01.10 02:09) [21]
>
> Он - дельфи :)
>
Ну тогда так и говори. Он - оптимизатор дельфи компилятора.
Но ты вообще не в теме [18].
antonn (2010-01-20 02:09:00) [6]Он - дельфи :)
http://antonn.com/xlam/delp_inc.JPG
Германн (2010-01-20 01:54:00) [7]
> antonn © (20.01.10 01:50) [19]
>
> повышенная скорость в отладчике не сильно заметна, т.к.
> он все равно +1 заменяет на inc()
>
Он - это отладчик? А это как собственно?
antonn (2010-01-20 01:50:00) [8]повышенная скорость в отладчике не сильно заметна, т.к. он все равно +1 заменяет на inc()
Германн (2010-01-20 01:16:00) [9]
> Юрий Зотов © (20.01.10 00:54) [16]
Самое элегантное решение.
В духе Борланда однопроходное! :)
В духе Дельфи тем, что массив должен быть полем ("Поллем. Как слышишь? Приём.") И использоваться только однократно при запуске приложения. :)
В духе БорландПаскаль тем, что использует Inc вместо +1. (Кстати. Дельфийский хелп всё ещё советует использовать Inc вместо +1 ввиду "повышенной скорости"? Кто имеет последние версии Дельфи).
Anatoly Podgoretsky (2010-01-20 01:03:00) [10]> turbouser (19.01.2010 22:36:10) [10]
Да хоть Юникод, просто размер будет побольше, 64к элементов байт/Integer
Юрий Зотов (2010-01-20 00:54:00) [11]var
Arr: array[char] of integer;
for i := 1 to Length[S] do
Inc(Arr[S[i]]);
{RASkov} (2010-01-20 00:25:00) [12]
function CountUnicChInStr(const S: String): Integer;
var N: Integer;
begin
with TStringList.Create do try
Duplicates:=dupIgnore;
Sorted:=True;
for N:= 1 to Length(S) do Add(S[N]);
Result:=Count;
finally
Free;
end;
end;
Sha (2010-01-20 00:09:00) [13]> Б (19.01.10 21:11)
Есть еще вариант со множеством, аналогичный [8].
Реализуй сам.
oxffff (2010-01-19 23:52:00) [14]Case insensitivity?
P.S
ответ 6.
sniknik (2010-01-19 23:00:00) [15]> Не думая о вопросах производительности
берем первый символ, бежим по строке до конца считаем совпадения с ним, выводим посчитанное, символ - количество. делаем стрингреплесе этого символа на пустую строку (т.е. исключаем его из строки), и повторяем операцию заново до тех пор пока вся строка не "опустеет".
turbouser (2010-01-19 22:37:00) [16]
> antonn © (19.01.10 22:26) [8]
> Вариант для однобайтовых кодировок :)
Аа :) Сорри :)
turbouser (2010-01-19 22:36:00) [17]
> antonn © (19.01.10 22:26) [8]
>
> или завести статический массив array[0..256-1]
unicode?
Демо (2010-01-19 22:30:00) [18]
var
Chars: array[0..255] of Integer;
i: Integer;
begin
ZeroMemory(@Chars[0],1024);
for i := 1 to Length(SrcStr) do Chars[Ord(SrcStr[i])] := Chars[Ord(SrcStr[i])]+1;
antonn (2010-01-19 22:26:00) [19]или завести статический массив array[0..256-1] of boolean;, в цикле пробегать по сроке и ставить true в массиве по индексу ord(). После пробега посчитать все true в массиве. Вариант для однобайтовых кодировок :)
Джо (2010-01-19 22:13:00) [20]Не думая о вопросах производительности, можно сделать так:
1. Заводим (динамический) массив для хранения информации об использованных символах:
type
// Информация о конкретной букве
TLetter = record
Value: Char;
Count: Integer;
end;
TLetters = array of TLetter;
var
Letters: TLetters;
2. Проходим по каждому символу строки:
for I := 1 to Length(S) do
3. Каждый следующий символ S[I] ищем в массиве Letters, если он не найден, добавляем его в массив и счетчик ставим в 1, если найден, то просто увеличиваем счетчик.
Конкретные вопросы по реализации будут — велкам.