我有一个大的二维网格,让我们说10000 X 10000.从这些网格我需要选择1000个随机点,但我还需要注意这两个点都不相同。我想到的标准方法是在选择每个点之后,我应该检查所有先前的条目,看看是否已经选择了该点,但是对于大网格和大量点来说,这似乎效率低下。有没有更好的方法呢? 我正在使用C ++
答案 0 :(得分:3)
似乎对于大网格和大量积分这将变得效率低下
不一定。有两种潜在的低效率来源:
O(1)
时间内完成。为此,std::unordered_set
将是一个很好的候选人。集合的大小将以您需要选择的元素数量线性增长,并且将完全独立于网格大小。答案 1 :(得分:1)
你可以实现这样的算法:
- 创建从哈希到点的空映射
- 选择随机点
- 计算哈希
- 如果是映射哈希,请转到1
- save hash&点
- 如果还不够,请转到1
醇>
答案 2 :(得分:0)
随机选择任何一个点,如果它存在于选定点列表中,则丢弃它不应该是低效的,只要你有明确排序的选择点的集合,您也可以轻松插入。
此外,根据您的点的定义方式(即它们各自与您定义的类或结构相关联),您可以向点对象添加一个名为Selected
的布尔变量。选择一个点后,请检查它是否已标记为Selected
。如果没有,请将其添加到您的列表中,并将Selected
值更改为TRUE
。否则,继续选择随机点。