2012-01-28 7 views
5

एक साक्षात्कार प्रश्न:दो अनुक्रमों के तत्वों को स्वैप करें, जैसे कि तत्व-रकम का अंतर न्यूनतम हो जाता है।

को देखते हुए दो गैर-आदेश दिया पूर्णांक दृश्यों a और b, उनके आकार n, सभी संख्या बेतरतीब ढंग से चुना जाता है है: a और b के तत्वों, ऐसे तत्वों का योग है जो Exchange a की संख्या b के तत्वों की राशि न्यूनतम है।

उदाहरण को देखते हुए:

a = [ 5 1 3 ] 
b = [ 2 4 9 ] 

परिणाम (1 + 2 + 3) है - (4 + 5 + 9) = -12।

मेरा एल्गोरिदम: उन्हें एक साथ क्रमबद्ध करें और फिर a में पहले सबसे छोटे n इनट्स डालें और b में छोड़ दें। यह समय में ओ (एन एलजी एन) और अंतरिक्ष में ओ (एन) है। मुझे नहीं पता कि समय में ओ (एन) के साथ एल्गोरिदम में इसे कैसे सुधारें और ओ (1) अंतरिक्ष में कैसे करें। ओ (1) का मतलब है कि हमें सीईसी 1 और 2 को छोड़कर अधिक अतिरिक्त जगह की आवश्यकता नहीं है।

कोई विचार?

एक वैकल्पिक प्रश्न होगा: क्या होगा यदि हमें मतभेदों के पूर्ण मूल्य को कम करने की आवश्यकता है (|sum(a) - sum(b)| को कम करें)?

एक अजगर या सी ++ सोच को प्राथमिकता दी जाती है।

+0

एक होमवर्क की तरह लगता है। यदि ऐसा है, तो कृपया तदनुसार टैग करें। – celtschk

+0

यदि आप मूल ए और बी सूचियों पर विचार करते हैं तो यह अंतरिक्ष में ओ (1) नहीं हो सकता है। यदि आप उन्हें नहीं मानते हैं, तो बस मूल्यों को सीधे स्वैप करें। किसी भी मामले में, कृपया प्रश्न में अधिक जानकारी प्रदान करें। – GaretJax

+0

@GaretJax, ओ (एन) समय के साथ कुशलतापूर्वक स्वैप कैसे करें? – user1002288

उत्तर

8

संशोधित समाधान:

  1. मर्ज दोनों सूचियों एक्स = मर्ज (क, ख)।

  2. एक्स की औसत की गणना (जटिलता हे (एन) http://en.wikipedia.org/wiki/Selection_algorithm देखें)

  3. ए और बी के बीच इस मंझला स्वैप तत्वों का उपयोग करना। यही कारण है, यह है कि औसत से कम है एक में एक तत्व को खोजने ख है कि अधिक से अधिक मंझला है में एक खोजने के लिए और उन्हें स्वैप

अंतिम जटिलता: हे (एन)

को न्यूनतम निरपेक्ष अंतर एनपी पूरा हो गया है चूंकि यह knapsack समस्या के बराबर है।

+0

क्या आप समानता समझा सकते हैं? मुझे यह स्पष्ट लगता है कि ओपी के समाधान में सबसे छोटे मूल्यों को क्रमबद्ध करने और डालने का समाधान योग (ए) -सम (बी) को कम करता है: मुझे क्या याद आ रही है? – DSM

+0

क्या आप दूसरे भाग (पूर्ण मूल्य को कम करने) या दोनों के बारे में बात कर रहे हैं? चूंकि मुझे नहीं लगता कि यह पहले व्यक्ति पर लागू होता है, उच्चतम नकारात्मक अंतर प्राप्त करने के लिए एक सूची में एन/2 सबसे कम संख्या और दूसरे में एन/2 उच्चतम स्थान होता है, जैसा कि ओपी ने कहा था। – GaretJax

+0

@DSM मैंने सोचा कि आप पूर्ण न्यूनतम गणना कर रहे थे। यदि न्यूनतम है तो न्यूनतम समाधान का उपयोग करें। कोई सॉर्टिंग आवश्यक नहीं :) – ElKamina

2

क्या मेरे मन में आता है पीछा कर रहा है एल्गोरिथ्म रूपरेखा:

  1. सी = एक वी बी सी
  2. की
  3. Partitially तरह #A (ए की संख्या) तत्वों पिछले # का योग घटाएँ सी
  4. से पहले #A तत्वों का योग से सी से बी तत्वों

आप नोटिस देना चाहिए कि आप सभी तत्वों सॉर्ट करने के लिए की जरूरत नहीं है , यह वें खोजने के लिए पर्याप्त है ई सबसे छोटे तत्वों की संख्या।आपका उदाहरण दिया:

  1. सी = {5, 1, 3, 2, 4, 9}
  2. सी = {1, 2, 3, 5, 4, 9}
  3. (1 + 2 + 3) - (5 + 4 + 9) = -12

एक C++ समाधान:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    // Initialize 'a' and 'b' 
    int ai[] = { 5, 1, 3 }; 
    int bi[] = { 2, 4, 9 }; 
    std::vector<int> a(ai, ai + 3); 
    std::vector<int> b(bi, bi + 3); 

    // 'c' = 'a' merged with 'b' 
    std::vector<int> c; 
    c.insert(c.end(), a.begin(), a.end()); 
    c.insert(c.end(), b.begin(), b.end()); 

    // partitially sort #a elements of 'c' 
    std::partial_sort(c.begin(), c.begin() + a.size(), c.end()); 

    // build the difference 
    int result = 0; 
    for (auto cit = c.begin(); cit != c.end(); ++cit) 
     result += (cit < c.begin() + a.size()) ? (*cit) : -(*cit); 

    // print result (and it's -12) 
    std::cout << result << std::endl; 
} 
+0

हालांकि ओ (एन) नहीं है, लेकिन ओ (एन लॉग एन/2) अगर हम इष्टतम समाधान चाहते हैं (यानी एन/2 सबसे छोटे मूल्य)। – Voo

+0

@Voo: आप सही हैं, लेकिन क्या एक ओ (एन) एल्गोरिदम मौजूद है - मैं किसी के बारे में नहीं सोच सकता? और मुझे लगता है कि औसत समाधान ओ (एन) भी नहीं है, औसत प्राप्त करने के लिए, अनुक्रम को क्रमबद्ध किया जाना चाहिए, अन्यथा आप बीच से यादृच्छिक तत्व चुन रहे हैं (या मैं गलत हूं)? –

+0

ओह मैं मानता हूं कि ओ (एन लॉग एन/2) सबसे अच्छा संभव समाधान प्रतीत होता है। आखिरकार हमें एन/2 छोटे मूल्यों की आवश्यकता है और मैं वास्तव में नहीं देखता कि ओ (एन) में यह कैसे संभव होगा। – Voo

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