यहां मेरे पास 1:7
चार अलग-अलग विभाजनों के लिए पूर्णांक हैं , अर्थात, {1}, {2,3,4}, {5,6}, और {7} और उन विभाजनों को एक सूची में लिखा जाता है, अर्थात list(1,c(2,3,4),c(5,6),7)
। मैं विभाजनों को सेट के रूप में मानता हूं, जैसे कि एक विभाजन के भीतर तत्वों के विभिन्न क्रमांकन को एक ही के रूप में मान्यता दी जानी चाहिए। उदाहरण के लिए, list(1,c(2,3,4),c(5,6),7)
और list(7,1,c(2,3,4),c(6,5))
समतुल्य हैं।
ध्यान दें, सूची में तत्वों के लिए कोई पुनरावृत्ति नहीं है , उदाहरण के लिए, नहीं list(c(1,2),c(2,1),c(1,2))
, क्योंकि यह समस्या पूरे सेट पर विशेष विभाजन पर चर्चा कर रही है।
मैंने lst
नीचे दिए गए सूची में कुछ अलग क्रमांकन सूचीबद्ध किए हैं
lst <- list(list(1,c(2,3,4),c(5,6),7),
list(c(2,3,4),1,7,c(5,6)),
list(1,c(2,3,4),7,c(6,5)),
list(7,1,c(3,2,4),c(5,6)))
और मैं क्या करना चाहता हूँ सत्यापित करने के लिए सभी क्रमपरिवर्तन समतुल्य हैं। यदि हाँ, तो हमें परिणाम मिलता है TRUE
।
क्या मैं अब तक किया था प्रत्येक विभाजन के भीतर तत्वों सॉर्ट करने के लिए है, और उपयोग setdiff()
के साथ interset()
और union()
यह निर्णय करना (मेरे कोड नीचे देखें)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
हालांकि, मुझे लगता है कि जब भी विभाजन का आकार बढ़ेगा तो यह विधि धीमी होगी। क्या इसे बनाने के लिए कोई तेज़ तरीका है? अग्रिम में सराहना की!
- कुछ परीक्षण मामले (छोटे आकार के डेटा)
# should return `TRUE`
lst1 <- list(list(1,c(2,3,4),c(5,6)),
list(c(2,3,4),1,c(5,6)),
list(1,c(2,3,4),c(6,5)))
# should return `TRUE`
lst2 <- list(list(1:2, 3:4), list(3:4, 1:2))
# should return `FALSE`
lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
और एक वह भी जहां परिणाम होना चाहिए FALSE
, हो सकता हैlst_false <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
FALSE
। इस तरह, जब एक उत्तर कुछ पर काम करता है, लेकिन सभी नहीं, मामलों का परीक्षण करते हैं, तो इसका निदान करना आसान है। जब केवल एक ही उदाहरण होता है, तो आप परीक्षा परिणामों में बारीकियों को खो देते हैं। पहले से ही उन लोगों के तहत मौजूदा उदाहरणों को बदलने के बजाय नए उदाहरणों को जोड़ना अच्छा है।
lst
संभवतः लंबी है, तो आप अन्य तरीकों से दक्षता हासिल कर सकते हैं। उदाहरण के लिए, पहला चेक जो length(unique(lengths(lst))) == 1
बहुत जल्दी वापस आ जाएगा FALSE
यदि किसी भी आंतरिक सूची में तत्वों की गलत संख्या है ...
lst
तुलना lst[[i]]
करने के बजाय एक आइटम को एक बार में जाना चाह सकते हैं lst[[1]]
, और इस तरह से आप सभी तुलना करने के बजाय एक बेमेल खोज सकते हैं। यदि lst
लंबे और FALSE
एस सामान्य हैं, तो यह एक बड़ी दक्षता हासिल कर सकता है, लेकिन शायद इसके लायक नहीं है।
Map
कॉल से बच सकते हैं