Algorithm 在某些算法的时间复杂度中寻找常数c
我需要通过检查插入排序(cn^2)和合并排序(cnlgn)的运行时间的结果来帮助查找和近似插入排序(cn^2)和合并排序(cnlgn)复杂性中的常数c 有一点背景知识,我的目的是“实现插入排序和合并排序(降序)算法,并测量这两种算法的性能。对于每种算法,以及每种n=100、200、300、400、500、1000、2000、4000,测量输入为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的随机置换 运行时间应不包括初始化时间。“ 我已经完成了这两种算法的代码,
如果需要,我可以提供代码。很难确定这些常量的值,特别是对于使用缓存、管道和其他“性能因素”的现代处理器 当然,您可以尝试找到一个近似值,然后需要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
的增加,这将由于缓存的使用而改变。此外,如果使用任何动态容器,则必须将其使用的复杂性包括在算法中,这有时可能非常重要 首先要了解的是,复杂性和运行时间是不一样的,可能彼此没有太大关系
复杂度是一种理论测量,用于了解与较小的输入相比,或与其他算法相比,算法在较大输入时的速度是如何减慢的
运行时间取决于具体的实现、它运行的计算机、在同一台计算机上运行的其他程序以及许多其他内容。您还将注意到,如果输入不正确,运行时间将减慢