2010-02-09 12 views
10

नीचे मेरा छद्म कोड है।सबसे बड़ी तीन चींटियों को खोजने के लिए सबसे प्रभावी तरीका

function highest(i, j, k) 
{ 
    if(i > j && i > k) 
    { 
    return i; 
    } 
    else if (j > k) 
    { 
    return j; 
    } 
    else 
    { 
    return k; 
    } 
} 

मुझे लगता है कि यह काम करता है, लेकिन क्या यह सी ++ में सबसे प्रभावी तरीका है?

+4

यह होमवर्क है? –

+0

क्या आप इसका उपयोग कर सकते हैं? http://www.cplusplus.com/reference/algorithm/max/ – alex

+13

इस मामले में यदि यह होमवर्क है, तो यह ठीक है, क्योंकि प्रश्नकर्ता ने प्रयास किया है, उसका कोड दिखाया है और सुधार की मांग कर रहा है। यह SO पर होमवर्क प्रश्न पोस्ट करने के लिए सभी दिशानिर्देशों को पूरा करता है। – Jasarien

उत्तर

25

सबसे बढ़िया खोजने के लिए आपको बिल्कुल 3 इंच देखने की आवश्यकता है, और कम नहीं। आप 3 तुलनाओं के साथ 6 देख रहे हैं। आप इसे 3 और 2 तुलना में करने में सक्षम होना चाहिए।

int ret = max(i,j); 
ret = max(ret, k); 
return ret; 
+3

एक अच्छा छोटा काम कर सकता है: 'टेम्पलेट कॉन्स टी एंड मैक्स (कॉन्स टी एंड पीए, कॉन्स टी एंड पीबी, कॉन्स टी एंड पीसी) {रिटर्न अधिकतम (पीए, अधिकतम (पीबी, पीसी)); } ' – GManNickG

+8

' अधिकतम (i, अधिकतम (जे, के)) 'इसे एक पंक्ति में सहेजता है। मुझे टेम्पलेट संस्करण भी पसंद है –

+0

एसटीएल परिभाषित करता है, है ना? उपयोग करने के लिए एक अच्छी बात होगी। –

14

स्यूडोकोड:

result = i 
if j > result: 
    result = j 
if k > result: 
    result = k 
return result 
+0

मुझे यह पसंद है कि आप केवल कथन का इस्तेमाल करते हैं। यह एक साफ जवाब है। – Stephano

+0

बढ़िया! बहुत स्पष्ट है, और यह बहुत संभावना है कि अगर हार्डवेयर ने 'cmov' जैसे निर्देशों की भविष्यवाणी की है, तो संकलक उनका उपयोग करेगा। +1 (इच्छा है कि मैं बुराई 'अधिकतम' से पहले +10 कर सकता हूं) –

+0

ग्रेट उत्तर। उतना आसान जितना आसान हो सकता है क्योंकि यह चालाक होने का कोई प्रयास नहीं कर सकता है। विनम्रता के लिए +1। –

11

कैसे के बारे में

return i > j? (i > k? i: k): (j > k? j: k); 

दो तुलना, क्षणिक अस्थायी ढेर चर का कोई फायदा नहीं ...

+1

+1। निफ्टी। एक ही समय में आंखों के लिए Mesmerizing और हानिकारक। – Skurmedel

+0

+1 * नहीं * एक '# परिभाषित' के रूप में कर रहा है।^_^ –

+0

+1 एक-पंक्ति समाधान का उल्लेख करने वाले पहले व्यक्ति होने के लिए +1। मैं सब कुछ कम करने की कोशिश करने के विचार को कम कर सकता हूं, लेकिन हर बार कोई मुझे एक 1-लाइनर दिखाता है जो काफी प्रभावशाली है। – Stephano

7

आपकी वर्तमान विधि: http://ideone.com/JZEqZTlj (0.40 एस)

क्रिस समाधान:

int ret = max(i,j); 
ret = max(ret, k); 
return ret; 

http://ideone.com/hlnl7QZX (0.39s) इग्नेसियो वेज़क्वेज़-अब्राम द्वारा

समाधान:

result = i; 
if (j > result) 
    result = j; 
if (k > result) 
    result = k; 
return result; 

http://ideone.com/JKbtkgXi (0.40s)

और चार्ल्स Bretana की:

return i > j? (i > k? i: k): (j > k? j: k); 

http://ideone.com/kyl0SpUZ (0.40s)

उन परीक्षणों के

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

संपादित करें: परीक्षणों को अपडेट किया गया, यह पता चला कि यह अभी भी इसके कुछ हिस्सों को अनुकूलित कर रहा है। उम्मीद है कि यह अब और नहीं है।

+0

ठीक है, मैं अद्यतन संस्करण के साथ (थोड़ा) खुश हूं। तो मुझे -1 को हटाने नहीं देगा हालांकि ("जब तक यह उत्तर संपादित नहीं किया जाता है, तब तक बहुत पुराना वोट दें"), क्षमा करें। – sfussenegger

+2

वाह, मीठा। मुझे नहीं पता था कि विचारधारा मौजूद थी। यह मुझे कुछ करने के लिए देता है जब मैं सो नहीं सकता :)। – Stephano

3

सुनिश्चित नहीं हैं कि अगर यह सबसे कारगर है या नहीं है, लेकिन यह हो सकता है, और यह निश्चित रूप से है कम:

int maximum = max(max(i, j), k); 
5

इस तरह एक प्रश्न के लिए, वहाँ सिर्फ तुम क्या आपके अनुकूलन संकलक जानने का कोई विकल्प नहीं है कर रहा है और बस हार्डवेयर पर उपलब्ध है। यदि आपके पास मौलिक उपकरण बाइनरी तुलना या बाइनरी अधिकतम है, तो दो तुलना या अधिकतम दोनों आवश्यक और पर्याप्त हैं।

मैं इग्नेसियो के समाधान पसंद करते हैं: क्योंकि आम आधुनिक इंटेल हार्डवेयर पर

result = i; 
if (j > result) 
    result = j; 
if (k > result) 
    result = k; 
return result; 

, संकलक यह बहुत आसान सिर्फ दो तुलना और दो cmov निर्देश है, जो जगह I- पर एक छोटे लोड फेंकना मिलेगा सशर्त शाखाओं की तुलना में शाखा भविष्यवाणियों पर कैश और कम तनाव। (साथ ही, कोड स्पष्ट और पढ़ने में आसान है।) यदि आप x86-64 का उपयोग कर रहे हैं, तो संकलक रजिस्टरों में सबकुछ भी रखेगा।

नोट आप हार्ड ... एक कार्यक्रम जहां अपनी पसंद कुछ फ़र्क पड़ता है इस कोड एम्बेड करने के लिए दबाया जा रहे हैं

4

मैं एक बौद्धिक व्यायाम के रूप में सशर्त छलांग खत्म करना चाहते। मैं हालांकि पता नहीं है इस प्रदर्शन पर किसी भी औसत दर्जे का प्रभाव पड़ता है या नहीं :)

#include <iostream> 
#include <limits> 

inline int max(int a, int b) 
{ 
    int difference = a - b; 
    int b_greater = difference >> std::numeric_limits<int>::digits; 
    return a - (difference & b_greater); 
} 

int max(int a, int b, int c) 
{ 
    return max(max(a, b), c); 
} 

int main() 
{ 
    std::cout << max(1, 2, 3) << std::endl; 
    std::cout << max(1, 3, 2) << std::endl; 
    std::cout << max(2, 1, 3) << std::endl; 
    std::cout << max(2, 3, 1) << std::endl; 
    std::cout << max(3, 1, 2) << std::endl; 
    std::cout << max(3, 2, 1) << std::endl; 
} 

इस बिट twiddling सिर्फ मनोरंजन के लिए है, cmov समाधान शायद एक बहुत तेजी से होता है।

+0

स्थानांतरण प्लस बाइनरी-एंडिंग चालाक है! – Ponkadoodle

0
public int maximum(int a,int b,int c){ 
    int max = a; 
    if(b>max) 
     max = b; 
    if(c>max) 
     max = c; 
    return max; 
} 
1

एन 2485 के तहत सी ++ लाइब्रेरी में इसे शामिल करने का प्रस्ताव है। प्रस्ताव सरल है, इसलिए मैंने नीचे सार्थक कोड शामिल किया है। जाहिर है, इस variadic टेम्पलेट्स

template < typename T > 
const T & max (const T & a) 
{ return a ; } 

template < typename T , typename ... Args > 
const T & max(const T & a , const T & b , const Args &... args) 
{ return max (b > a ? b : a , args ...); } 
0

मुझे लगता है कि द्वारा "सबसे कारगर" आप प्रदर्शन के बारे में बात कर रहे हैं, कंप्यूटिंग संसाधनों बर्बाद करने के लिए नहीं की कोशिश कर रहा हो जाती है। लेकिन आप कोड की कम लाइनों या शायद अपने स्रोत कोड की पठनीयता के बारे में लिखने का जिक्र कर सकते हैं। मैं नीचे एक उदाहरण प्रदान कर रहा हूं, और यदि आप कुछ उपयोगी पाते हैं या आप प्राप्त उत्तरों से एक और संस्करण पसंद करते हैं तो आप मूल्यांकन कर सकते हैं।

/* Java version, whose syntax is very similar to C++. Call this program "LargestOfThreeNumbers.java" */ 
class LargestOfThreeNumbers{ 
    public static void main(String args[]){ 
     int x, y, z, largest; 
     x = 1; 
     y = 2; 
     z = 3; 
     largest = x; 
     if(y > x){ 
      largest = y; 
      if(z > y){ 
       largest = z; 
      } 
     }else if(z > x){ 
      largest = z; 
     } 
     System.out.println("The largest number is: " + largest); 
    } 
} 
संबंधित मुद्दे

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