为什么二进制搜索比MATLAB中的线性搜索运行得慢?
以下是我的二进制搜索代码:为什么二进制搜索比MATLAB中的线性搜索运行得慢?,matlab,runtime,binary-search,linear-search,Matlab,Runtime,Binary Search,Linear Search,以下是我的二进制搜索代码: function result = binarySearch(a, key) binaryFound = false; halfIndex = fix(length(a)/2) + 1; if a(halfIndex) == key binaryFound = true; elseif length(a)==1 && a(1)~=key binaryFound = false; elseif key > a(halfIndex
function result = binarySearch(a, key)
binaryFound = false;
halfIndex = fix(length(a)/2) + 1;
if a(halfIndex) == key
binaryFound = true;
elseif length(a)==1 && a(1)~=key
binaryFound = false;
elseif key > a(halfIndex)
newHalfArray = a(halfIndex+1:end);
binaryFound = binarySearch(newHalfArray, key);
else
newHalfArray = a(1:halfIndex-1);
binaryFound = binarySearch(newHalfArray, key);
end
result = binaryFound;
这是我的线性搜索:
function linearFound = linearSearch(a, key)
linearFound = false;
for j=1:length(a)
if a(j) == key
linearFound = true;
end
end
在这两种情况下,“a”是一个排序整数数组,“key”是我要查找的值。
在使用一系列数组大小和运行时平均值运行多个测试之后,我始终发现线性搜索比二进制搜索更快。我从理论上知道二进制搜索应该更快。我做错了什么?一些问题:
1) 在二进制搜索中使用递归,因此有更多的函数调用
2) 每次调用binarySearch
Matlab足够聪明,不会一次又一次地创建相同的矩阵,但它有一些成本 3) 您有一些不必要的代码,如
result=binaryFound
。这甚至不是奈米秒,只是说
这是我刚刚编写的一个示例代码,我使用了几个示例进行了测试,但没有完全测试,这比BinarySearch要快得多
function found = binarySearch(a, key)
found = false;
beg = 1;
fin = length(a);
mid = floor(length(a)/2);
while ~found
if a(mid) == key
found = true;
elseif fin-beg == 1
break
elseif a(mid) < key
beg = mid;
mid = ceil((fin+beg)/2);
elseif a(mid) > key
fin = mid;
mid = floor((fin+beg)/2);
end
end
end
因此,如果您正在搜索列表中的第一个元素,二进制搜索无法与线性搜索竞争。您可以使用
profile
工具检查Matlab在哪里花费时间,看看这是算法问题还是您的实现问题。我猜,在你的例子中,这与内存处理和创建那些“半”数组有关,但profiler可以更好地告诉你“Matlab足够聪明,不会一次又一次地创建相同的矩阵”->我非常确定数据会被一次又一次地复制到那里。MATLAB矩阵从不指向另一个矩阵的部分数据b=a
不复制数据,但b=a(5:10)
甚至a=a(5:10)
复制数据。
function found = binarySearch(a, key)
found = false;
beg = 1;
fin = length(a);
mid = floor(length(a)/2);
while ~found
if a(mid) == key
found = true;
elseif fin-beg == 1
break
elseif a(mid) < key
beg = mid;
mid = ceil((fin+beg)/2);
elseif a(mid) > key
fin = mid;
mid = floor((fin+beg)/2);
end
end
end
Best case Avg case Worst case
LS 1 comparison n/2 comp. n comp
BS 1 comparison O(log_n) O(log_n)