【问题标题】:difference between two codes in big O notation in java [duplicate]java中大O符号的两个代码之间的区别[重复]
【发布时间】:2016-05-11 18:53:09
【问题描述】:

我正在阅读有关数组的内容,并编写了下面的第一个代码。老师确实编写了第二个代码,用于在数组中搜索特定数字。 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;
}

【问题讨论】:

  • 听起来你把作业丢给我们了。甚至尝试过自己寻找答案?此外:您的代码使用二进制搜索。不要给方法命名与方法实际执行的名称不匹配。
  • 这不是作业,老师代码取自这里users.soe.ucsc.edu/~sbrandt/13H/slides/Chapter5.pdf我在帖子中说我正在阅读,我正在学习自己..你现在清楚了吗?
  • 在 naoming 约定中,Järgermeister 是对的 - 您的代码不是二进制搜索 :)
  • @Supahupe 谢谢你,我明白了
  • @GfsdGfds 确切地说:您刚刚发布了一些代码。您没有提供任何证据表明您试图自己解决此问题。

标签: java


【解决方案1】:

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

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

【讨论】:

  • 你怎么知道第二个解决方案是 O(log n) ?谢谢
  • @GfsdGfds 因为问题(仍然要访问的数组元素的数量)在每次迭代中都会减半。您只能这样做 log n 次,因此 while 循环将迭代最大 log n 次,这是您的大 O 时间复杂度。
【解决方案2】:

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

您可以看到这一点,因为数组总是在中间分开。这就像每次除以二,这与指数运算相反,也称为对数。

请注意,二进制搜索只有在您有排序数组时才能正常工作。

对于一次运行,它会更慢,因为您首先必须对数组进行排序。在大多数情况下,排序会进行一次,搜索会进行多次 - 因此二分查找对您的好处会更大。

【讨论】:

  • 谢谢 .. 排序数组的大 O 表示法是什么?
  • 这取决于您选择的排序算法。更快(恕我直言,最快)的排序算法之一是归并排序,其平均运行时间为 O(n * log n),最坏情况下为 O(n²)
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2016-08-15
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2014-06-17
相关资源
最近更新 更多