Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.19;
Скачать: CL | DM;

Вниз

Подсчёт совпадений в массиве   Найти похожие ветки 

 
AL2002 ©   (2002-08-08 16:21) [0]

Как поизящнее подсчитать, сколько раз повторяется значение Arr[0] в массиве Arr[1..99999] of String;


 
Skier ©   (2002-08-08 16:23) [1]

>AL2002
два цикла и вперёд...


 
AL2002 ©   (2002-08-08 16:28) [2]

>два цикла и вперёд...
Значит, всё таки циклами (((((

А я так надеялся, что функция есть.


 
Skier ©   (2002-08-08 16:30) [3]

>AL2002


> А я так надеялся, что функция есть.


Даже если она и есть, ты думаешь она по-другому работает ?


 
AL2002 ©   (2002-08-08 16:34) [4]

>Даже если она и есть, ты думаешь она по-другому работает ?
Быстрее


 
Skier ©   (2002-08-08 16:35) [5]

>AL2002


> Быстрее


Поясни...


 
Странный Прохожий ©   (2002-08-08 16:39) [6]

Можно вести параллельный список (TList), в котором запоминаются контрольные суммы строк.
При поиске строки сначала проверяется ksm, если совпала -- проверяется сама строка.
Так быстрее.


 
AL2002 ©   (2002-08-08 16:41) [7]

>Skier
Ну, если на ассемблерных кодах и ещё как-то...

>Странный Прохожий
А вот это уже ИДЕЯ.



 
Skier ©   (2002-08-08 16:46) [8]

>Странный Прохожий


> Так быстрее.


Нужно ведь вычислять эту самую ksm - а это время, так что я бы
не сказал что будет так уж сильно быстрее.
Да и потом TList память будет кушать...

Ну в общем можно прикинуть что важнее быстрота или
съедаемая память...


 
kull ©   (2002-08-08 16:49) [9]


> Да и потом TList память будет кушать...

Где он ее буде кушать?
А посравнению с числом 99999, об этой памяти вообще можно забыть.


 
Anatoly Podgoretsky ©   (2002-08-08 16:50) [10]

Skier © (08.08.02 16:23)
А зачем второй цикл?


 
Skier ©   (2002-08-08 16:53) [11]

>kull

> А посравнению с числом 99999, об этой памяти вообще можно
> забыть.


Да это-то конечно, я говорю чисто про алгоритм...

>Anatoly Podgoretsky
Слушаю твой вариант...


 
Leran2002 ©   (2002-08-08 16:55) [12]

А почему Arr[0] а массив Arr[1..99999] of String;
Навер так должно быть: Arr[0..99999] of String;



 
AL2002 ©   (2002-08-08 16:55) [13]

>А зачем второй цикл?
Каждый элемент нужно проверить.


 
AL2002 ©   (2002-08-08 17:00) [14]

>А почему Arr[0] а массив Arr[1..99999] of String;
А мне так удобнее.


 
Leran2002 ©   (2002-08-08 17:05) [15]


> AL2002 © (08.08.02 17:00)

Типа удобнее ведь элемента Arr[0] нет в массиве (тебяж Delph обматерит)???
И как тебе надо сравнить строку со строкой, или еще надо искать подстроки???


 
AL2002 ©   (2002-08-08 17:18) [16]

>И как тебе надо сравнить строку со строкой, или еще надо искать
>подстроки???
Нет, только значения.

Ну ладно. Циклом так циклом.

Всем спасибо.


 
Leran2002 ©   (2002-08-08 17:20) [17]

Но если циклом то только одним и не больше, вот мой вариант:

var
Kol:integer;
begin
kol:=0;
for i:=1 to 99999 do
if (Pos(Arr[0],Arr[i])=1)and(Length(Arr[0])=Length(Arr[i])) then inc(kol);


ShowMessage(IntToStr(Kol));


 
Jeer ©   (2002-08-08 17:23) [18]

Если пользоваться только массивом, то можно делать быструю проверку по первому символу, при совпадении полностью проверять.


 
Skier ©   (2002-08-08 17:24) [19]

Shit. Я всё не так понял ! Я то думал что нужно узнать
количество повторений каждого эл-та массива.
А для случая автора конечно же нужен один цикл.

Устал...Пора спать... :)


 
Leran2002 ©   (2002-08-08 17:24) [20]


> Jeer © (08.08.02 17:23)

Умно, очень даже умно!!!


 
Jeer ©   (2002-08-08 17:26) [21]

for i:= 1 to N do
if s[1] =lst[i][1] then
if s = lst[i] then Inc(cnt);


 
Leran2002 ©   (2002-08-08 17:27) [22]


> Jeer © (08.08.02 17:26)

Не я точно парюсь, такую мудрилку написал... ;-))


 
AL2002 ©   (2002-08-08 17:33) [23]

Да. Нужно узнать количество повторений каждого элемента масства. Т.е. должен быть ещё один массив.


 
Skier ©   (2002-08-08 17:37) [24]

>AL2002

Ты всех запутал...:)


> Т.е. должен быть ещё один массив


Ты хотел сказать цикл ?


 
Jeer ©   (2002-08-08 17:37) [25]

>AL2002 © (08.08.02 16:21)
>Как поизящнее подсчитать, сколько раз повторяется значение Arr[0] в массиве Arr[1..99999] of String;

Вариант 2
Как поизящнее подсчитать, сколько раз повторяется значение Arr[i] в массиве Arr[1..99999] of String;



 
Leran2002 ©   (2002-08-08 17:39) [26]


> AL2002 © (08.08.02 17:33)

Дык, дык ничего не понял... В смысле скоко раз встречается каждая строка чоли???


 
Jeer ©   (2002-08-08 17:39) [27]

Есть массив 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]);




 
Anatoly Podgoretsky ©   (2002-08-08 17:42) [28]

Skier © (08.08.02 16:53)
Count := 0;
for i := 1 to 99999 do if Arr[i] = Arr[0] then Count := Count + 1


 
AL2002 ©   (2002-08-08 17:47) [29]

Хотя бы один элемент (Arr[0]) в массиве Arr[1..99999] Of String.
Надо узнать, сколько раз он повторяется.

А если узавать все элементы из массива Арр, значит, надо создать ещё один массив и записывать в него количества совпадений для каждого элемента массива Арр.


 
Skier ©   (2002-08-08 17:48) [30]

>Anatoly Podgoretsky
Да ! Для посчёта вхождения Arr[0] ты абсолютно прав !
(см. Skier © (08.08.02 17:24) ).
Но вот незадача - вдруг выясняется что автор хочет :

"Да. Нужно узнать количество повторений каждого элемента масства"

А это уже другой случай...


 
AL2002 ©   (2002-08-08 17:54) [31]

Да мне и первого случая у Анаталолия с головой хватит.
Спасибо, Анатолий, Скаер, Джиэр, ЛеранДвеТыщиДва, Кул.

Ал2002, вы болван.


 
2002LA   (2002-08-08 17:56) [32]

Эк меня покорежило от ваших постов :^[


 
Anatoly Podgoretsky ©   (2002-08-08 17:57) [33]

Skier © (08.08.02 17:48)
Я тебея понимаж, но вопрос был поставлен одназначно, поэтому и ответ одназначный, единственно о чем стоит спорить изящный мой ответ или нет.


 
Skier ©   (2002-08-08 18:00) [34]

>Anatoly Podgoretsky
Правильный ответ всегда(!) изящнее неправильного...:)))


 
AL2002 ©   (2002-08-08 18:04) [35]

>2002LA
Неправильно элементы подсчитал?

>Anatoly Podgoretsky
>изящный мой ответ или нет.
Да.



 
MBo ©   (2002-08-08 18:22) [36]

если все же когда-нибудь придет мысль использовать вместо массива список, то подойдет нечто подобное


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), в котором хранится их количество.



 
MBo ©   (2002-08-08 18:24) [37]

Кстати, при таком количестве надо подумать о хэшировании!


 
AL2002 ©   (2002-08-08 18:35) [38]

>MBo
Кода много. А точно будет быстрее?


 
MBo ©   (2002-08-08 18:40) [39]

если у тебя действительно десятки тысяч строк, то нужно использовать хэширование - вот это будет быстрее.


 
AL2002 ©   (2002-08-08 18:59) [40]

Fuf.



Страницы: 1 2 вся ветка

Текущий архив: 2002.08.19;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.018 c
6-60795
Wather
2002-06-05 23:47
2002.08.19
Помогите разобраться!


1-60627
@andrew
2002-08-08 15:25
2002.08.19
ПРИВЕТ ВСЕМ!! Прошу прощения, но... что нужно сделать,


3-60485
vich
2002-07-25 02:28
2002.08.19
Пытаюсь сравнить дату из базы с системной и выдать сообщение.


1-60678
X-jedy
2002-08-06 12:20
2002.08.19
Использование TStringList


3-60534
DieHard
2002-07-30 14:34
2002.08.19
Приоритет запроса