随机选择一个空向量元素,当可以预先知道哪些是满的
Posted
技术标签:
【中文标题】随机选择一个空向量元素,当可以预先知道哪些是满的【英文标题】:randomly choosing an empty vector element, when it is possible to know beforehand which are full 【发布时间】:2011-11-26 12:45:27 【问题描述】:我最终确定这个函数是我的大部分瓶颈问题的原因。我认为这是因为当大多数突触已经处于活动状态时会发生大量过度的随机访问。基本上,正如标题所说,我需要以某种方式优化算法,这样我就不会随机检查大量的活动元素,然后再登陆剩下的少数几个元素之一。
此外,我还包括了整个功能,以防出现其他可以发现的缺陷。
void NetClass::Explore(vector <synapse> & synapses, int & n_syns) //add new synapses
int size = synapses.size();
assert(n_syns <= size );
//Increase the age of each active synapse by 1
Age_Increment(synapses);
//make sure there is at least one inactive vector left
if(n_syns == size)
return;
//stochastically decide whether a new connection is added
if((rand_r(seedp) %1000) < ( x / (1 +(n_syns * ( y / 100)))))
n_syns++; //a new synapse has been created
//main inefficiency here
while(1)
int syn = rand_r(seedp) % (size);
if (!synapses[syn].active)
synapses[syn].active = true;
synapses[syn].weight = .04 + (float (rand_r(seedp) % 17) / 100);
break;
void NetClass::Age_Increment(vector <synapse> & synapses)
for(int q=0, int size = synapses.size(); q < size; q++)
if(synapses[q].active)
synapses[q].age++;
【问题讨论】:
【参考方案1】:在[0, size-n_syns)
到Age_Increment
的范围内传递一个随机数k
。让Age_Increment
返回k
th 空槽。
【讨论】:
【参考方案2】:由于您已经遍历 Age_Increment
中的整个列表,请更新该函数以返回非活动突触的索引列表。
然后您可以直接从该列表中选择一个随机项目。
【讨论】:
【参考方案3】:这类似于在内存管理中寻找空闲块的问题,所以我会看一下该域中使用的算法,特别是free lists,它是一个空闲位置列表。 (这些通常实现为链表,以便能够有效地从一端弹出元素。链表中的随机访问仍然是 O(n) - 具有较小的 n,但仍然不是您的用例的最佳选择。)
【讨论】:
以上是关于随机选择一个空向量元素,当可以预先知道哪些是满的的主要内容,如果未能解决你的问题,请参考以下文章
C++随机选择std::vector的非空元素<std::vector>>