为什么我的二进制搜索比MATLAB中的线性搜索运行得慢?

时间:2017-03-02 02:28:50

标签: matlab search binary runtime linear

这是我的二进制搜索代码:

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'是一个排序整数的数组和'键'是我正在寻找的价值。 使用一系列数组大小和运行时平均运行多个测试后,我始终认为线性搜索比二进制搜索更快。我从理论上知道二进制搜索应该更快。我做错了什么?

1 个答案:

答案 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

因此,如果您要搜索列表中的第一个元素,二元搜索无法与线性搜索竞争。