Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.54 MB
Время: 0.007 c
14-60815
Вадим
2002-07-18 21:39
2002.08.19
HTML редактор


3-60528
Megi
2002-07-30 12:12
2002.08.19
*.LCK файлы и борьба с ними, поделитесь опытом


1-60567
Брат
2002-08-07 16:58
2002.08.19
Сетевое окружение в OpenDialog


1-60633
ttt
2002-08-08 15:10
2002.08.19
Как динамически добавить фрейм на форму?


6-60771
ogu
2002-06-05 20:25
2002.08.19
Серверное приложение на Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский