java中big O表示法中两个代码之间的差异

时间:2016-05-11 10:47:22

标签: java

我正在阅读有关数组的内容,我编写了下面的第一个代码。老师确实编写了第二个代码,用于在数组中搜索特定数字。 java中以下两个代码之间ordo表示法的区别是什么? 哪个代码表现得更好,以及它的大O符号。

我的代码

public static void main(String[] args)
{

   int[] data = { 100, 110, 120, 130, 140, 150 };
   int index = binarySearch(data, 120);
   System.out.println(index);
}

private static int binarySearch(int[] data, int i)
{

   if (data.length == 0)
   {
      return -1;
   }

   for (int k = 0; k < data.length; k++)
   {
      if (data[k] == i)
      {
         return k;
      }
   }

   return -1;
}   

教师代码

public static void main(String[] args)
{
   int[] data = { 100, 110, 120, 130, 140, 150 };
   int index = binarySearch(data, 120);
   System.out.println(index);
}

static int binarySearch(int[] keys, int v)
{
   int position;
   int begin = 0, end = keys.length - 1;
   while (begin <= end)
   {
      position = (begin + end) / 2;
      if (keys[position] == v)
      {
         return position;
      }
      else if (keys[position] < v)
      {
         begin = position + 1;
      }
      else
      {
         end = position - 1;
      }
   }
   return -1;
}

2 个答案:

答案 0 :(得分:1)

第一个解决方案是O(n)。

第二个解决方案是O(log n)。

答案 1 :(得分:0)

在您的实现中,运行时间为O(n)。在下面的实现中,它是O(log n),在log n期间意味着它是二进制对数。

你可以看到这个,因为数组总是在中间分开。这就像每次除以2,这与指数操作相反,也称为对数。

请注意,如果您有一个已排序的数组,二进制搜索只能正常工作。

对于一次运行,它会更慢,因为您首先必须对数组进行排序。在大多数情况下,排序一次完成并且多次搜索 - 因此二进制搜索将为您带来更大的好处。