【问题标题】:c++ sorting algorithms durationc++排序算法持续时间
【发布时间】:2012-11-04 17:11:49
【问题描述】:

我一直在计算这些排序算法的持续时间。我将所有排序方法循环了 2000 次,然后将总持续时间除以 2000 以获得适当的持续时间值。问题是;它没有显示排序方法的特定代码部分所花费的确切时间值。我的意思是duration 变量通过程序流显示增加的值。例如,对于N = 10000insertionSort() 给出 0.000635,mergeSort() 给出 0.00836 和 heapSort() 给出 0.018485,当我改变这些的顺序时,duration 仍然通过程序上升,而不管算法类型如何。我尝试为每个过程提供不同的持续时间值,但这不起作用。有人可以帮我理解这个问题还是有其他时间衡量风格?

对不起,如果这是一个愚蠢的问题并且我的语法不好。

int main(){

    srand(time(NULL));

    int N, duration;

    cout << endl << "N : ";
    cin >> N; // N is array sze.
    cout << endl;

    // a4 would be the buffer array (for calculating proper duration).
    int *a1 = new int[N];
    int *a2 = new int[N];
    int *a3 = new int[N];
    int *a4 = new int[N];

    cout << endl << "Unsorted array : " << endl;

    for (int i = 0; i < N; i++){

        a4[i] = rand() % 100;
        cout << a4[i] << " ";
    }

/*------------------------------------------------------------------------------*/

    cout << endl << endl <<"Sorting with Insertion Sort, please wait..." << endl;

    for(int i = 0; i < 2000; i++){

        a1 = a4;

        duration = clock();
        insertionSort(a1, N - 1);
        duration += clock() - duration;
    }

    cout << endl << "Insertion sort : " << endl;

    print(a1, N);

    cout << endl << endl << "Approximate duration for Insertion Sort : ";
    cout << (double) (duration / 2000) / CLOCKS_PER_SEC;
    cout << " s." << endl;

/*------------------------------------------------------------------------------*/

    cout << endl << endl << "Sorting with Merge Sort, please wait..." << endl;

    for(int i = 0; i < 2000; i++){

        a2 = a4;

        duration = clock();
        mergeSort(a2, 0, N - 1);
        duration += clock() - duration;
    }

    cout << endl << "Merge sort : " << endl;

    print(a2, N);

    cout << endl << endl << "Approximate duration for Merge Sort : ";
    cout << (double) (duration / 2000) / CLOCKS_PER_SEC;
    cout << " s."<< endl << endl;

/*------------------------------------------------------------------------------*/

    cout << endl << endl << "Sorting with Heap Sort, please wait..." << endl;

    for(int i = 0; i < 2000; i++){

        a3 = a4;
        duration = clock();
        heapSort(a3, N);
        duration += clock() - duration;
    }

    cout << endl << "Heap sort : " << endl;

    print(a3, N);

    cout << endl << endl << "Approximate duration for Heap Sort : ";
    cout << (double) (duration / 2000) / CLOCKS_PER_SEC;
    cout << " s."<< endl << endl;

    return 0;
}

【问题讨论】:

  • 请注意,原始数据的顺序也会影响排序性能。您不仅需要对一组数据执行多次排序,还需要对多组数据执行排序以获得更准确或整体的性能评级。另请注意,时间可能会受到您机器上运行的其他应用程序的影响。

标签: c++ algorithm sorting time duration


【解决方案1】:

您的程序中的错误是您在整个循环中重置了持续时间。处理时间的一种更简洁的方法是将 duration 变量修改放在 for 循环之外。例如:

duration = clock();
for(int i = 0; i < 2000; i++){
    a2 = a4;
    mergeSort(a2, 0, N - 1);
}
duration = clock() - duration

编辑:忘记删除循环内的部分。现已修复。

【讨论】:

  • +1。这是最好的解决方案。它包括小循环开销,但替代方案将涉及计算每次迭代的持续时间并将其添加到total_duration 或类似的。我怀疑对clock 的调用将需要比循环开销更多的周期。
  • 如果我在循环内使用durationtotal_durationoutside 或@jma127 的方式,会有重要的不同吗?
  • 它为total_duration 方法所没有的计算增加了一点额外的时间:即for 循环迭代/条件检查和指针分配。但是,给定一个足够大的N(比如说,1000 左右),它可以忽略不计。
【解决方案2】:

第一,您似乎没有在不同类型的运行之间重置duration。这意味着单个迭代持续时间的总和将在每个排序阶段向下传播(如果下一个点也不是问题的话)。

接下来,您需要设置一个单独的变量,将其命名为 durationSum 并使用它,就像您当前在迭代后的摘要阶段使用 duration 一样。目前,您每次迭代都会花光您的总和。

例如:

clock_t durationSum = 0;
clock_t duration = 0;

for(int i = 0; i < 2000; i++){

    a1 = a4;

    duration = clock();
    insertionSort(a1, N - 1);
    durationSum += clock() - duration;
}

接下来,您在摊销duration 时会出现类型错误。你有:

cout << (double) (duration / 2000) / CLOCKS_PER_SEC;

通过最少的编辑,这将更精确地工作(但应该使用durationSum):

cout << (double) (duration / 2000.0) / CLOCKS_PER_SEC;

之前,您说“使用整数除法将 duration 除以 2000,然后将其提升为 double 并除以 CLOCKS_PER_SEC(这次使用浮点除法,因为其中一个操作数是 @ 987654332@ 和一个整数)。使用 2000.0 会强制将 duration 提升为 double,以进行 2000 的浮点除法。

最后,与单次排序迭代相比,最好考虑循环开销可以忽略不计,并且每 2000 次排序迭代只调用两次clock()。

例如:

clock_t insert_sort_start = clock();

for(int i = 0; i < 2000; i++){
    a1 = a4;
    insertionSort(a1, N - 1);
}

double duration_sec = (clock() - insert_sort_start) / 2000.0 / CLOCKS_PER_SEC;

最后,请注意您使用duration 作为int,而实际上它是clock_t,如果您在64 位系统上,很可能这是64 位clock() 返回的数字并“缩小”(向下转换)为 32 位整数 int。使用clock_t

【讨论】:

  • 另外,一个与您的直接问题无关的问题:您为什么要分配a1a2a3?当您当前正在使用它们时,您只需将它们重新分配为指向a4(并丢失对它们分配的内存的引用,泄漏)。您可以将它们声明为int*,而不是使用new 初始化它们。
  • 感谢所有这些提示。作为菜鸟,我仍然受苦:)
猜你喜欢
  • 2012-06-08
  • 2011-07-30
  • 2016-09-10
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 2012-06-15
相关资源
最近更新 更多