2008-10-25 19 views
19

के लिए टिकमार्क एल्गोरिदम मैं एक एल्गोरिदम की तलाश में हूं जो एक अक्ष पर टिक अंक रखता है, प्रदर्शित करने के लिए एक सीमा दी जाती है, इसे प्रदर्शित करने के लिए चौड़ाई, और एक टिक चिह्न के लिए स्ट्रिंग चौड़ाई को मापने के लिए एक फ़ंक्शन।ग्राफ़ अक्ष

उदाहरण के लिए, मुझे 1e-6 और 5e-6 और चौड़ाई के बीच प्रदर्शित करने की चौड़ाई के बीच प्रदर्शित करने की आवश्यकता है, एल्गोरिदम यह निर्धारित करेगा कि मुझे टिकटें (उदाहरण के लिए) 1e-6, 2e-6 पर रखना चाहिए , 3e-6, 4e-6, और 5e-6। एक छोटी चौड़ाई को देखते हुए, यह तय कर सकता है कि इष्टतम प्लेसमेंट केवल उन्हीं स्थितियों पर है, यानी 2e-6 और 4e-6 (क्योंकि अधिक टिकटें डालने से उन्हें ओवरलैप हो जाएगा)।

एक स्मार्ट एल्गोरिदम 10, 5, और 2 के गुणकों पर टिकटें को वरीयता देगा। इसके अलावा, एक स्मार्ट एल्गोरिदम शून्य के आसपास सममित होगा।

उत्तर

15

ग्राफिक्स जेम्स पर पॉल हेकबर्ट के लेख "ग्राफ लेबल के लिए नाइस नंबर" की जांच करें।

Google book preview

+0

यह अच्छा लग रहा है, मैं किताब खरीद सकता हूं। – Nick

+15

कोई उपलब्ध ई-पुस्तक वाला पुस्तक कैसे स्वीकार्य SO उत्तर हो सकती है ?! – geotheory

+0

आप [अमेज़ॅन] (https://www.amazon.com/dp/0122861663/) पर हेकबर्ट के लेख को पढ़ सकते हैं ("अंदरूनी देखो" सुविधा देखें)। सी कार्यान्वयन परिशिष्ट में है। –

1

शून्य के बारे में सेगमेंट का सबसे लंबा हिस्सा लें (या पूरे ग्राफ, यदि शून्य सीमा में नहीं है) - उदाहरण के लिए, यदि आपके पास सीमा [-5, 1] ​​पर कुछ है, तो [-5,0 ]।

यह पता लगाने के लिए कि इस सेगमेंट में कितना समय लगेगा। यह सिर्फ टिक की चौड़ाई से लंबाई को विभाजित कर रहा है। तो मान लीजिए कि विधि कहती है कि हम -5 से 0 तक 11 टिक डाल सकते हैं। यह हमारी ऊपरी सीमा है। छोटी तरफ के लिए, हम परिणाम को लंबे समय तक मिरर करेंगे।

अब कई (11 तक) टिक्स डालने का प्रयास करें, जैसे फॉर्म में प्रत्येक टिक के लिए मार्कर i * 10 * 10^n, i * 5 * 10^n, i * 2 * 10^एन, जहां एन एक पूर्णांक है, और मैं टिक का सूचकांक हूं। अब यह एक अनुकूलन समस्या है - हम उन टिकों की संख्या को अधिकतम करना चाहते हैं, जिन्हें हम अंतिम टिक और परिणाम के अंत के बीच की दूरी को कम कर सकते हैं। तो हमारे ऊपरी बाउंड से कम, जितना संभव हो सके उतने टिक प्राप्त करने के लिए स्कोर असाइन करें, और अंतिम टिक को एन के करीब प्राप्त करने के लिए स्कोर असाइन करें - आपको यहां प्रयोग करना होगा।

उपरोक्त उदाहरण में, n = 1. आज़माएं हम 1 टिक (i = 0 पर) प्राप्त करते हैं। n = 2 हमें 1 टिक देता है, और हम निचले बाउंड से आगे हैं, इसलिए हम जानते हैं कि हमें दूसरी तरफ जाना है। n = 0 हमें प्रत्येक पूर्णांक बिंदु बिंदु पर 6 टिक देता है। एन = -1 हमें 12 टिक (0, -0.5, ..., -5.0) देता है। एन = -2 हमें 24 टिक देता है, और इसी तरह। स्कोरिंग एल्गोरिदम उन्हें प्रत्येक स्कोर देगा - उच्चतर का मतलब एक बेहतर तरीका है।

आई * 5 * 10^एन, और i * 2 * 10^n के लिए इसे दोबारा करें, और सबसे अच्छे स्कोर के साथ इसे लें।

(एक उदाहरण स्कोरिंग एल्गोरिदम के रूप में, कहें कि स्कोर आखिरी टिक समय की दूरी है जो अधिकतम संख्या में टिकों की संख्या से कम है। यह संभवतः खराब होगा, लेकिन यह एक सभ्य प्रारंभिक बिंदु के रूप में कार्य करेगा) ।

0

मैं jQuery flot ग्राफ लाइब्रेरी का उपयोग कर रहा हूं। यह खुला स्रोत है और धुरी/टिक पीढ़ी काफी अच्छी तरह से करता है। मैं सुझाव दूंगा कि यह कोड देख रहा है और वहां से कुछ विचारों को चुरा रहा है।

-3

आपकी विकास भाषा क्या है? मेरे पास सी ++ में ग्राफ नियंत्रण है जो इस समस्या को आसानी से लॉगरिदम, सेलिंग इत्यादि के संयोजन का उपयोग करके हल करता है। यदि आप चाहते हैं कि आपके लिए कोड समझाएं।

+0

मेरे देव भाषा सी # है, लेकिन मैं एक सी देखकर कोई फ़र्क नहीं पड़ेगा ++ कार्यान्वयन - मैं अनुवाद कर सकते हैं। – Nick

0

यह सरल एल्गोरिथ्म एक अंतराल के 1, 2, या 5 बार से 10 के एक शक्ति और अक्ष सीमा कम से कम 5 अंतराल में विभाजित हो जाता है कई है कि अर्जित करता है।कोड नमूना जावा भाषा में है:

protected double calculateInterval(double range) { 
    double x = Math.pow(10.0, Math.floor(Math.log10(range))); 
    if (range/x >= 5) 
     return x; 
    else if (range/(x/2.0) >= 5) 
     return x/2.0; 
    else 
     return x/5.0; 
} 

यह एक विकल्प है, कम से कम 10 अंतराल के लिए:

protected double calculateInterval(double range) { 
    double x = Math.pow(10.0, Math.floor(Math.log10(range))); 
    if (range/(x/2.0) >= 10) 
     return x/2.0; 
    else if (range/(x/5.0) >= 10) 
     return x/5.0; 
    else 
     return x/10.0; 
} 
संबंधित मुद्दे