Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм проверки массива на отсутствие повторяющихся значений   Найти похожие ветки 

 
Urri   (2003-11-10 12:47) [0]

Добрый день всем.

Имеется: несортированный одномерный массив значений.
Нужно: проверить его на наличие повторяющихся значений.
Подскажите алгоритм, пожалуйста, кто сталкивался.

Заранее спасибо.


 
Mouse   (2003-11-10 12:53) [1]

for i:=1 to massend do
begin
for k:=1 to massend do
if (i <> k) and (massiv[i] = massiv[k]) then // Найденно совпадание
end;
end;


 
Urri   (2003-11-10 12:58) [2]

Эээээ ... пошустрее бы.
Вроде где-то видел красивый способ, но может быть и ошибаюсь.


 
mfender   (2003-11-10 12:59) [3]

А чем это не красиво и не шустро? Или массив гигабайтный? :))


 
staryx   (2003-11-10 13:01) [4]

Можно в 2 раза быстрее:
for i:=1 to massend do
begin
for k:=1 to i+1 do
if massiv[i] = massiv[k] then // Найденно совпадание
end;
end;


 
Mouse   (2003-11-10 13:02) [5]

Методов куча!,.. ты скажи что тебе надо конкретнее делать потом с результатом!


 
Urri   (2003-11-10 13:02) [6]

ну не мегабайтный, но приличный весьма ))
еще - массив из целых чисел, забыл сказать.


 
Mouse   (2003-11-10 13:03) [7]

можно даже так:
for i:=1 to massend do
begin
for k:= i to massend do
if (i <> k) and (massiv[i] = massiv[k]) then // Найденно совпадание
end;
end;
так шустрее!


 
Urri   (2003-11-10 13:03) [8]

надо просто факт - есть повторение или нет


 
Mouse   (2003-11-10 13:06) [9]

даже так:
for i:=1 to massend-1 do
begin
for k:=i+1 to massend do
if and massiv[i] = massiv[k] then // Найденно совпадание
end;
end;

Пишу на ходу!,.. проверяй на ошибки :-)


 
staryx   (2003-11-10 13:07) [10]

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


 
TUser   (2003-11-10 13:07) [11]

Можно разделить массив на несколько маленьких массивчиков (записать туда цифирь от 1 до 10, от 10 до 20 и т.д.). Тогда, если на единый массив надо времени n^2, то на разделение на маленькие - n (просмотреть весь массив), а накаждый из них потом уже по n^2/const. Хотя радикатьного ускорения это тебе не дасть - все равно O(n^2).
См. также www.algolist.manual.ru и faqs.org.ru


 
Mouse   (2003-11-10 13:08) [12]

and убери
if massiv[i] = massiv[k] then // Найденно совпадание


 
Urri   (2003-11-10 13:08) [13]

ok, спасибо, сделаем так пока, мож в дальнейшем озарение посетит :)))


 
Mouse   (2003-11-10 13:13) [14]


> staryx (10.11.03 13:07) [10]
> Если есть много памяти, то реализовать что-то типа сортировки
> вставками, т.е. методом половинного деления находим место
> вставки, проверяем, нет ли такого-же, вставляем. Если надо
> подробнее - попытаюсь...


Он же написал что массив несортированный

ты пока его отсортируешь.... сам понимаешь!,..
Надо просто сравнивать текушую ячейку со всеми последующими и так двигать текущую ячейку к концу массива!,..

Чем ближе к концу - тем быстрее он будет проверять!


 
Johnmen   (2003-11-10 14:21) [15]

Самое быстрое - сначала отсортировать к.-л. быстрым методом, а потом за один проход найти дубликат(ы)...


 
Adoon   (2003-11-10 14:27) [16]

Если я ошибаюсь - поправьте меня ( навеяно библиотекой STL ) - работает только если в Delphi можно узнать размер множества:
сделать один проход по массиву, занося в множество эти элементы
потом сравнить размеры массива и множества, если размеры множества (в библиотеке STL есть размер множества, а как в Delphi - не помню) меньше размеров массива, то были повторяющиеся элементы.


 
Adoon   (2003-11-10 14:35) [17]

Можно и без размеров обойтись:
на каждом этапе проверяем есть ли в множестве данный элемент,
если нет, то заносим его в это множество, иначе выходим из цикла и говорим, что у нас повторяющиеся элементы


 
Urri   (2003-11-10 14:46) [18]

в дельфях множество может только 256 ordinal значений включать


 
Anatoly Podgoretsky   (2003-11-10 14:58) [19]

В Дельфи есть тип TBits заменитель множества на больших массивах, для мегабайтного массива потребуется 128кб, всяко быстрее двух циклов будет.



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

Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
3-65735
ripp
2003-11-01 08:01
2003.11.20
Мастера такой вопрос. Можно ли в GBGrid


1-65923
Gennadiy
2003-11-01 19:53
2003.11.20
Отправка управляющих команд на принтер!!!


14-66067
Думкин
2003-10-30 04:56
2003.11.20
С днем рождения! 30 октября.


7-66136
Ig
2003-09-13 14:17
2003.11.20
Bios


3-65699
Gawk
2003-10-30 10:12
2003.11.20
Вопрос по FreeReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский