如何比较具有恒定运行时间的两种算法?

时间:2020-07-21 12:04:44

标签: algorithm comparison complexity-theory

我目前正在研究一篇论文,以开发一种算法,该算法可以计算矩形和三角形之间的相交区域。在我的结论中,我想将其与众所周知的扫掠线算法进行比较。

但是,问题是,由于该算法无法以任何形式/通过任何变量缩放(它仅占用一个矩形和一个三角形),因此我不能使用渐近Big-O-Notation。

我应该怎样比较这两个?我目前的想法是计算所有乘法并优化这两种算法以使其尽可能少。

其他想法是计算所有算术运算和/或所有比较。

对于在此问题上提出的任何提示或论文链接,我将不胜感激,因为在研究此主题时,我总是会找到有关Big-O的参考文献。

2 个答案:

答案 0 :(得分:1)

您可以计算算术运算,尤其是乘法和除法,这是最难执行的运算。加法很容易。

从技术上讲,输入的“大小”仍然可以按坐标的位数进行缩放。如果坐标为(1、0),(0、1)等,则当然会比坐标为(0.97659532947896743856826735964827、0.597865467885453586248625678)等更快,并且您期望得到该区域的精确答案。因此,您可以使用n函数(输入中的总位数)来表示算法的复杂性。 但是,考虑到这一点可能与只计算乘法和除法的次数相同。

答案 1 :(得分:1)

如果我要比较一个函数的性能,我将生成一组很大的圆和三角形(其中任何圆ci与任何三角形ti相交)作为输入,然后我会这样做:

double timeMyAlgorithm = 0;
double timeSweepLine   = 0;
double chronometer = 0;
double tests = 0;

foreach(Triangle ti : triangles){
    foreach(Circle ci : circles){

        chronometer = Time.currentTime();
        MyAlgorithm(ti, ci);
        chronometer = Time.currentTime() - chronometer;
        timeMyAlgorithm += chronometer;

        chronometer = Time.currentTime();
        SweepLine(ti, ci);
        chronometer = Time.currentTime() - chronometer;
        timeMyAlgorithm += chronometer;

        tests += 1;
    }
}

print("Full time: " + timeMyAlgorithm + " x " + timeSweepLine);
print("Average time: " + (timeMyAlgorithm/tests) + " x " + (timeSweepLine/tests));
相关问题