Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么二进制搜索比MATLAB中的线性搜索运行得慢?_Matlab_Runtime_Binary Search_Linear Search - Fatal编程技术网

为什么二进制搜索比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)