导致随机树遍历的find
(or )谓词怎么样?lower_bound
您必须告诉它集合的大小,以便它可以估计树的高度,有时会在叶节点之前终止。
编辑:我意识到这个问题是std::lower_bound
需要一个谓词但没有任何树状行为(在内部它使用std::advance
在另一个答案的评论中讨论)。 std::set<>::lower_bound
使用集合的谓词,它不能是随机的并且仍然具有类似集合的行为。
啊哈,您不能使用不同的谓词,但可以使用可变谓词。由于std::set
通过值传递谓词对象,因此您必须使用 apredicate &
作为谓词,以便您可以访问并修改它(将其设置为“随机化”模式)。
这是一个准工作示例。不幸的是,我无法将我的大脑包裹在正确的随机谓词上,所以我的随机性不是很好,但我相信有人可以解决这个问题:
#include <iostream>
#include <set>
#include <stdlib.h>
#include <time.h>
using namespace std;
template <typename T>
struct RandomPredicate {
RandomPredicate() : size(0), randomize(false) { }
bool operator () (const T& a, const T& b) {
if (!randomize)
return a < b;
int r = rand();
if (size == 0)
return false;
else if (r % size == 0) {
size = 0;
return false;
} else {
size /= 2;
return r & 1;
}
}
size_t size;
bool randomize;
};
int main()
{
srand(time(0));
RandomPredicate<int> pred;
set<int, RandomPredicate<int> & > s(pred);
for (int i = 0; i < 100; ++i)
s.insert(i);
pred.randomize = true;
for (int i = 0; i < 100; ++i) {
pred.size = s.size();
set<int, RandomPredicate<int> >::iterator it = s.lower_bound(0);
cout << *it << endl;
}
}
我半生不熟的随机性测试是./demo | sort -u | wc -l
看看我得到了多少个唯一整数。使用更大的样本集尝试./demo | sort | uniq -c | sort -n
寻找不需要的模式。