搜索算法中的时钟函数一般返回0

时间:2015-08-21 17:18:19

标签: c++ algorithm clock

我确定这看起来像是一个微不足道的问题,但我遇到了" 时钟()"功能在我的程序中(请注意我已经检查过类似的问题,但它们似乎并没有在相同的上下文中关联)。我的时钟输出几乎总是0,但似乎也有几个10(这就是我感到困惑的原因)。我考虑过这样一个事实:函数调用可能过快处理但是通过排序算法判断,肯定应该花一些时间。

提前感谢大家的帮忙! :)

PS我真的很抱歉关于功能之间变量关联的混乱(它将组合代码I合并在一起,并且在美化之前我正确关注正确的输出) :d

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int bruteForce(int array[], const int& sizeofArray);

int maxSubArray (int array[], int arraySize);

int kadane_Algorithm(int array[], int User_size);

int main()
{
    int maxBF, maxDC, maxKD;
    clock_t t1, t2, t3;
    int arraySize1 = 1;
    double t1InMSEC, t2InMSEC, t3InMSEC;

    while (arraySize1 <= 30000)
    {
        int* array = new int [arraySize1];

        for (int i = 0; i < arraySize1; i++)
        {
            array[i] = rand()% 100 + (-50);
        }

        t1 = clock();
        maxBF = bruteForce(array, arraySize1);
        t1 = clock() - t1;
        t1InMSEC = (static_cast <double>(t1))/CLOCKS_PER_SEC * 1000.00;

        t2 = clock();
        maxDC = maxSubArray(array, arraySize1);
        t2 = clock() - t2;
        t2InMSEC = (static_cast <double>(t2))/CLOCKS_PER_SEC * 1000.00;

        t3 = clock();
        maxKD = kadane_Algorithm(array, arraySize1);
        t3 = clock() - t3;
        t3InMSEC = (static_cast <double>(t3))/CLOCKS_PER_SEC * 1000.00;

        cout << arraySize1 << '\t' << t1InMSEC << '\t' << t2InMSEC << '\t' << t3InMSEC << '\t' << endl;
        arraySize1 = arraySize1 + 100;
        delete [] array;
    }
    return 0;
}

int bruteForce(int array[], const int& sizeofArray)
{
    int maxSumOfArray = 0;
    int runningSum = 0;
    int subArrayIndex = sizeofArray;

    while(subArrayIndex >= 0)
    {
        runningSum += array[subArrayIndex];

        if (runningSum >= maxSumOfArray)
        {
            maxSumOfArray = runningSum;
        }

        subArrayIndex--;
    }
return maxSumOfArray;
}

int maxSubArray (int array[], int arraySize)
{
  int leftSubArray = 0;
  int rightSubArray = 0;
  int leftSubArraySum = -50;
  int rightSubArraySum = -50;
  int sum = 0;
  if (arraySize == 1) return array[0];

  else
  {
    int midPosition = arraySize/2;
    leftSubArray = maxSubArray(array, midPosition);
    rightSubArray = maxSubArray(array, (arraySize - midPosition));

    for (int j = midPosition; j < arraySize; j++)
    {
        sum = sum + array[j];
        if (sum > rightSubArraySum)
        rightSubArraySum = sum;
    }
    sum = 0;

    for (int k = (midPosition - 1); k >= 0; k--)
    {
        sum = sum + array[k];
        if (sum > leftSubArraySum)
        leftSubArraySum = sum;
    }

  }
  int maxSubArraySum = 0;

  if (leftSubArraySum > rightSubArraySum)
  {
      maxSubArraySum = leftSubArraySum;
  }

  else maxSubArraySum = rightSubArraySum;

  return max(maxSubArraySum, (leftSubArraySum + rightSubArraySum));
}

int kadane_Algorithm(int array[], int User_size)
{
    int maxsofar=0, maxending=0, i;

    for (i=0; i < User_size; i++)
    {
        maxending += array[i];

        if (maxending < 0)
        {
            maxending = 0 ;
        }

        if (maxsofar < maxending)
        {
            maxsofar = maxending;
        }
    }
return maxending;
}

输出如下:(仅使用片段进行可视化)

  • 29001 0 0 0
  • 29101 0 10 0
  • 29201 0 0 0
  • 29301 0 0 0
  • 29401 0 10 0
  • 29501 0 0 0
  • 29601 0 0 0
  • 29701 0 0 0
  • 29801 0 10 0
  • 29901 0 0 0

1 个答案:

答案 0 :(得分:4)

您的问题可能是clock()没有足够的分辨率:您真正 在所允许的精度内零时间。如果没有,那么几乎可以肯定的是,编译器正在优化计算,因为它正在计算未被使用的东西。

默认情况下,您确实应该使用chrono标头而不是过时的C设施进行计时。特别是high_resolution_clock,如果你发现自己确实需要这种东西,那么它往往适合测量相对较快的东西。

准确地对事物进行基准测试是一项非常重要的练习,你真的应该阅读如何正确地做到这一点。有许多问题涉及缓存或令人惊讶的编译器优化或可变CPU频率等问题,许多程序员以前从未想过这些问题,忽略它们会导致错误的结论。

一个特别的方面是你通常应该安排实际需要一些时间的事情;例如运行你正在测试数千个不同输入的任何东西,以便持续时间例如是整整一秒或更长的数量级。这有助于提高基准测试的精度和准确性。