2014-02-03 1 views
1

Теперь я могу получить эту работу сделали с помощьюR: Как сгенерировать все возможные векторы формы c (a, b, c), где a, b, c - целые числа, a <b <c <= 100?

x <- expand.grid(1:98, 1:99, 1:100); 
x.subset <- subset(x, Var1 < Var2 & Var2 < Var3) 

Но есть более элегантный способ? Я думаю, что шаг, на котором создается x, можно отбросить. Представьте, если я хочу сделать это для < b < c < 10,000. Распределяющая сетка потерпит неудачу на меньших машинах (я знаю, что x.subset тоже будет огромным!), Но у меня есть больше шансов создать его, если я могу пропустить шаг, на котором создается x.).

+0

Невозможно довести до 10 000 единиц памяти (9.997e + 11 элементов). Я думаю, у вас здесь неплохая версия – PascalVKooten

+1

Что вы собираетесь делать с этими комбинациями? – Roland

ответ

3

Невозможно довести до 10 000 единиц памяти (9998 * 9999 * 10000 == 9.997e + 11 элементов). Даже 1000 не подходит. Я думаю, у вас есть довольно хорошая версия прямо здесь, которая быстро работает примерно до 100, но намного выше ее просто невозможно.

Однако, возможно, пересмотреть свою «необходимость» для этого подхода и посмотреть, есть ли другой способ его достижения.

+1

Я бы дал вашему окончательному заявлению «+100». Доверяйте «Data Munger Guru» (а не мне), когда он говорит: «Скажите мне, какую проблему вы хотите решить, а не как вы хотите ее решить». –

+0

Откуда вы получаете требование о том, чтобы 3 элемента нуждались в сумме до 100? Я не вижу в этом вопроса. – Roland

+0

О, мой плохой. Удалены. – PascalVKooten

1

combn должен быть полезен здесь. Пример:

combn(1:4, 3) 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 1 1 2 
#[2,] 2 2 3 3 
#[3,] 3 4 4 4 

Однако до 10.000 все равно будет проблематично и есть, вероятно, некоторые лучше алгоритм, чтобы добраться до конечной цели.

+0

Интересная мысль: можете ли вы запустить временную отметку подхода OP против, скажем, «combn», за которым следует отказ от всех столбцов, которые не в порядке возрастания? что-то вроде 'if (any (diff (order (column)) <0) ...'? –

+0

@CarlWitthoft Я считаю, что 'combn' уже возвращает желаемый порядок. Не требуется обработка после обработки. – Roland

+0

Вы правы, –

1

Публикация как ответ для удобочитаемости. Мое время показывает выигрыш cgrid. R302, Windows7, процессор i7 (конечно, одноядерный).

Rgames> cgrid <-function(x,y,z) { 
+ x <- expand.grid(1:98, 1:99, 1:100); 
+ x.subset <- subset(x, Var1 < Var2 & Var2 < Var3) 
+ } 
Rgames> ccomb<-function(z) combn(1:z,3) 
Rgames> microbenchmark(cgrid(1:98,1:99,1:100),ccomb(100),times=10) 
Unit: milliseconds 
        expr  min   lq  median   uq 
cgrid(1:98, 1:99, 1:100) 217.330657 220.113192 253.5495825 325.167895 
       ccomb(100) 336.545629 346.839341 358.8957100 380.154500 
     max neval 
346.787171 10 
452.278904 10 
Смежные вопросы