【问题标题】:Insertion Sort Average case giving n instead of n^2 unless in really large array sizes插入排序平均情况给出 n 而不是 n^2 除非在非常大的数组大小
【发布时间】:2017-02-11 00:18:02
【问题描述】:

我对插入排序和测试/实现它的平均情况有疑问。

据我所知,它的意思是 n^2,当我做了大约 1 到 200000 个填充随机数的数组时,我完全明白了。但是现在我做了 20 分并计算平均值以确保我得到一条直线所以 O(n)

但是,当我尝试大小为 100,000、从 100,000 到 1,000,000 的数组时,我得到了一条曲线的二次线

public static void averageCase() {
    for (int x = 10000; x <= 30000; x += 1000) {
        int[] averageArray = randomArray(x);
        float average = 0;
        for (int i = 1; i <= 100000; i++) {
            float startTime = System.nanoTime();
            insertionSort(averageArray, averageArray.length);
            float estimateTime = System.nanoTime() - startTime;
            average += estimateTime;
        }
        System.out.println(average/100000);
    }
}

public static int[] randomArray(int n) {
    Random random = new Random();
    int[] randomArray = new int[n];
    for (int i = 0; i < randomArray.length; i++) {
        randomArray[i] = random.nextInt(1000);
    }
    return randomArray;
}

结果是:

16504.586

18559.795

20468.203

22083.01

23530.045

25186.795

27179.09

28793.896

30534.533

32149.34

33869.004

35819.355

37539.02

39216.742

40978.35

42551.215

44186.992

46158.316

47584.38

49660.56

51191.48

【问题讨论】:

  • 是的,而且? O(n^2) 是指长期行为,对于小的 n,它可能看起来不同。
  • 同意 Louis、O、theta 和 omega 时间仅指渐近界。尝试使用更接近无穷大的输入。然后排除所有可能的运行时测试问题,例如缓存等隐藏行为以及使物理计算机与理论计算机不同的任何其他问题。然后您可能会看到符合您期望的结果。
  • 我只是在确定/确认说实话,我花了很多时间认为我的实施方法有问题,因为我已经尝试并确认了最好和最坏的情况,但不确定为什么我无法获得适当的测量值。
  • 我认为问题不在于 n 不够大,而在于您的代码没有测量您认为它正在测量的内容。看我的回答。

标签: java algorithm performance big-o insertion-sort


【解决方案1】:

记住 O(n^2) 表示你的上限。插入排序具有线性下限。尝试更大的数字和多次。

【讨论】:

    【解决方案2】:

    在您的内部循环中,您重复地对同一个数组进行排序,而不是每次都对其进行随机化。

    for (int i = 1; i <= 100000; i++) {
        float startTime = System.nanoTime();
        insertionSort(averageArray, averageArray.length);
        float estimateTime = System.nanoTime() - startTime;
        average += estimateTime;
    }
    

    由于插入排序在已排序的输入上以线性时间运行,因此您测量的是二次时间算法的 1/100000,以及线性时间算法的 99999/100000。

    这就是为什么您的时间安排比您预期的要平坦得多。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2019-06-14
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多