Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在某些算法的时间复杂度中寻找常数c_Algorithm_Sorting_Time Complexity_Mergesort_Insertion Sort - Fatal编程技术网

Algorithm 在某些算法的时间复杂度中寻找常数c

Algorithm 在某些算法的时间复杂度中寻找常数c,algorithm,sorting,time-complexity,mergesort,insertion-sort,Algorithm,Sorting,Time Complexity,Mergesort,Insertion Sort,我需要通过检查插入排序(cn^2)和合并排序(cnlgn)的运行时间的结果来帮助查找和近似插入排序(cn^2)和合并排序(cnlgn)复杂性中的常数c 有一点背景知识,我的目的是“实现插入排序和合并排序(降序)算法,并测量这两种算法的性能。对于每种算法,以及每种n=100、200、300、400、500、1000、2000、4000,测量输入为 已排序,即n,n-1,…,3,2,1 反向排序1,2,3,…n 1,2,…,n的随机置换 运行时间应不包括初始化时间。“ 我已经完成了这两种算法的代码,

我需要通过检查插入排序(cn^2)和合并排序(cnlgn)的运行时间的结果来帮助查找和近似插入排序(cn^2)和合并排序(cnlgn)复杂性中的常数c

有一点背景知识,我的目的是“实现插入排序和合并排序(降序)算法,并测量这两种算法的性能。对于每种算法,以及每种n=100、200、300、400、500、1000、2000、4000,测量输入为

  • 已排序,即n,n-1,…,3,2,1
  • 反向排序1,2,3,…n
  • 1,2,…,n的随机置换
  • 运行时间应不包括初始化时间。“

    我已经完成了这两种算法的代码,并将测量值(微秒)放入电子表格中。现在,我不确定如何找到这个c,因为每个算法的每个条件的值不同

    时间表供参考:

    InsertionSort MergeSort n AS RS Random AS RS Random 100 12 419 231 192 191 211 200 13 2559 1398 1303 1299 1263 300 20 236 94 113 113 123 400 25 436 293 536 641 556 500 32 504 246 91 81 105 1000 65 1991 995 169 246 214 2000 9 8186 4003 361 370 454 4000 17 31777 15797 774 751 952 插入排序合并排序 n作为RS随机作为RS随机 100 12 419 231 192 191 211 200 13 2559 1398 1303 1299 1263 300 20 236 94 113 113 123 400 25 436 293 536 641 556 500 32 504 246 91 81 105 1000 65 1991 995 169 246 214 2000 9 8186 4003 361 370 454 4000 17 31777 15797 774 751 952
    如果需要,我可以提供代码。

    很难确定这些常量的值,特别是对于使用缓存、管道和其他“性能因素”的现代处理器

    当然,您可以尝试找到一个近似值,然后需要Excel或任何其他电子表格


    输入数据,创建图表,然后添加趋势线。电子表格为您计算常量的值。

    很难确定这些常量的值,特别是对于使用缓存、管道和其他“性能因素”的现代处理器

    当然,您可以尝试找到一个近似值,然后需要Excel或任何其他电子表格

    输入数据,创建图表,然后添加趋势线。电子表格为您计算常量值。

    首先需要注意:

  • 您有非常小的
    n

    只有当
    n
    足够大时,算法复杂性才开始对应于运行时。因为
    n=4000
    ~4KB
    的数据,仍然可以放入大多数CPU缓存中,所以增加到至少
    n=1000000
    可以并且将大大改变运行时和
    n
    之间的关系

  • 运行时测量

    对于随机数据,您需要的是平均运行时间测量值,而不是单个测量值,因此对于任何
    n
    数据,每个数据集至少进行5次测量,并使用所有数据集的平均时间

  • 现在如何获取
    c

    如果程序具有复杂性
    O(n^2)
    这意味着对于足够大的
    n
    运行时:

    t(n)=c*n^2
    
    所以做一些测量。我从插入排序中选择最后3个,反向排序,因为如果我没有弄错的话,应该匹配最坏情况
    O(n^2)
    复杂性,所以:

    c*n^2   =t(n)
    c*1000^2= 1.991 
    c*2000^2= 8.186 
    c*4000^2=31.777
    
    解方程:

    c=t(n)/(n^2)
    c= 1.991/ 1000000=1.991 us
    c= 8.186/ 4000000=2.0465 us
    c=31.777/16000000=1.9860625 us
    
    如果一切正常,则不同
    n
    c
    应相对相同。在您的情况下,每个元素大约为
    2 us
    ,但正如我前面提到的,随着
    n
    的增加,这将由于缓存的使用而改变。此外,如果使用任何动态容器,则必须将其使用的复杂性包括在算法中,这有时可能非常重要

    首先请注意:

  • 您有非常小的
    n

    只有当
    n
    足够大时,算法复杂性才开始对应于运行时。因为
    n=4000
    ~4KB
    的数据,仍然可以放入大多数CPU缓存中,所以增加到至少
    n=1000000
    可以并且将大大改变运行时和
    n
    之间的关系

  • 运行时测量

    对于随机数据,您需要的是平均运行时间测量值,而不是单个测量值,因此对于任何
    n
    数据,每个数据集至少进行5次测量,并使用所有数据集的平均时间

  • 现在如何获取
    c

    如果程序具有复杂性
    O(n^2)
    这意味着对于足够大的
    n
    运行时:

    t(n)=c*n^2
    
    所以做一些测量。我从插入排序中选择最后3个,反向排序,因为如果我没有弄错的话,应该匹配最坏情况
    O(n^2)
    复杂性,所以:

    c*n^2   =t(n)
    c*1000^2= 1.991 
    c*2000^2= 8.186 
    c*4000^2=31.777
    
    解方程:

    c=t(n)/(n^2)
    c= 1.991/ 1000000=1.991 us
    c= 8.186/ 4000000=2.0465 us
    c=31.777/16000000=1.9860625 us
    

    如果一切正常,则不同
    n
    c
    应相对相同。在您的情况下,每个元素大约为
    2 us
    ,但正如我前面提到的,随着
    n
    的增加,这将由于缓存的使用而改变。此外,如果使用任何动态容器,则必须将其使用的复杂性包括在算法中,这有时可能非常重要

    首先要了解的是,复杂性运行时间是不一样的,可能彼此没有太大关系

    复杂度是一种理论测量,用于了解与较小的输入相比,或与其他算法相比,算法在较大输入时的速度是如何减慢的

    运行时间取决于具体的实现、它运行的计算机、在同一台计算机上运行的其他程序以及许多其他内容。您还将注意到,如果输入不正确,运行时间将减慢