Что такое хороший способ выбора случайного элемента с карты? C++. Насколько я понимаю, на картах нет итераторов с произвольным доступом. Ключ длинный, а карта малонаселенная.Случайный элемент на карте
ответ
map<...> MyMap;
iterator item = MyMap.begin();
std::advance(item, random_0_to_n(MyMap.size()));
Я еще не пробовал это, но если он работает, он выглядит идеально. Попробуй, когда я вернусь домой. что #includes это требует? – Deathbob 2008-10-01 18:14:21
#include
... и убедитесь, что ваш random_0_to_n() всегда
Мне нравится ответ Джеймса, если карта мала или вам не нужно случайное значение очень часто. Если он большой, и вы делаете это достаточно часто, чтобы сделать скорость важной, вы можете сохранить отдельный вектор значений ключа, чтобы выбрать случайное значение.
map<...> MyMap;
vector<...> MyVecOfKeys; // <-- add keys to this when added to the map.
map<...>::key_type key = MyVecOfKeys[ random_0_to_n(MyVecOfKeys.size()) ];
map<...>::data_type value = MyMap[ key ];
Конечно, если карта действительно огромна, возможно, вы не сможете сохранить копию всех ключей, подобных этому. Если вы можете себе это позволить, хотя вы получаете преимущество поиска в логарифмическом времени.
Возможно, вам стоит рассмотреть Boost.MultiIndex, хотя учтите, что он слишком тяжелый.
Возможно, нарисуйте случайный ключ, затем используйте lower_bound, чтобы найти ближайший ключ, фактически содержащийся.
В этом случае все Элементы карты должны быть доступны в случайном порядке.
- Скопируйте карту в вектор.
- Shuffle вектор.
В псевдокоде (Это точно отражает следующие C++ реализации):
import random
import time
# populate map by some stuff for testing
m = dict((i*i, i) for i in range(3))
# copy map to vector
v = m.items()
# seed PRNG
# NOTE: this part is present only to reflect C++
r = random.Random(time.clock())
# shuffle vector
random.shuffle(v, r.random)
# print randomized map elements
for e in v:
print "%s:%s" % e,
print
В C++:
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/foreach.hpp>
#include <boost/random.hpp>
int main()
{
using namespace std;
using namespace boost;
using namespace boost::posix_time;
// populate map by some stuff for testing
typedef map<long long, int> Map;
Map m;
for (int i = 0; i < 3; ++i)
m[i * i] = i;
// copy map to vector
#ifndef OPERATE_ON_KEY
typedef vector<pair<Map::key_type, Map::mapped_type> > Vector;
Vector v(m.begin(), m.end());
#else
typedef vector<Map::key_type> Vector;
Vector v;
v.reserve(m.size());
BOOST_FOREACH(Map::value_type p, m)
v.push_back(p.first);
#endif // OPERATE_ON_KEY
// make PRNG
ptime now(microsec_clock::local_time());
ptime midnight(now.date());
time_duration td = now - midnight;
mt19937 gen(td.ticks()); // seed the generator with raw number of ticks
random_number_generator<mt19937,
Vector::iterator::difference_type> rng(gen);
// shuffle vector
// rng(n) must return a uniformly distributed integer in the range [0, n)
random_shuffle(v.begin(), v.end(), rng);
// print randomized map elements
BOOST_FOREACH(Vector::value_type e, v)
#ifndef OPERATE_ON_KEY
cout << e.first << ":" << e.second << " ";
#else
cout << e << " ";
#endif // OPERATE_ON_KEY
cout << endl;
}
сохраняющейся ryan_s тема preconstructed карты и быстрого случайного поиска: вместо vector мы можем использовать параллельное отображение итераторов, которое должно ускорить случайный поиск.
map<K, V> const original;
...
// construct index-keyed lookup map
map<unsigned, map<K, V>::const_iterator> fast_random_lookup;
map<K, V>::const_iterator it = original.begin(), itEnd = original.end();
for (unsigned i = 0; it != itEnd; ++it, ++i) {
fast_random_lookup[i] = it;
}
// lookup random value
V v = *fast_random_lookup[random_0_to_n(original.size())];
Если ваша карта является статическим, то вместо карты, использовать вектор для хранения пар ключ/значение в порядке ключа, двоичный поиск для поиска значения в журнале (п), а индекс вектора для получения случайных пар в постоянное время. Вы можете обернуть векторный/бинарный поиск, чтобы он выглядел как карта со случайным доступом.
Кто-нибудь пробовал это? https://github.com/mabdelazim/Random-Access-Map «C++ шаблон класса для отображения произвольного доступа. Это похоже на станде :: карту, но вы можете получить доступ к элементам случайного индекса с синтаксисом my_map.key (I) и my_map.data (I)»
- 1. Случайный чат по карте?
- 2. Java Случайный доступ к карте
- 3. элемент выглядит на карте, но не на карте
- 4. Выберите случайный элемент
- 5. GridView дублирует случайный элемент
- 6. ReactJS - целевой случайный элемент
- 7. случайный элемент в наборе
- 8. триггер мыши войти на случайный элемент
- 9. Espresso - Как нажать на случайный элемент RecyclerView?
- 10. Выбрать случайный элемент из массива
- 11. Изменить элемент в карте
- 12. Tensorflow: Как обнулить случайный элемент?
- 13. Первый элемент на карте в JSP
- 14. Tap событие на карте элемент не работает
- 15. Найти элемент вектора, который представлен на карте
- 16. C++ наиболее часто встречающийся элемент на карте
- 17. Проверить конкретный элемент на карте в Drools
- 18. Получить элемент DOM на карте google div
- 19. элемент перетаскивания на карте изображения получить значение
- 20. проверка 'самый глубокий' элемент на карте
- 21. Как добавить элемент к вектору на карте
- 22. Получить случайный элемент из массива
- 23. Получить случайный элемент, используя jQuery
- 24. Случайный элемент массива в F #
- 25. Выберите случайный элемент с весом
- 26. Выберите случайный элемент из массива
- 27. рисовать случайный элемент в numpy
- 28. Получить случайный элемент из коллекции
- 29. случайный элемент из условного списка
- 30. Выберите случайный элемент из Hashtable
Почему бы вам нужно это сделать? Использование карты подразумевает, что вы хотите быстрый поиск на основе ключа, случайный поиск будет O (N) ... – 2008-10-01 18:07:04