2014-08-30 2 views
2

У меня есть функция, которая принимает массив значений и частоту дискретизации. Функция должна произвольно удалять значения по частоте дискретизации. Например, частота дискретизации 20% должна удалять 20% значений. Как я могу достичь этого с очень хорошей производительностью, потому что я буду перебирать более 10.000 значений?значения выборки в массиве с хорошей производительностью

Моя идея что-то вроде

for(var i = values.length-1; i >= 0; i--){ 
    var rnd = Math.floor((Math.random() * 100) + 1); 
    if(rnd < samplingRate) 
     values.splice(i,1); 
} 

, но я думаю, что функция Math.random() не производительный выбор.

+2

Первый мне нужно уточнение: Вы хотите, чтобы удалить 20% всех значений, как вы описываете в тексте, или удалить все значения с шанс 20%, что вы делаете в коде? Это две разные вещи. В любом случае, нет пути вокруг 'Math.random', если вы не напишете собственный RNG, который вряд ли будет работать лучше. – RoToRa

+0

Я сделал редактирование для моего вопроса. Это похоже на то, что я написал в тексте. –

+0

Я не думаю, что многие операции «сращивания» после друг друга имеют хорошую производительность (вызов «Math.random» должен быть незначительным в сравнении). Возможно, вы захотите попробовать ['filter'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) (хотя это создает новый массив, а не удалив их из 'values') – Bergi

ответ

1

На самом деле нет необходимости перебирать весь массив, если вы хотите работать только на 20%.
Петля для n раз, где n = Math.floor(0.20 * originalArray.length) - 1 и на каждой итерации get a random element from the array и удалите ее.

+0

Хороший подход! Я буду использовать и отметить это как ответ, когда нет лучшего способа сделать это. –

+1

Почему '-1' ??? – Bergi

+0

То, что первые 20% значений не были бы случайными 20%. – RoToRa

1

Если вам не нужно поддерживать старые браузеры используют .filter() метод:

var samplingPercentage = samplingRate/100; 

var filtered = values.filter(function() { 
    return Math.random() < samplingPercentage; 
}); 
+2

Это позволит удалить элементы с вероятностью 20%, а не удалить 20% элементов. – Nit

+0

Я знаю. Но это похоже на то, что хочет OP в соответствии с его/ее комментариями. Я не уверен. – RoToRa

+0

Чтение комментариев сейчас, также не определено, это неоднозначно. – Nit

Смежные вопросы