2010-01-19 112 views
0

我的教授给了我们一个任务,使用线性&二进制算法测试运行时和搜索大小的差异,并将数据绘制成图。将随机数转换为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次测试。有没有更有效的方式来根据号码大小分配号码?

回答

2

当您试图确定您的测量范围时,您可以将范围大小除以该范围,然后计算想要在图表中显示的数字。

顺便说一句,在您的代码中,如果值为y <= 1000,则表示逻辑错误,第一个条件的计算结果为true,第二个条件的计算结果永远不会被计算。

此外,它似乎越高的值范围,你的图点越低。那是否如预期的那样? (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; 

请注意,超出范围的索引作为大于数组中最大值的值的范围。

+0

我正在使用的图形库附带了课本。它很像Turtle对象,只是更加用户友好,并且它在屏幕上显示光标x-y坐标。对于弄清楚在哪里放置东西非常有用。唯一的缺点是(0,0)坐标位于窗口的左上角,所以这就是为什么值看起来偏斜 – Jason 2010-01-19 19:57:14

1

如何newy = yaxis - 32 * ((y/250)% 8);?

+0

对于y <250,它会产生newy = yaxis。 – wtaniguchi 2010-01-19 16:55:32

+0

这看起来像它会工作,并有一些测试要做。谢谢! – Jason 2010-01-19 17:13:48

1

我会重新格式化您的代码,以更多的东西是这样的:

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

这样,你计算乘数,而不是手动选择它。

+0

从效率的角度来看这真的是一个打击?由于y轴上<20点,花费不到3分钟就可以设置乘数 – Jason 2010-01-19 17:16:10

+0

我不确定我明白你在这里问的是什么。 该行对嵌套if语句的好处是可以缩放到y轴上的任意数量的点,并且需要更少的周期来计算。 – Aaron 2010-01-19 17:45:48