2011-02-17 18 views
7

मैं एक समारोह के लिए देख रहा हूँ के पहले एनआर: सभी क्रमपरिवर्तन

  • सभी n सूचीबद्ध कर सकते हैं कि! किसी दिए गए इनपुट वेक्टर के क्रमिक क्रम (आमतौर पर केवल अनुक्रम 1:n)
  • सभी एन के पहले एन को भी सूचीबद्ध कर सकता है! क्रमपरिवर्तन

पहली आवश्यकता पैकेज gtools से पैकेज e1071, या permutations() से पैकेज combinat, permutations() से पूरा किया जाता है, उदाहरण के लिए, permn() द्वारा। हालांकि, मैं सकारात्मक हूं कि कुछ पैकेज से अभी तक एक और कार्य है जो दूसरी सुविधा भी प्रदान करता है। मैंने इसे एक बार इस्तेमाल किया, लेकिन तब से इसका नाम भूल गया है।

संपादित करें: "प्रथम एन" की परिभाषा मनमानी है: फ़ंक्शन को केवल एक आंतरिक गणना योजना की आवश्यकता होती है जिसका हमेशा पालन किया जाता है, और एन क्रमपरिवर्तनों की गणना के बाद तोड़ना चाहिए।

स्पेसमैन सही ढंग से इंगित करते हैं, यह महत्वपूर्ण है कि फ़ंक्शन वास्तव में आवश्यकतानुसार अधिक क्रमिक गणना (समय बचाने के लिए) की गणना नहीं करता है।

संपादित करें - समाधान: मुझे याद आया कि मैं क्या उपयोग कर रहा था, यह पैकेज sna पैकेज से numperm() था। numperm(4, 7) तत्वों के 7 वें क्रमपरिवर्तन 1:4 देता है, पहले एन के लिए, किसी को लूप करना पड़ता है।

+0

क्या मुझे कुछ याद आ रही है? क्यों नहीं क्रमपरिवर्तन (एन) [1: एन,]? – Stompchicken

+0

क्रमपरिवर्तन (100,5) [1:10,] कुछ समय लगेगा ... मुझे लगता है कि समस्या है। – Spacedman

+1

आपको शायद 'पहले' से क्या मतलब है इसकी कुछ परिभाषा होनी चाहिए। – John

उत्तर

6

यह दृष्टिकोण यह एक इटरेटर कि बल्कि permn की तरह एक समारोह जो सामने पूरी सूची उत्पन्न करता है (एक महंगी आपरेशन) का उपयोग करने से क्रमपरिवर्तन की सूची उत्पादन कर सकता है निर्माण करने के लिए सबसे अच्छा तरीका होगा की तरह लगता है।

ऐसी वस्तुओं के निर्माण पर मार्गदर्शन देखने के लिए एक उत्कृष्ट जगह पाइथन मानक पुस्तकालय में itertools मॉड्यूल है। Itertools आंशिक रूप से आर के लिए a package of the same name के रूप में फिर से कार्यान्वित किया गया है।

require(itertools) 

permutations <- function(iterable) { 
    # Returns permutations of iterable. Based on code given in the documentation 
    # of the `permutation` function in the Python itertools module: 
    # http://docs.python.org/library/itertools.html#itertools.permutations 
    n <- length(iterable) 
    indicies <- seq(n) 
    cycles <- rev(indicies) 
    stop_iteration <- FALSE 

    nextEl <- function(){ 
    if (stop_iteration){ stop('StopIteration', call. = FALSE) } 
    if (cycles[1] == 1){ stop_iteration <<- TRUE } # Triggered on last iteration 

    for (i in rev(seq(n))) { 
     cycles[i] <<- cycles[i] - 1 
     if (cycles[i] == 0){ 
     if (i < n){ 
      indicies[i:n] <<- c(indicies[(i+1):n], indicies[i]) 
     } 
     cycles[i] <<- n - i + 1 
     }else{ 
     j <- cycles[i] 
     indicies[c(i, n-j+1)] <<- c(indicies[n-j+1], indicies[i]) 
     return(iterable[indicies]) 
     } 
    } 
    } 

    # chain is used to return a copy of the original sequence 
    # before returning permutations. 
    return(chain(list(iterable), new_iterator(nextElem = nextEl))) 

} 

Knuth गलत उद्धरण के लिए::

निम्नलिखित एक उदाहरण आर के itertools का उपयोग करता है पायथन जनरेटर कि क्रमपरिवर्तन के लिए iterators बनाता है की एक बंदरगाह को लागू करने की है "उपरोक्त कोड में कीड़े से सावधान रहें; मैंने केवल कोशिश की है, यह सही साबित नहीं हुआ है।"

अनुक्रम 1:10 के पहले 3 क्रमपरिवर्तन के लिए, permn कंप्यूटिंग अनावश्यक क्रमपरिवर्तन के लिए एक भारी कीमत का भुगतान करती है:

> system.time(first_three <- permn(1:10)[1:3]) 
    user system elapsed 
134.809 0.439 135.251 
> first_three 
[[1]] 
[1] 1 2 3 4 5 6 7 8 9 10 

[[2]] 
[1] 1 2 3 4 5 6 7 8 10 9 

[[3]] 
[1] 1 2 3 4 5 6 7 10 8 9) 

हालांकि, इटरेटर permutations द्वारा लौटाए केवल पहले तीन के लिए क्वेरी की जा सकती है तत्व जो बहुत सारी गणनाओं को बचाते हैं:

> system.time(first_three <- as.list(ilimit(permutations(1:10), 3))) 
    user system elapsed 
    0.002 0.000 0.002 
> first_three 
[[1]] 
[1] 1 2 3 4 5 6 7 8 9 10 

[[2]] 
[1] 1 2 3 4 5 6 7 8 10 9 

[[3]] 
[1] 1 2 3 4 5 6 7 9 8 10 

पायथन एल्गोरिदम permuta उत्पन्न करता है permn से अलग क्रम में टियां।

सभी क्रमपरिवर्तन कम्प्यूटिंग अभी भी संभव है:

> system.time(all_perms <- as.list(permutations(1:10))) 
    user system elapsed 
498.601 0.672 499.284 

अधिक महंगी हालांकि अजगर एल्गोरिथ्म बनाता है के रूप में permn की तुलना में छोरों का भारी इस्तेमाल। पायथन वास्तव में सी में इस एल्गोरिदम लागू करता है जो व्याख्याित लूप की अक्षमता की भरपाई करता है।

कोड in a gist on GitHub उपलब्ध है। अगर किसी के पास एक बेहतर विचार है, तो दूर चले जाओ!

+1

अब एक [itanpc पैकेज CRAN] पर है (https://cran.r-project.org/web/packages/iterpc/index.html), आरसीपीपी के साथ कार्यान्वित किया गया, जो वास्तव में यह करता है। –

3

R/combinat के मेरे संस्करण में, फ़ंक्शन permn() फ़ंक्शन 0 से अधिक लंबी है। एक तरीका permn की एक प्रति बनाना होगा और इसे जल्दी से रोकने के लिए बदलें।

+0

यह एक अंतिम उपाय है। हालांकि, यह कुछ समाधानों को और जटिल बना देता है जब मुझे सहायक कार्यों को भी शामिल करना होता है। उस कार्य के लिए केवल एक सीआरएएन-पैकेज का संदर्भ देने में सक्षम होने के कारण कम शब्दशः और त्रुटि-प्रवण है। – caracal

+1

निश्चित रूप से, यदि आप एक मौजूदा कार्यान्वयन पा सकते हैं, तो यह स्पष्ट रूप से जाने का तरीका है (मैंने एक त्वरित रूप देखा था, और एक नहीं मिला।) मेरे उत्तर का वास्तविक बिंदु यह था कि मौजूदा कार्यान्वयन की अनुपस्थिति में एक यह वही करता है जो आप चाहते हैं वह मुश्किल नहीं है। – NPE

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