تحويل أرقام عشوائية إلى إحداثيات XY للرسوم البيانية
سؤال
أعطانا أستاذي مهمة لاختبار الاختلاف في أوقات التشغيل وأحجام البحث باستخدام خوارزميات خطية وثنائية ، ويتم رسم البيانات.
لدي طرق البحث تضع أحجام وقت التشغيل والصفوف كنقاط في قائمة 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);
وبهذه الطريقة ، تقوم بحساب المضاعف بدلاً من اختياره يدويًا.