我试图理解Leader-Follower算法的复杂性。以下是算法的最坏情况:
public class ScalabilityTest {
public static void main(String[] args) {
long oldTime = System.currentTimeMillis();
double[] array = new double[5000000];
for ( int i = 0; i < array.length; i++ ) {
for ( int j = 0; j < i; j++ ) {
double x = array[j] + array[i];
}
}
System.out.println( (System.currentTimeMillis()-oldTime) / 1000 );
}
}
我假设复杂度为O(N * Log(N)),这是正确的吗?由于第一个循环,我确定前N个部分,但是我无法确定如何计算内循环的复杂性。
编辑: 关于领导者 - 跟随者算法的简短信息:该算法是用于聚类数据流的在线聚类算法,其中不必定义聚类的数量。该算法接受数据输入和阈值。该算法的工作原理如下:
1-它计算传入项目与所有现有群集的相似性 2-如果项目与群集之间的相似性高于阈值,则该项目将添加到群集中。 3-如果不是,算法将创建一个新集群并将该项目分配给该集群。
由此我们可以看到最坏的情况:假设我们有1000个元素,并且假设每个传入的项目都找不到要分配它的集群,那么它将在最后一次迭代时结束1000个集群。 / p>
答案 0 :(得分:2)
该算法的复杂性为Θ(n 2 )。要看到这一点,请注意内部循环将在i = 0时运行0次迭代,当i = 1时运行1次迭代,当i = 2时运行2次,等等。如果对i进行求和,范围从0到n - 1,你得到了
0 + 1 + 2 + ... +(n - 1)= n(n - 1)/ 2 =Θ(n 2 )
因此,总运行时间为Θ(n 2 )。在分析选择排序和(最差情况下)插入排序时,您会看到与此类似的分析,因为每个算法都执行1 + 2 + ... + n工作。
希望这有帮助!
答案 1 :(得分:0)
正式地,答案可以描述如下(其中 n = array.length ):