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

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

Сколько различных символов содержит строка. [D7, XP]


Страницы:   1 2

Б ©   (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, если найден, то просто увеличиваем счетчик.

Конкретные вопросы по реализации будут — велкам.


Страницы:   1 2

Наверх

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