2015-06-16 10 views
5

मैं एक लक्ष्य पूर्णांक खोजने के लिए 'एन' पूर्णांक के 1000 संभावित संयोजनों को खोजने का सबसे तेज़ तरीका ढूंढना चाहता हूं।लक्ष्य के योग के सभी संयोजनों को खोजें

उदाहरण के लिए

। मान लें कि मैं '20' संख्या को जोड़ना चाहता हूं। मैं इस संख्या के योग के चार पूर्णांक के 1000 संयोजनों को ढूंढना चाहता हूं। पूर्णांक स्वयं को दोहरा सकते हैं। मैं भी एक शर्त है कि पूर्णांक एक विशेष संख्या से छोटा नहीं होना चाहिए, इस मामले 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. 

यह कैसे मैं इस बाहर काम शुरू कर दिया है है में है। चार चुने हुए पूर्णांक के सभी संयोजनों को खोजने के लिए combn का उपयोग करना और फिर मेरे लक्ष्य के योग वाले लोगों द्वारा फ़िल्टर करना।

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

यहां, 'एम 1' में 245 कॉलम हैं। केवल इतना ही समाधान हैं। पिछले कुछ कॉलम:

#  [,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 

हालांकि, मेरा असली आवेदन में, मैं बहुत ही उच्च पूर्णांक (1000 को जोड़कर) और अपने आप को 1000 संभव संयोजनों के बेतरतीब नमूने को सीमित करना चाहते हैं के साथ काम कर जा सकता है। चूंकि यह एक यादृच्छिक सांख्यिकीय परीक्षण के लिए है, गति सार का है। मुझे आश्चर्य है कि अगर कोई ऐसा करने का तेज़ तरीका जानता है। मेरा रास्ता सहजता से जल्दी महसूस नहीं करता है।

+1

यह 'maxposs <- target - (size-1) * निम्नतम नहीं होना चाहिए? – cyberj0g

+0

@ cyberj0g - हाँ, मैंने पकड़ा कि – jalapic

+0

'लाइब्रेरी (जीआरबेस) से' combnPrim' पोस्ट करने के बाद '[तेज़] होगा (http://stackoverflow.com/questions/26828301/faster-version-of-combn/26828486 # 26,828,486)। – akrun

उत्तर

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 
    } 
} 

प्रति गेविन के सुझाव, एक प्रीलोकेटेड मैट्रिक्स के साथ फिर से बनाया गया। अब यह 158 सेकेंड में चलता है, दो गुना तेजी से, और शायद बेहतर स्केल करता है।

+1

का संभावित डुप्लिकेट यदि आप कार्डिनल पाप नहीं करते हैं तो आप इसे तेज़ कर देंगे 'ऑब्जेक्ट' को बढ़ाने के लिए, किसी ऑब्जेक्ट को बढ़ाने के लिए, कोई डेटा फ्रेम कम नहीं है! 4 कॉलम और 1000 पंक्तियों का एक मैट्रिक्स आवंटित करें। अगर मैं मानदंड को पूरा करता हूं तो 'i'th पंक्ति भरें। बड़ी समस्याओं के लिए, डेटा फ्रेम की प्रतिलिपि सिर्फ प्रदर्शन को मार डालेगी। –

+0

ध्यान दिया और बदल दिया। मैं इस तरह की बुरी आदतों को तोड़ने की कोशिश कर रहा हूं, लेकिन इस बारे में बहुत कुछ नहीं सोचा क्योंकि इस मामले में इसे केवल आधे सेकेंड का समय लगता है। – goodtimeslim

संबंधित मुद्दे