它似乎是一种基于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)。
答案 0 :(得分:5)
对我来说,这看起来像是一个普通的二进制搜索算法,已知它具有O(log n)
复杂度(除了它返回是否找到值,而不是它的位置)。您基本上“访问”最多log n
个数组条目:
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),但那不是你正在寻找的答案。