2015-06-16 24 views
5

Tôi muốn tìm cách nhanh nhất để tìm tối đa 1000 kết hợp có thể có của số nguyên 'n' để tìm số nguyên mục tiêu.Tìm tất cả các kết hợp của các con số tổng hợp đến một mục tiêu

Ví dụ: Giả sử tôi muốn tính tổng số '20'. Tôi muốn tìm đến 1000 kết hợp của bốn số nguyên tổng hợp cho số này. Các số nguyên có thể tự lặp lại. Tôi cũng có điều kiện là số nguyên không được nhỏ hơn một số cụ thể, trong trường hợp này là 4.

target<-20 #the number I wish to sum to 
lowest<-4 #the smallest integer I allow 
size<-4 #the number of integers I wish to use to sum 
maxposs <- target - ((size-1) * lowest) #given the lowest, this is the max possible integer. In my example it is 8. 

Đây là cách tôi bắt đầu làm việc này. Sử dụng combn để tìm tất cả các kết hợp của bốn số nguyên được chọn và sau đó lọc theo số nguyên kết hợp với mục tiêu của tôi.

m <- combn(rep(lowest:maxposs,size), size) 
m1<- m[,colSums(m)==target] 

Ở đây, 'm1' có 245 cột. Chỉ có nhiều giải pháp này. Một vài cột cuối cùng:

#  [,238] [,239] [,240] [,241] [,242] [,243] [,244] [,245] 
#[1,]  4  4  4  4  4  4  5  5 
#[2,]  5  5  5  6  7  4  6  4 
#[3,]  7  4  5  4  4  5  4  5 
#[4,]  4  7  6  6  5  7  5  6 

Tuy nhiên, trong ứng dụng thực tế của tôi, tôi có thể đối phó với số nguyên rất cao (tổng hợp lên đến 1000) và muốn giới hạn bản thân mình vào một mẫu ngẫu nhiên 1000 kết hợp có thể. Vì đây là một thử nghiệm thống kê ngẫu nhiên, tốc độ là bản chất. Tôi tự hỏi liệu có ai biết cách làm điều này nhanh hơn không. Cách của tôi không cảm thấy trực giác một cách nhanh chóng.

+1

Không nên là 'maxposs <- target - (size-1) * lowest'? – cyberj0g

+0

@ cyberj0g - vâng, tôi phát hiện ra rằng sau khi tôi đăng – jalapic

+0

'combnPrim' từ' thư viện (gRbase) 'sẽ là [nhanh] (http://stackoverflow.com/questions/26828301/faster-version-of-combn/26828486 # 26828486). – akrun

Trả lời

4
my_matrix <- matrix(nrow = 1000, ncol = 4) 
i <- 1 
nn <- 1000 
while(i <= 1000){ 
    x <- sample(x = 4:nn, size = 3) 
    y = nn - sum(x) 
    if(y >= 4){ 
    my_matrix[i, ] <- c(x, y) 
    i <- i + 1 
    } 
} 

Đề xuất của Gavin, được làm lại bằng ma trận được phân bổ trước. Bây giờ điều này chạy trong 0,158 giây, nhanh gấp hai lần và có thể cân tốt hơn.

+1

Bạn sẽ thực hiện việc này nhanh hơn nếu bạn không phạm tội hồng y phát triển một đối tượng, một khung dữ liệu không kém, để kết hợp vấn đề !, trong một vòng lặp 'for'. Phân bổ ma trận 4 cột và 1000 hàng. Điền vào hàng 'i' nếu nó đáp ứng tiêu chí. Đối với các vấn đề lớn hơn, việc sao chép khung dữ liệu sẽ chỉ giết hiệu suất. –

+0

đã lưu ý và thay đổi. Tôi đang cố phá vỡ những thói quen xấu như thế, nhưng không nghĩ quá nhiều về nó vì nó chỉ mất nửa giây trong trường hợp này. – goodtimeslim

Các vấn đề liên quan