我有一个数组,其最大长度可达数十万行。它看起来像这样:
arr[12] = false
arr[334] = true
arr[753] = true
arr[1001] = false
arr[1222] = true
依旧......
我想找到一种随机选择真实行的索引的最快方法......
我最初的尝试是这样做:
for(k in arr) {
if(arr[k]) {
candidate.push(k);
}
}
return Math.floor(Math.random() * candidate.length);
但它很慢。
有更好的方法吗?
泰
答案 0 :(得分:1)
如果缺失元素的分数足够小,那么它将足够快,只能生成随机索引,直到您获得命中。试一试。
var chose_true = function(array) {
while (true) {
var index = Math.floor(Math.random() * array.length)
if (array[index]) {
return array[index];
}
}
}
答案 1 :(得分:1)
while(true)
{
var index = Math.floor(Math.random() * array.length)
if(arr[index])
return index;
}
如果有很多真实的话它会很快而且如果有很多谬误则会很慢,但至少比你的解决方案更快
答案 2 :(得分:0)
据我所知,没有很好的方法可以做到这一点。
我试图使用的那个,当你用数组填充真/假元素时,将一个辅助结构推到真值的索引上。之后,生成这些值的随机值应该很容易,并且您肯定会在该索引上获得真值。
答案 3 :(得分:0)
您最好的解决方案是为此阵列创建另一个索引:
每次修改此数组时,都会将所有true
值的索引重建为某些true_values数组。例如:
function addNewIndex(key, value) {
arr[key] = value;
if (value) {
true_arr.push(key); //<<<<
}
}
然后只需从您构建的索引中选择随机元素。
答案 4 :(得分:0)
如果这个数组会不断变化,如果它非常大,并且真元素的数量非常少,那么保留True索引列表怎么样?
当索引变为true时,它将被添加到列表中,当索引设置为false时,它将从列表中删除,然后您可以通过从真实索引列表中选择随机元素来选择索引