Как равномерно выбрать каждое значение m из массива, когда m является десятичным? - PullRequest
1 голос
/ 30 августа 2009

Допустим, у меня есть массив длины n, и я хочу выбрать из него k значения, равномерно, начиная с 0. Если k делит n, то это будет легко, но если k не делит n, тогда мне нужно изменить значение m Я увеличиваю указатель массива на. Как бы вы это сделали?

Например, если m=1.5, я хочу выбрать следующие числа: var arr = array (0,1,2,3,4,5,6,7,8); arr.every (1.5); // возвращает 0,1,3,4,6,7

Мне не нужно знать, что происходит, если k больше n

Ответы [ 5 ]

3 голосов
/ 30 августа 2009

Во-первых, вы должны определить, что означает «равномерно». Если n = 12 и k = 3, то правильные значения (1, 5, 9) (начиная с 1) или, скажем, (1, 7, 12). Очевидно, что они будут иметь разные результаты.

В некотором смысле это похоже на проблему масштабирования / растяжения изображений и растеризации линий ( Алгоритм Ву обычно используется для сглаживания в современной графике, но Брезенхем все еще важен и более актуален для этого) и разрешимо с алгоритмом линии Брезенхема .

1         *
2       **
3     **
4   **
5 **
6*
 1234567890

Примечание: На самом деле я не понял, правильные ли это значения. Это просто иллюстративно.

В этом примере вы создаете диагональную линию через прямоугольник 6х10. Другой способ взглянуть на этот алгоритм - сказать n = 10, k = 6, и каждый раз, когда строка увеличивается, у вас есть одно из ваших значений, так (1,2,4,6,8,10).

но все зависит от того, как вы определяете «равномерно».

3 голосов
/ 30 августа 2009

вам нужно решить, является ли спецификация "k" или "равномерно" более важной, потому что, если k не делит n, нужно пожертвовать.

1 голос
/ 30 августа 2009

Сохранить индекс с плавающей запятой, который увеличивается на m. когда вам нужно получить элемент из массива, поместите индекс в целое число.

i = 0.0
inc = n/(float)k

while(i < n)
   i += inc
   solutionSet.add(array[floor(i)])
1 голос
/ 30 августа 2009

Вы можете взглянуть на алгоритм линии Брезенхема , который на самом деле делает что-то похожее на это.

Алгоритм линии выбирает подходящее количество шагов с примерно равным интервалом, который выглядит очень плавным и естественным, вам просто нужно адаптировать его к выборочным значениям из массива, в котором он бы шагнул по линии.

1 голос
/ 30 августа 2009

Вы должны округлить вверх или вниз до ближайшего целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...