![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчёт совпадений в массиве [D6, Win95/98]
AL2002 © (2002-08-08 16:21:00)Как поизящнее подсчитать, сколько раз повторяется значение Arr[0] в массиве Arr[1..99999] of String;
MBo (2002-08-09 06:46:00) [1]>AL2002
Нужно бы полностью поставить задачу. Вполне возможно, подойдут другие пути решения - например, добавление строк в сортированный список без повторов с отслеживанием количества каждого элемента.
TTCustomDelphiMaster (2002-08-08 22:02:00) [2]Если массив строк береться из БД тогда можно его сразу отсортировать по алфавиту, а потом ...
Jeer (2002-08-08 21:14:00) [3]Вот это
for i:= 1 to N do
if s[1] =lst[i][1] then
if s = lst[i] then Inc(cnt);
быстрее чем
for i:= 1 to N do
if s = lst[i] then Inc(cnt);
примерно в 2-3 раза, зависит от соотношений.
AL2002 (2002-08-08 19:00:00) [4]Т.е. ага.
AL2002 (2002-08-08 18:59:00) [5]Fuf.
MBo (2002-08-08 18:40:00) [6]если у тебя действительно десятки тысяч строк, то нужно использовать хэширование - вот это будет быстрее.
AL2002 (2002-08-08 18:35:00) [7]>MBo
Кода много. А точно будет быстрее?
MBo (2002-08-08 18:24:00) [8]Кстати, при таком количестве надо подумать о хэшировании!
MBo (2002-08-08 18:22:00) [9]если все же когда-нибудь придет мысль использовать вместо массива список, то подойдет нечто подобное
for i:=0 to StringList.Count-1 do begin
k:=StringList.IndexOf(StringList[i]);
if (k<>i) and (k>=0) then begin
StringList.Objects[k]:=
Pointer(Integer(StringList.Objects[k])+1);
StringList.Objects[i]:=Pointer(1000000+k);
end else
StringList.Objects[i]:=Pointer(1);
теперь, если Integer(Objects[i])<1000000, то в нем содержится количество таких строк в списке, а если больше, то номер первого элемента(+1000000), в котором хранится их количество.
AL2002 (2002-08-08 18:04:00) [10]>2002LA
Неправильно элементы подсчитал?
>Anatoly Podgoretsky
>изящный мой ответ или нет.
Да.
Skier (2002-08-08 18:00:00) [11]>Anatoly Podgoretsky
Правильный ответ всегда(!) изящнее неправильного...:)))
Anatoly Podgoretsky (2002-08-08 17:57:00) [12]Skier © (08.08.02 17:48)
Я тебея понимаж, но вопрос был поставлен одназначно, поэтому и ответ одназначный, единственно о чем стоит спорить изящный мой ответ или нет.
2002LA (2002-08-08 17:56:00) [13]Эк меня покорежило от ваших постов :^[
AL2002 (2002-08-08 17:54:00) [14]Да мне и первого случая у Анаталолия с головой хватит.
Спасибо, Анатолий, Скаер, Джиэр, ЛеранДвеТыщиДва, Кул.
Ал2002, вы болван.
Skier (2002-08-08 17:48:00) [15]>Anatoly Podgoretsky
Да ! Для посчёта вхождения Arr[0] ты абсолютноправ !
(см. Skier © (08.08.02 17:24) ).
Но вот незадача - вдруг выясняется что автор хочет :
"Да. Нужно узнать количество повторений каждого элемента масства"
А это уже другой случай...
AL2002 (2002-08-08 17:47:00) [16]Хотя бы один элемент (Arr[0]) в массиве Arr[1..99999] Of String.
Надо узнать, сколько раз он повторяется.
А если узавать все элементы из массива Арр, значит, надо создать ещё один массив и записывать в него количества совпадений для каждого элемента массива Арр.
Anatoly Podgoretsky (2002-08-08 17:42:00) [17]Skier © (08.08.02 16:53)
Count := 0;
for i := 1 to 99999 do if Arr[i] = Arr[0] then Count := Count + 1
Leran2002 (2002-08-08 17:39:00) [18]
> AL2002 © (08.08.02 17:33)
Дык, дык ничего не понял... В смысле скоко раз встречается каждая строка чоли???
Jeer (2002-08-08 17:39:00) [19]Есть массив A[N]
Делаем второй массив I[N]: integer;
for i:= 1 to N do
if s[1] =lst[i][1] then
if s = lst[i] then Inc(I[i]);
Jeer (2002-08-08 17:37:00) [20]>AL2002 © (08.08.02 16:21)
>Как поизящнее подсчитать, сколько раз повторяется значение Arr[0] в массиве Arr[1..99999] of String;
Вариант 2
Как поизящнее подсчитать, сколько раз повторяется значение Arr[i] в массиве Arr[1..99999] of String;