क्या यह मापने का एक तरीका है कि किसी सूची को कैसे क्रमबद्ध किया जाए?


161

क्या यह मापने का एक तरीका है कि किसी सूची को कैसे क्रमबद्ध किया जाए?

मेरा मतलब है, यह जानने के बारे में नहीं है कि एक सूची को क्रमबद्ध किया जाता है या नहीं (बूलियन), लेकिन "सॉर्टनेस" के अनुपात की तरह कुछ, आंकड़ों में सहसंबंध के गुणांक जैसा है।

उदाहरण के लिए,

  • यदि किसी सूची की वस्तुएं बढ़ते क्रम में हैं, तो उसकी दर 1.0 होगी

  • यदि सूची को अवरोही क्रमबद्ध किया जाता है, तो इसकी दर -1.0 होगी

  • यदि सूची लगभग चढ़ती है, तो इसकी दर 0.9 या कुछ मूल्य 1 के करीब होगी।

  • यदि सूची को क्रमबद्ध (यादृच्छिक) नहीं किया गया है, तो इसकी दर 0 के करीब होगी

मैं अभ्यास के लिए स्काला में एक छोटी सी लाइब्रेरी लिख रहा हूं। मुझे लगता है कि एक छँटाई दर उपयोगी होगी, लेकिन मुझे ऐसा कुछ के बारे में कोई जानकारी नहीं मिलती है। शायद मैं अवधारणा के लिए पर्याप्त शब्द नहीं जानता।



4
क्या इसका उपयोग सूची को क्रमबद्ध करने के लिए आदर्श एल्गोरिदम को निर्धारित करने के लिए किया जाएगा? उदाहरण के लिए 0 के करीब के लिए, क्विकॉर्ट आदर्श होगा, लेकिन स्केल के लगभग अंत में मान (लगभग क्रमबद्ध या लगभग रिवर्स सॉर्ट किए गए), मर्जसॉर्ट बहुत तेज होगा, क्योंकि QC उन मामलों में O (N ^ 2) के लिए समर्पित है।
डारेल हॉफमैन

8
+1 "सॉर्टेज़ के अनुपात" के लिए
0x499602D2

1
@Fuhrmanator एल्गोरिथ्म के स्टोकेस्टिक संस्करण को सॉर्ट करने के लिए संभाव्य अनुमान पर पहुंचने के लिए एक प्रकार का प्रदर्शन नहीं करना पड़ता है। यह केवल तभी है जब आप एक सटीक माप प्राप्त करना चाहते हैं जिसे आपको एक प्रकार का प्रदर्शन करने की आवश्यकता है।
टिमोथी शील्ड

1
व्यंग्यात्मक लेकिन मजेदार पहली वृत्ति: आप प्रविष्टि को सॉर्ट कर सकते हैं और देखें कि इसमें कितना समय लगता है, और फिर तुलना करें कि इसे सॉर्ट करने में कितना समय लगता है (अब क्रमबद्ध) सूची और इसके विपरीत।
krr

जवाबों:


142

आप बस सूची में व्युत्क्रमों की संख्या गिन सकते हैं।

उलट देना

प्रकार के तत्वों के अनुक्रम में एक उलटा अनुक्रम अनुक्रम तत्वों की Tएक जोड़ी है जो कुछ <सेट के आदेश के अनुसार क्रम से बाहर दिखाई देते हैं T

से विकिपीडिया :

औपचारिक रूप से, संख्याओं A(1), A(2), ..., A(n)का एक क्रम हो n
तो i < jऔर A(i) > A(j), फिर जोड़ी (i,j)एक कहा जाता है उलट की A

एक अनुक्रम की व्युत्क्रम संख्या इसकी क्रमबद्धता का एक सामान्य उपाय है।
औपचारिक रूप से, व्युत्क्रम संख्या को व्युत्क्रम संख्या के रूप में परिभाषित किया जाता है, अर्थात

परिभाषा

इन परिभाषाओं को स्पष्ट करने के लिए, उदाहरण अनुक्रम पर विचार करें 9, 5, 7, 6। इस क्रम में व्युत्क्रम (0,1), (0,2), (0,3), (2,3) और व्युत्क्रम संख्या है 4

यदि आप 0और के बीच मान चाहते हैं 1, तो आप उलटा संख्या को विभाजित कर सकते हैं N choose 2

इस स्कोर की गणना करने के लिए वास्तव में एक एल्गोरिथ्म बनाने के लिए कि किसी सूची को कैसे सॉर्ट किया जाता है, आपके पास दो दृष्टिकोण हैं:

दृष्टिकोण 1 (निर्धारक)

अपने पसंदीदा सॉर्टिंग एल्गोरिथ्म को संशोधित करें कि वह कितने आक्रमणों को ठीक कर रहा है, क्योंकि यह चलता है। हालांकि यह नैटिव है और आपके द्वारा चुने गए सॉर्टिंग एल्गोरिदम के आधार पर अलग-अलग कार्यान्वयन हैं, आप एक एल्गोरिथ्म के साथ समाप्त होंगे जो आपके द्वारा शुरू किए गए सॉर्टिंग एल्गोरिदम की तुलना में अधिक महंगा (जटिलता के संदर्भ में) नहीं है।

यदि आप इस मार्ग को लेते हैं, तो ध्यान रखें कि यह "स्वैप" की गिनती के रूप में सरल नहीं है। उदाहरण के लिए, मर्जसेर्ट सबसे खराब स्थिति है O(N log N), फिर भी यदि इसे अवरोही क्रम में क्रमबद्ध सूची में चलाया जाता है, तो यह सभी आक्रमणों को सही कर देगा N choose 2। यह ऑपरेशन O(N^2)में ठीक किए गए व्युत्क्रम हैं O(N log N)। तो कुछ ऑपरेशनों को अनिवार्य रूप से एक बार में एक से अधिक उलटा सही करना होगा। आपको अपने कार्यान्वयन से सावधान रहना होगा। नोट: आप O(N log N)इसे जटिलता के साथ कर सकते हैं , यह सिर्फ मुश्किल है।

संबंधित: क्रमपरिवर्तन में "व्युत्क्रम" की संख्या की गणना

दृष्टिकोण 2 (स्टोचस्टिक)

  • बेतरतीब ढंग से नमूना जोड़े (i,j), जहांi != j
  • प्रत्येक जोड़ी के लिए, यह निर्धारित करें कि क्या list[min(i,j)] < list[max(i,j)](0 या 1)
  • इन तुलनाओं के औसत की गणना करें और फिर सामान्य करें N choose 2

मैं व्यक्तिगत रूप से स्टोकेस्टिक दृष्टिकोण के साथ जाऊँगा जब तक कि आपको सटीकता की आवश्यकता न हो - यदि केवल इसलिए कि इसे लागू करना इतना आसान है।


यदि आप वास्तव में चाहते हैं, तो (सॉर्ट किए गए अवरोही z') के बीच एक मान ( ) -1है 1(सॉर्ट किया हुआ आरोही), आप बस ऊपर दिए गए मान को मैप कर सकते हैं ( z), जो 0(सॉर्ट किया हुआ आरोही) और 1(सॉर्ट किया हुआ अवरोही) है, इस सूत्र का उपयोग करके इस सीमा तक। :

z' = -2 * z + 1

2
यह मेरे लिए आकर्षक है कि एक सूची को छांटना (आमतौर पर) O (n * logn) है, और कंप्यूटिंग व्युत्क्रम की भोली / स्पष्ट विधि O (n ^ 2) है। मुझे आश्चर्य है कि अगर वहाँ व्युत्क्रमों की संख्या की गणना के लिए बेहतर एल्गोरिदम हैं?
मार्क बेस्सी

5
इस SO प्रश्न में कुछ दिलचस्प दृष्टिकोण हैं: stackoverflow.com/questions/6523712/… मूल रूप से, उनके पास सरणी को छांटने के लिए राशि है ताकि यह पता लगाया जा सके कि कितने व्युत्क्रम हैं।
मार्क बेसी

4
मैंने भोलेपन से सोचा कि आप आसन्न जोड़े की गिनती कर सकते हैं जो क्रम से बाहर हैं। लेकिन यह गंभीर रूप से कम होगा: 1 2 3 1 2 3 में केवल एक आसन्न व्युत्क्रम होता है, लेकिन यह अधिक सही माप से 50% उल्टा होता है।
बमर

2
@Barmar मुझे लगता है कि सूची 1 2 3 1 2 3 योग्य न हो के रूप में sorta अनुसार क्रमबद्ध ;-)
scunliffe

2
@ तीमुथियुस, अच्छा, नहीं, यह नहीं है। लेकिन मैं इस बात पर विश्वास नहीं करूंगा। गैर-औपचारिक परिभाषा को जोड़ने का एक सुझाव जो कम प्रतीकात्मक रूप से झुकाव के लिए अधिक सुलभ है।
क्रिस कैलो

24

एक सूची (या अन्य अनुक्रमिक संरचना) को कैसे सॉर्ट किया गया, इसका पारंपरिक माप व्युत्क्रमों की संख्या है।

व्युत्क्रमों की संख्या एक (बी और बी) के जोड़े (ए, बी) सेंट इंडेक्स की संख्या <<है। इन उद्देश्यों के लिए<< लिए आप अपने विशेष प्रकार के लिए जो भी आदेश देने वाले संबंध का प्रतिनिधित्व करते हैं।

एक पूरी तरह से सॉर्ट की गई सूची में कोई व्युत्क्रम नहीं है, और पूरी तरह से उलट सूची में व्युत्क्रमों की अधिकतम संख्या है।


5
तकनीकी रूप से, 5 4 3 2 1पूरी तरह से क्रमबद्ध है क्योंकि ऑर्डर निर्दिष्ट नहीं किया गया है, लेकिन मुझे पांडित्य हो रहा है :-)
paxdiablo

7
@paxdiablo की परिभाषा पर निर्भर करता है <
मार्सिन

@paxdiablo, अच्छी तरह से किसी को व्युत्क्रमानुपाती की संख्या से दूरी 0 या निकटतम से माप सकता है n choose 2
हून

17

आप वास्तविक सहसंबंध का उपयोग कर सकते हैं।

मान लीजिए कि क्रमबद्ध सूची में प्रत्येक आइटम के लिए, आप शून्य से शुरू होने वाले पूर्णांक रैंक को असाइन करते हैं। ध्यान दें कि तत्वों की स्थिति सूचकांक बनाम रैंक का एक ग्राफ एक सीधी रेखा (स्थिति और रैंक के बीच 1.0 का सहसंबंध) में डॉट्स जैसा दिखेगा।

आप इस डेटा पर सहसंबंध की गणना कर सकते हैं। रिवर्स प्रकार के लिए आपको -1 और इसी तरह मिलेगा।


1
मुझे क्षमा करें, लेकिन यह बहुत अधिक अस्पष्ट है, जैसे कि आप पूर्णांक कैसे निर्दिष्ट करते हैं।
मार्सिन

2
पूर्णांक असाइन करने के लिए आपको क्रमबद्ध सूची की आवश्यकता है; तो यह सिर्फ वस्तुओं की एक गणना है।
कज़

1
वास्तव में मैं क्या सुझाव देने जा रहा था। मूल सूची में वस्तु की स्थिति और क्रमबद्ध सूची में इसकी स्थिति के बीच संबंध का निर्धारण करें। बुरी खबर यह है कि सहसंबंध दिनचर्या शायद O (n ^ 2) में चलती है; अच्छी खबर यह है कि वे शायद आपके पर्यावरण के लिए ऑफ-द-शेल्फ हैं।
पीटर वेब

2
हाँ, सिर्फ स्पीयरमैन के rho en.wikipedia.org/wiki/…
लुकास

मैं उत्सुक हूं ... क्या यह दृष्टिकोण व्युत्क्रमों की संख्या को गिनने के बराबर है?
क्लेटन स्टेनली

4

महान उत्तर दिए गए हैं, और मैं पूर्णता के लिए एक गणितीय पहलू जोड़ना चाहूंगा:

  • आप यह माप सकते हैं कि किसी सूची को किस प्रकार सॉर्ट किया गया है, यह मापने के लिए कि वह किसी क्रमबद्ध सूची में कितना सहसंबद्ध है। ऐसा करने के लिए, आप रैंक सहसंबंध (सबसे अधिक ज्ञात स्पीयरमैन के ) का उपयोग कर सकते हैं , जो सामान्य सहसंबंध की तरह ही है, लेकिन यह अपने आइटमों के अनुरूप मूल्यों के बजाय एक सूची में तत्वों के रैंक का उपयोग करता है।

  • कई एक्सटेंशन मौजूद हैं, जैसे सहसंबंध गुणांक (सटीक क्रम के लिए +1, सटीक व्युत्क्रम के लिए -1)

  • यह आपको इस उपाय के लिए सांख्यिकीय गुणों की अनुमति देता है, जैसे क्रमिक केंद्रीय सीमा प्रमेय, जो आपको यादृच्छिक सूचियों के लिए इस उपाय के वितरण को जानने की अनुमति देता है।


3

सांख्यिक सूचियों के लिए उलटा गिनती के अलावा, क्रमबद्ध राज्य से वर्ग दूरी कल्पना योग्य है:

#! ruby
d = -> a { a.zip( a.sort ).map { |u, v| ( u - v ) ** 2 }.reduce( :+ ) ** 0.5 }

a = 8, 7, 3, 4, 10, 9, 6, 2, 5, 1
d.( a ) #=> 15.556
d.( a.sort ) #=> 0.0
d.( a.sort.reverse ) # => 18.166 is the worrst case

मुझे लगता है कि मानक सहसंबंध समारोह का वर्ग, en.wikipedia.org/wiki/Correlation_ratio देखें । और गैर-संख्यात्मक सूचियों के लिए समान रूप से लागू होता है; जिन दो मूल्यों की तुलना की जाती है, वे दो सूचियों में ऑब्जेक्ट की स्थिति हैं।
पीटर वेब

मैं एक साधारण व्यक्ति हूं। मैं यह भी नहीं जानता कि सहसंबंध अनुपात क्या है। जब मैं उस विकिपीडिया लेख को पढ़ता हूं, तो सबसे ऊपर, मुझे यह जानने के लिए कहा जाता है कि "सांख्यिकीय फैलाव" क्या है, फिर "मानक विचलन", फिर "भिन्नता", फिर "अंतरसंबंध सहसंबंध गुणांक"। मैंने वह सब सीखा, कई बार, और कई बार, मैं इसे फिर से भूल गया। मेरे इस व्यावहारिक जवाब में, मैं केवल पाइथागोरस प्रमेय के साथ दो वैक्टर के बीच की दूरी को मापता हूं, जो मुझे प्राथमिक विद्यालय से याद है, बस।
बोरिस स्टिटनिक

1

मैं "सर्वश्रेष्ठ" विधि के बारे में निश्चित नहीं हूं, लेकिन एक सरल एक के बाद हर तत्व की तुलना करना होगा, एक काउंटर बढ़ाना अगर तत्व 2> तत्व 1 (या जो भी आप परीक्षण करना चाहते हैं) और फिर कुल संख्या से विभाजित करें तत्वों का। यह आपको एक प्रतिशत देना चाहिए।


1

मैं तुलनाओं की गणना करूंगा और इसे कुल संख्याओं में विभाजित करूंगा। यहाँ एक सरल पायथन उदाहरण है।

my_list = [1,4,5,6,9,-1,5,3,55,11,12,13,14]

right_comparison_count = 0

for i in range(len(my_list)-1):
    if my_list[i] < my_list[i+1]: # Assume you want to it ascending order
        right_comparison_count += 1

if right_comparison_count == 0:
    result = -1
else:
    result = float(right_comparison_count) / float((len(my_list) - 1))

print result

0

इस जैसे किसी और के बारे में क्या राय है?

#!/usr/bin/python3

def sign(x, y):
   if x < y:
      return 1
   elif x > y:
      return -1
   else:
      return 0

def mean(list_):
   return float(sum(list_)) / float(len(list_))

def main():
   list_ = [ 1, 2, 3, 4, 6, 5, 7, 8 ]
   signs = []
   # this zip is pairing up element 0, 1, then 1, 2, then 2, 3, etc...
   for elem1, elem2 in zip(list_[:-1], list_[1:]):
      signs.append(sign(elem1, elem2))

   # This should print 1 for a sorted list, -1 for a list that is in reverse order
   # and 0 for a run of the same numbers, like all 4's
   print(mean(signs))

main()

2
यह केवल आसन्न व्युत्क्रमों को गिनता है। यदि आप अन्य उत्तरों को देखते हैं तो आप देखेंगे कि यह अपर्याप्त है।
कोनराड रुडोल्फ

1
@KonradRudolph: मुझे लगता है कि यह उत्तर पूछे गए प्रश्न को संतुष्ट करता है। तथ्य यह है कि अन्य उत्तर अधिक व्यापक हैं इसका मतलब यह नहीं है कि यह अपर्याप्त है; यह ओपी की आवश्यकताओं पर निर्भर करता है।
लार्स

0

यदि आप अपनी सूची लेते हैं, तो उस सूची में दिए गए मानों के रैंकों की गणना करें और रैंकों की सूची और दूसरी सूची को कॉल करें Y, Xजिसमें पूर्णांकों को शामिल किया गया 1है length(Y), आप ठीक उसी प्रकार का माप प्राप्त कर सकते हैं जिसे आप सहसंबंध गुणांक की गणना करके देख रहे हैं , rदो सूचियों के बीच।

r = \frac{\sum ^n _{i=1}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum ^n _{i=1}(X_i - \bar{X})^2} \sqrt{\sum ^n _{i=1}(Y_i - \bar{Y})^2}} 

एक पूरी तरह से सॉर्ट की गई सूची के लिए, r = 1.0एक रिवर्स-सॉर्ट की गई सूची के लिए r=-1.0, और rइन सीमाओं के बीच अलग-अलग क्रमबद्धता के लिए डिग्री।

इस दृष्टिकोण के साथ एक संभावित समस्या, आवेदन के आधार पर, यह है कि सूची में प्रत्येक आइटम के रैंक की गणना इसे छांटने के बराबर है, इसलिए यह एक ओ (एन लॉग एन) ऑपरेशन है।


लेकिन वह वक्र आकार को नजरअंदाज नहीं करेगा। यदि उसकी सरणी को क्रमबद्ध किया जाता है, लेकिन, कहते हैं, इसमें मूल्य तेजी से बढ़ रहे हैं, तो सहसंबंध छोटा होगा जहां वह चाहता है कि यह 1.0 हो।
ली डैनियल क्रोकर

@LeeDanielCrocker: हाँ, यह एक अच्छी बात है। मैंने मानों की रैंक लेकर इसे संबोधित करने के लिए अपने उत्तर में संशोधन किया है।
साइमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.