这是我的二进制搜索代码:
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'是一个排序整数的数组和'键'是我正在寻找的价值。 使用一系列数组大小和运行时平均运行多个测试后,我始终认为线性搜索比二进制搜索更快。我从理论上知道二进制搜索应该更快。我做错了什么?
答案 0 :(得分:4)
一些问题:
1)你在二进制搜索中使用递归,所以你有更多的函数调用。
2)每次拨打std::hash<std::string>
binarySearch
Matlab非常聪明,不会一遍又一遍地创建相同的矩阵,但它有一些成本。
3)你有一些不必要的代码,比如newHalfArray = a(1:halfIndex-1); //or
newHalfArray = a(halfIndex+1:end);
。 这甚至不是一个nanosec而只是说
以下是我刚刚编写的示例代码,我使用了一些示例进行了测试但未经过彻底测试,这比您的BinarySearch快得多
result=binaryFound
编辑:我忘记了最重要的事情:
4)您要搜索的密钥是什么?
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
因此,如果您要搜索列表中的第一个元素,二元搜索无法与线性搜索竞争。