Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2008, 16:29   #1
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию Существование элемента в массиве

Есть последовательность чисел (например, берётся из файла), максимум длины 70000. Числа пронумерованы 1..n. Далее вводятся 3 числа l, r, v. Определить, существует ли v в последовательности от номера l до r (вывести 1) или нет (вывести 0). Нужно осуществить поиск как можно быстрее.
Carbon вне форума Ответить с цитированием
Старый 31.03.2008, 16:36   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Быстрее чем обычный перебор у тебя ничего не получиться, за исключением случаю, что у тебя массив отсортирован. А так:
ar - это массив куда ты заггрузишь всю последовательность
Код:
flag := false;
for i:= l to r do
if v=ar[i] then 
begin
flag:= true;
break;
end;
if flag = true then
writeln('1')
else writeln('0');
Hollander вне форума Ответить с цитированием
Старый 31.03.2008, 16:42   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

У меня получалось быстрее:
1) пирамидальная сортировка+бинарный поиск.
2) создание бинарного дерева+поиск по дереву
3) разбивал на сегменты с шагом 100 и списком записывал элементы (хорошо только при равномерном разбросе)
Только всё по тайм лимиту не влазило.
Carbon вне форума Ответить с цитированием
Старый 31.03.2008, 18:14   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
У меня получалось быстрее ...
Carbon, что-то не сходится. Чтобы отсортировать последовательность нужно как минимум пройти по всем ее элементам. За это время можно найти элемент, удовлетворяющий условиям.

Или метод решения задан и надо обязательно сортировать, а потом искать ?
alexBlack вне форума Ответить с цитированием
Старый 31.03.2008, 18:17   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Вся загвоздка в том, что запросов "Определить, существует ли v в последовательности от номера l до r (вывести 1) или нет (вывести 0)." может быть ОЧЕНЬ много.
Carbon вне форума Ответить с цитированием
Старый 31.03.2008, 18:33   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Понял - сортировку делаем один раз при чтении с сохранением индекса. Потом много раз поиск.

А если такой вариант: при чтении формируем элементы:

<Число <список позиций, в который встречается> >

Элементы сортируем по "Число". Списки позиций сами получится сортированные.

Тогда чисел уже будет меньше 70000 - должны же там быть повторы.
Кстати, на числа есть какие-то ограничения ? В списке диапазонов ищем позицию.
alexBlack вне форума Ответить с цитированием
Старый 31.03.2008, 18:41   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

0 - 10^9-1
Carbon вне форума Ответить с цитированием
Старый 31.03.2008, 18:44   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Этот вариант отпадает. Подумаю.
alexBlack вне форума Ответить с цитированием
Старый 31.03.2008, 18:47   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Можно как вариант:

Цитата:
Сообщение от Carbon Посмотреть сообщение
2) создание бинарного дерева+поиск по дереву
Но он не прошёл, т.к. числа, похоже, были отсортированы. А можно уравновесить дерево, чтобы для каждого узла слева и справа было примерно одинаковое количество элементов?
Carbon вне форума Ответить с цитированием
Старый 31.03.2008, 18:48   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Ага, это называется сбалансированное дерево.

Вот реализация. Только без удаления узлов. Но, в этом случае удаления не понадобится. Код делал на основе примера из Вирт "Алгоритмы..."
Вложения
Тип файла: rar uAVLTree.rar (7.2 Кб, 13 просмотров)

Последний раз редактировалось alexBlack; 31.03.2008 в 18:56.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск элемента ЭД4-0014 Помощь студентам 12 05.06.2008 21:47
Как проверить существование потока? John_chek Общие вопросы Delphi 3 17.01.2008 15:16
создание элемента Романнн Общие вопросы Delphi 6 13.12.2007 21:07
Проверка на существование Lonix Общие вопросы Delphi 2 19.03.2007 19:42