powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Поиск одинаковых элементов
9 сообщений из 9, страница 1 из 1
Поиск одинаковых элементов
    #35809549
W_and_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача:
Есть массив элементов, нужно максимально быстро определить есть ли в нем повторяющиеся элементы.
Решение которое напрашивается сразу:
Брать каждый элемент и сравнивать его с впереди стоящими, до тех пор пока не найдем равные или не дойдем до последнего. Итого придется сделать до n*(n-1)/2 сравнений.
Внимание, уважаемые знатоки, вопрос:
Это самый эффективный алгоритм? или есть лучше (если вообще существуют)?

Например, решение, которое напрашивается не стразу :
Прозводим сортировку массива, а далее сравниваем лишь соседние элементы. Итого, если будем использовать QSort, мы можем получить O(n*log n)*(n-1), т.е. O(n^2 * log n), а в худшем случае так вообще O(n^3). Вроде бы не лучше, но ведь можно модернизировать сортировку под наши цели, а также оптимизировать ее с учетом того, что известна некоторая статистическая информация о входных данных.

Более конкретная постановка задачи: проверяем корректность одного FAT сектора OLE2 контейнера ( WindowsCompoundBinaryFileFormatSpecification.pdf ). Такой сектор зачастую состоит из 128 DWORD'ов. Они зачастую располагаются возрастающими цепочками: 1h, 2h, 3h, ...., 12h. Между цепочками могут быть значения DWORD(-1), DWORD(-2), DWORD(-3) или DWORD(-4), которые вполне легально могут повторяться, остальные значения повторяться не могут.
Итак, повторю, надо максимально быстро проверить, что нет повторяющихся значений, кроме "легальных". Важен сам факт повтора, позиция и значение узнавать не обязательно. Вот такая вот задачка, прошу помощи =)
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35809565
авторЕсть массив элементов, нужно максимально быстро определить есть ли в нем повторяющиеся элементы.
смотря какой разброс диапазон значений массива, если малый, то начинаешь пробего с первого элемента и складируешь элементы в множество, и смотришь, имеется ли данный во множестве. если да, то значит хотя бы один да уже есть и ты на нем находишься.
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35809702
Фотография Aklin J
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сортировка log(n)*n + пробег по соседним значениям n = (1 + log(n))*n

4 8 15 16 23 42
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35810096
W_and_GПрозводим сортировку массива, а далее сравниваем лишь соседние элементы. Итого, если будем использовать QSort, мы можем получить O(n*log n)*(n-1), т.е. O(n^2 * log n), а в худшем случае так вообще O(n^3). Вроде бы не лучше, но ведь можно модернизировать сортировку под наши цели, а также оптимизировать ее с учетом того, что известна некоторая статистическая информация о входных данных.
Нет же. Сортировка и сравнение - два последовательных этапа, их сложности складываются, O(n*log(n)) "съедает" O(n-1), так что никакого куба не будет, Aklin J прав.
Подозреваю, что это наиболее оптимальный вариант.
Только если нужна гарантированная (а не средняя) скорость, то не QSort, конечно, а что-нибудь типа пирамидальной сортировки нужно использовать.
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35812175
W_and_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за идею про множества, правда там разброс все же большой, но помница большие множества частенько на бинарных деревьях делают, это можно как-нибудь использовать.

А после того как посмотрел сюда: http://ru.wikipedia.org/wiki/Пирамидальная_сортировка, то окончательно убедился, что вариант с деревьями возможно будет наилучшим.

Всем отписавшимся спасибо! =)
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35813854
Valer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется задачу возможно решить за 1 проход по массиву элементов
без сортировки
следующим образом:

создаем массив возможных значений DWORD ( к сожалению не знаю типа данных)
например
для двухбайтных элементов это будет
массив 0 ... 65655
для однобайтных массив 0...255
условно назовем флагов ( биты )

просматривая исходный массив
по значению элемента исходного массива лезем в массив флагов
если флаг =0 ставим его в 1
если флаг уже = 1 то фиксируем повтор элементов
в принципе в массив флагов можно писать не значение DWORD,
а некую функцию от него
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35814478
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valerсоздаем массив возможных значений DWORD ( к сожалению не знаю типа данных)
например
для двухбайтных элементов это будет
массив 0 ... 65655
для однобайтных массив 0...255
условно назовем флагов ( биты )

просматривая исходный массив
по значению элемента исходного массива лезем в массив флагов
если флаг =0 ставим его в 1
если флаг уже = 1 то фиксируем повтор элементов
делал нечто подобное когда-то, когда нужно было определить. есть ли в FAT перекрёстные ссылки. в принципе работает, и нужен всего 1 проход. но если разброс большой, то нужно много памяти, т.к. размер массива равен кол-ву элементов / 8
так, посчитал, для 320 ГБ винта нужно всего-лишь 10 метров памяти - не так и много
а для перебора 4-байтных значений - пол гигабайта - многовато
P.S. 2Valer - в DWORD 65536 помещается, а не 65656
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35814487
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valerв принципе в массив флагов можно писать не значение DWORD,
а некую функцию от неговот этого не понял, поэтому добавлю от себя
создаётся обнулённый массив битов, значение элемента равно номеру бита
...
Рейтинг: 0 / 0
Поиск одинаковых элементов
    #35814720
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курить в сторону Хеш-функций. Смысл - из одного массива создается несколько маленьких. Одинаковые значения гарантированно лежат в одном подмассиве ( хеш функция однозначна в прямом направлении ).
Стоимость в идеале: Подсчет хеш - n ( 1 проход ), проход - (1+log(n/m))*n/m где m - число подмножеств.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Поиск одинаковых элементов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]