2016-01-12 6 views
9

array_udiff कॉलबैक फ़ंक्शन का उपयोग करके दो एरे के बीच अंतर की गणना करता है। हालांकि, इसे एक अनुमानित फ़ंक्शन की बजाय तुलना फ़ंक्शन की आवश्यकता होती है।array_udiff एक अनुमानित फ़ंक्शन के बजाय तुलना फ़ंक्शन का उपयोग क्यों करता है?

एक समारोह तुलना आइटम आइटम बी करने के लिए एक रिश्तेदार एक विधेय समारोह बस है या नहीं, आइटम एक निर्धारित करेंगे आइटम बी

तुलना करें कार्यों को आम तौर पर सही क्रम निर्धारित करने के प्रकार कार्यों के लिए आवश्यक हैं के बराबर है की तुलना करें। चूंकि array_udiff सिर्फ मतभेदों की गणना कर रहा है, एक अनुमानित फ़ंक्शन जो यह निर्धारित करता है कि प्रत्येक जोड़ी बराबर है या नहीं, ऐसा लगता है कि यह पर्याप्त होना चाहिए।

array_udiff एक अनुमानित फ़ंक्शन के बजाय तुलना फ़ंक्शन का उपयोग क्यों करता है? क्या इससे कोई फर्क पड़ता है कि मैं इसके बजाय भविष्यवाणी करता हूं? यानी -1 संभावना को छोड़कर, मैं असमानता और समानता को दर्शाने के लिए 0 और 1 वापसी मूल्यों का उपयोग करने के लिए चुन सकता हूं? इसका कोई प्रतिकूल प्रभाव, यदि कोई है, तो क्या यह मेरे परिणामों पर होगा?

उत्तर

5

php_array_diff() के लिए कार्यान्वयन (जो कई उपयोगकर्ता स्पेस सरणी कार्यों के लिए कार्यान्वयन की आपूर्ति करता है) कई आंतरिक तुलना कार्यों का पुन: उपयोग करके काम करता है।

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

वास्तविक कार्यान्वयन sorting द्वारा भी कार्य करता है। तो आपको सॉर्टिंग के लिए उपयुक्त एक तुलना एल्गोरिदम का उपयोग करने की आवश्यकता है, या आपको अप्रत्याशित परिणाम मिलेंगे। उदाहरण के लिए:

$a = [0, 1, 2, 3, 4, 5, 6]; 
$b = [4]; 

print_r(array_udiff($a, $b, function($x, $y) { 
    return $x <=> $y; //Sorting comparison function, correct 
})); 

print_r(array_udiff($a, $b, function($x, $y) { 
    return $x != $y; // Equality test, incorrect 
})); 

देता

Array //Sorting comparison function, correct 
(
    [0] => 0 
    [1] => 1 
    [2] => 2 
    [3] => 3 
    [5] => 5 
    [6] => 6 
) 
Array // Equality test, incorrect 
(
    [0] => 0 
    [1] => 1 
    [2] => 2 
    [3] => 3 
    [4] => 4 // equality test causes udiff to incorrectly include 4 
    [5] => 5 
    [6] => 6 
) 

इस का कारण यह एल्गोरिथ्म php_array_diff() का उपयोग करता है। मूल रूप से यह इस प्रकार है:

  • डुप्लिकेट और प्रकार सभी इनपुट सरणियों
  • में बाहर उत्पादन सेट क्रमबद्ध पहला इनपुट सरणी
  • प्रत्येक तत्व के लिए के बराबर एसआरसी की
    • वीएसआरसी
    • में वर्तमान तत्व का मान है
    • प्रत्येक इनपुट सरणी एक दूसरा
      • से शुरू एक में अगले तत्व है कि>वी, लेकिन एक नोट बनाना अगर हम अतीत से एक है कि == वी जाने के लिए आगे बढ़ें लिए
      • यदि हमें वी के लिए कोई मिलान मिला, तो इसे से पर हटा दें।
      • हम नहीं (इसलिए यह इनपुट सरणी में रहती है) है, तो में आगे बढ़ एसआरसी जब तक हम एक नए वी> = वर्तमान एक

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


एचएचवीएम का परिणाम एक अलग परिणाम हो सकता है, क्योंकि एचएचवीएम एक अलग सॉर्टिंग एल्गोरिदम का उपयोग करता है। एचएचवीएम pure quicksort का उपयोग करता है, जबकि PHP quicksort implementation derived from llvm का उपयोग करता है जिसमें एक प्रविष्टि क्रम अनुकूलन शामिल है।

आम तौर पर, विभिन्न सॉर्टिंग एल्गोरिदम अलग-अलग माध्यमों के माध्यम से एक ही समाधान पर पहुंचते हैं। यही है, अलग-अलग एल्गोरिदम अलग-अलग क्रम में, और विभिन्न मात्राओं में अलग-अलग क्रम में तत्वों की तुलना करने के कारण होते हैं। गलत तुलना फ़ंक्शन के मामले में, इसका सरणी के अंतिम क्रम पर बड़ा प्रभाव हो सकता है।

+0

यह एक अच्छा जवाब है, लेकिन एल्गोरिदम के साथ भी, इसका पालन करना मुश्किल है। क्या आप अपने उदाहरण और एल्गोरिदम का उपयोग करके समझा सकते हैं, क्यों एक खाली सरणी अपेक्षित आउटपुट है? –

+0

यह ध्यान रखना दिलचस्प है कि [एचएचवीएम अनुमानित कार्यों का समर्थन करता है] (https://3v4l.org/8rOn0)। साथ ही, आपके दूसरे परीक्षण में, '==' ऑपरेटर '! =' होना चाहिए क्योंकि '0' एक मैच का प्रतिनिधित्व करता है। –

0

आदेशित सरणी के पूरक के लिए यह सस्ता होना चाहिए। सॉर्ट करने के बिना यह ओ (एम * एन) समय ले जाएगा।

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