تحويل أرقام عشوائية إلى إحداثيات XY للرسوم البيانية

StackOverflow https://stackoverflow.com/questions/2095168

  •  21-09-2019
  •  | 
  •  

سؤال

أعطانا أستاذي مهمة لاختبار الاختلاف في أوقات التشغيل وأحجام البحث باستخدام خوارزميات خطية وثنائية ، ويتم رسم البيانات.

لدي طرق البحث تضع أحجام وقت التشغيل والصفوف كنقاط في قائمة ArrayList ، والتي يتم إرسالها بعد ذلك إلى فئة GraphResults للتخطيط. أحتاج إلى تحويل نقاط البيانات هذه إلى إحداثيات XY من قبل. حجم البحث هو المحور X ووقت التشغيل هو محور Y.

نظرًا لأن أحجام البحث يتم إصلاحها كمضاعف من 128 ولا يوجد سوى 8 أحجام ، فقد استخدمت التبديل لحساب قيمة X ، لكنني أبحث عن طريقة أكثر كفاءة لتحويل أوقات التشغيل إلى إحداثيات.

الآن ، أنا أستخدم الشرطية المتداخلة مع 5 مثل هذا:

if (y<=1000) {
    if (y<= 500) { 
        if (y<= 250) {
            newy= yaxis-32; }//equals to 250ms category
        else {
            newy= yaxis-(32*2); }//500ms category
   } 
else if (y<=750) {
    newy= yaxis-(32*3);} //750ms category
else {
    newy= yaxis-(32*4);} //1000ms category
} //end of the 1000ms tests

في الوقت الحالي ، تتطلب الأرقام التي تزيد عن 5000 مللي ثانية 7 اختبارات. هل هناك طريقة أكثر كفاءة لتعيين رقم بناءً على حجم الرقم؟

هل كانت مفيدة؟

المحلول

بينما تحاول تحديد نطاق القياس الخاص بك ، يمكنك تقسيم المبلغ على حجم النطاق ، يليه حساب الرقم الذي تريد عرضه في الرسم البياني.

راجع للشغل ، في الكود الخاص بك ، قمت بخطأ منطقي ، إذا كانت القيمة y <= 1000 الشرط الأول يقيم إلى صواب ، والثاني ل y <= 750 لن يتم تقييمها أبدًا.

كما يبدو أنه كلما ارتفع نطاق القيمة ، انخفضت نقطة الرسم البياني الخاص بك. هل هذا كما هو مقصود؟ (1000 -> ymax - 128 بينما 1 -> ymax - 32)

جانبا ، إذا كنت ترغب في مقارنة القيم بالنطاقات غير المتكافئة ، يمكنك أيضًا القيام بشيء مثل بحث صفيف (رمز زائف):

int[] ranges = new int { 50, 500, 5000, 50000 };

for (int n = 0; n < ranges.length && value > ranges[n]; n++) {
}

int range = n;
int newy = yaxis - range * 32;

لاحظ أن الفهرس خارج المدى يعمل كنطاق موجود لقيمة أكبر من أكبر قيمة في صفيفك.

نصائح أخرى

ماذا عن newy = yaxis - 32 * ((y/250)% 8);?

أود إعادة تنسيق رمزك إلى شيء مثل هذا:

newy = yaxis - 32 * ((y-1)/250 + 1);

وبهذه الطريقة ، تقوم بحساب المضاعف بدلاً من اختياره يدويًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top