Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
ВнизПодсчёт совпадений в массиве Найти похожие ветки
← →
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.
← →
AL2002 (2002-08-08 19:00) [41]Т.е. ага.
← →
Jeer (2002-08-08 21:14) [42]Вот это
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 раза, зависит от соотношений.
← →
TTCustomDelphiMaster (2002-08-08 22:02) [43]Если массив строк береться из БД тогда можно его сразу отсортировать по алфавиту, а потом ...
← →
MBo (2002-08-09 06:46) [44]>AL2002
Нужно бы полностью поставить задачу. Вполне возможно, подойдут другие пути решения - например, добавление строк в сортированный список без повторов с отслеживанием количества каждого элемента.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c