算法的大O分析?

时间:2013-11-26 19:06:08

标签: algorithm big-o analysis mergesort

它似乎是一种基于Mergesort的搜索算法。它用于排序的数字数组。 Big-O复杂性是否仍为O(n log n)?

public static boolean fastSearch(int[] data, int min, int max, int target)
{
     int N = data.length;
     boolean found = false;
     int midpoint = (min+max)/2; // determine the midpoint

     if (data[midpoint] == target) {
          found = true;
     } else {
          if (data[midpoint] > target) {
               if (min <= midpoint - 1) {
                    // Recursion on the left half of the array
                    found = fastSearch(data, min, midpoint-1, target);
               }
          } else {
               if (midpoint + 1 <= max) {
                    // Recursion on the right half of the array
                    found = fastSearch(data, midpoint+1, max, target);
               }
          }
     }
     return found;
}

这是我自己的分析,我只是想确认一下我是否正确:

每次传递数据都会使子节的大小翻倍。这些需要重复加倍,直到找到目标。它需要log(n)倍增,并且数据的每次传递与项目数量成比例。所以,它是O(n log n)。

1 个答案:

答案 0 :(得分:5)

对我来说,这看起来像是一个普通的二进制搜索算法,已知它具有O(log n)复杂度(除了它返回是否找到值,而不是它的位置)。您基本上“访问”最多log n个数组条目:

  • 首先,您访问并检查中间的点,并检查它是否是您寻找的那个,
  • 如果没有,您将搜索范围限制为“较低”或“较高”的数组搜索部分,
  • 所以你把表切成两半,然后只选择其中一个部分,所以只剩下1个元素(最坏的情况 - 找到的元素会在之前找到),
  • 你能做多少次? n/2/2/2/2/.../2 = 1 - /2的数量为log n

这不是严格的分析。可能存在一些逐个错误以及没有边界条件检查,但最终结果肯定是O(log n)

当然,我们必须假设data数组已排序且n = max - min(以及min < max)。否则那将是垃圾。

BTW:f(n) = O(log n)表示log n(从某一点来说)是f(n)的上限(可能有一些正常数因子)。对于f(n) = O(n log n)n log n意味着相同。所以,是的,如果它被log n限制,它肯定受到n log n的限制(因为f(n) <= c1(log n) <= c2(n log n)对于所有n更好的一些N),但那不是你正在寻找的答案。