find_if в set
От: kvasya  
Дата: 23.11.09 11:39
Оценка:
Поделитесь опытом, наиболее быстрый способ найти подмножество M в множестве N упорядоченных целых чисел по условию "больше чем k и меньше чем q"?

Например дано множество N: set<int> array;
Пусть ~1 000 000 элементов, и требуется диапазон [100,8000) т.е.:
1. Итератор указывающий на первое число больше чем 99;
2. Итератор указывающий на первое число больше чем 7999.
(вроде правильно)

Вроде просто, но что-то ничего толкового в голову не приходит.
Специализированный "доморощенный" бинарный поиск aka велосипед?
Из algorithm подойдет что-нибудь?


Спасибо!
Re: find_if в set
От: Sni4ok  
Дата: 23.11.09 12:19
Оценка: 6 (2)
Здравствуйте, kvasya, Вы писали:


K>Поделитесь опытом, наиболее быстрый способ найти подмножество M в множестве N упорядоченных целых чисел по условию "больше чем k и меньше чем q"?


K>Например дано множество N: set<int> array;

K>Пусть ~1 000 000 элементов, и требуется диапазон [100,8000) т.е.:
K>1. Итератор указывающий на первое число больше чем 99;
K>2. Итератор указывающий на первое число больше чем 7999.
K>(вроде правильно)

вызывать у сет'а метод lower_bound, от начала до конца, потом upper_bound от полученного итератора до конца
Re[2]: find_if в set
От: kvasya  
Дата: 23.11.09 12:28
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, kvasya, Вы писали:



K>>Поделитесь опытом, наиболее быстрый способ найти подмножество M в множестве N упорядоченных целых чисел по условию "больше чем k и меньше чем q"?


K>>Например дано множество N: set<int> array;

K>>Пусть ~1 000 000 элементов, и требуется диапазон [100,8000) т.е.:
K>>1. Итератор указывающий на первое число больше чем 99;
K>>2. Итератор указывающий на первое число больше чем 7999.
K>>(вроде правильно)

S>вызывать у сет'а метод lower_bound, от начала до конца, потом upper_bound от полученного итератора до конца


Думается это именно то, что мне нужно по условию задачи. Буду учить матчасть.

Спасибо
Re: find_if в set
От: Centaur Россия  
Дата: 23.11.09 12:31
Оценка: 1 (1)
Здравствуйте, kvasya, Вы писали:

K>Поделитесь опытом, наиболее быстрый способ найти подмножество M в множестве N упорядоченных целых чисел по условию "больше чем k и меньше чем q"?


K>Например дано множество N: set<int> array;

K>Пусть ~1 000 000 элементов, и требуется диапазон [100,8000) т.е.:
K>1. Итератор указывающий на первое число больше чем 99;
K>2. Итератор указывающий на первое число больше чем 7999.
K>(вроде правильно)

Если пренебречь микрооптимизациями, то:
std::set<int>::const_iterator lowIter = array.lower_bound(100);
std::set<int>::const_iterator highIter = array.lower_bound(8000);

Это потребует 2*log(n) операций. Можно написать собственный алгоритм, который будет искать оба значения сразу, и «раздваиваться», только когда оба конца окажутся в разных половинах рассматриваемого интервала, но он будет эффективнее не более чем в два раза.
Re[2]: find_if в set
От: Centaur Россия  
Дата: 23.11.09 12:34
Оценка: 1 (1) +1
Здравствуйте, Sni4ok, Вы писали:

K>>Например дано множество N: set<int> array;

K>>Пусть ~1 000 000 элементов, и требуется диапазон [100,8000) т.е.:
K>>1. Итератор указывающий на первое число больше чем 99;
K>>2. Итератор указывающий на первое число больше чем 7999.
K>>(вроде правильно)

S>вызывать у сет'а метод lower_bound, от начала до конца, потом upper_bound от полученного итератора до конца


Есть мнение, что собственный метод set::lower_bound по всему множеству будет быстрее, чем общий алгоритм std::lower_bound по подмножеству. Из-за специфической организации std::set’а: собственный метод пойдёт в точности по узлам дерева, а общий алгоритм — как попало.
Re: find_if в set
От: Кодт Россия  
Дата: 23.11.09 12:38
Оценка: 3 (1)
Здравствуйте, kvasya, Вы писали:


K>Поделитесь опытом, наиболее быстрый способ найти подмножество M в множестве N упорядоченных целых чисел по условию "больше чем k и меньше чем q"?


set<int> xs;
set<int>::const_iterator
    i = xs.upper_bound(k), // *(i-1) <= k < *i
    j = xs.lower_bound(q); // *(j-1) < q <= *j

for_each(i,j, do_what_you_want);
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: find_if в set
От: sokel Россия  
Дата: 23.11.09 15:03
Оценка: 1 (1) +1
Здравствуйте, Кодт, Вы писали:

немножко оптимизации...
set<int> xs;
set<int>::const_iterator
    i = xs.upper_bound(k), // *(i-1) <= k < *i
    j = (i==xs.end())?i:xs.lower_bound(q); // *(j-1) < q <= *j

for_each(i,j, do_what_you_want);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.