我正在阅读有关数组的内容,我编写了下面的第一个代码。老师确实编写了第二个代码,用于在数组中搜索特定数字。 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;
}
答案 0 :(得分:1)
第一个解决方案是O(n)。
第二个解决方案是O(log n)。
答案 1 :(得分:0)
在您的实现中,运行时间为O(n)。在下面的实现中,它是O(log n),在log n期间意味着它是二进制对数。
你可以看到这个,因为数组总是在中间分开。这就像每次除以2,这与指数操作相反,也称为对数。
请注意,如果您有一个已排序的数组,二进制搜索只能正常工作。
对于一次运行,它会更慢,因为您首先必须对数组进行排序。在大多数情况下,排序一次完成并且多次搜索 - 因此二进制搜索将为您带来更大的好处。