【问题标题】:Why does my binary search run slower than my linear search in MATLAB?为什么我的二进制搜索比我在 MATLAB 中的线性搜索运行得慢?
【发布时间】:2017-07-21 14:36:19
【问题描述】:

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

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”是我要查找的值。 在使用一系列数组大小和平均运行时间运行多个测试后,我始终发现我的线性搜索比我的二进制搜索更快。我从理论上知道二进制搜索应该更快。我做错了什么?

【问题讨论】:

  • 您可以使用profile工具检查Matlab在哪里花费时间,看看是算法问题还是您的实现问题。我想,在你的情况下,它与内存处理和创建那些“半”数组有关,但分析器可以更好地告诉你

标签: matlab runtime binary-search linear-search


【解决方案1】:

一些问题:

1) 你在二分查找中使用递归,所以你有更多的函数调用。

2) 每次调用 binarySearch

时都会创建新矩阵
newHalfArray = a(1:halfIndex-1); //or
newHalfArray = a(halfIndex+1:end);

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

编辑:我忘了说最重要的事情:

4) 您要搜索的密钥是什么?

        Best case       Avg case      Worst case
LS      1 comparison    n/2 comp.     n comp
BS      1 comparison    O(log_n)      O(log_n)

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

【讨论】:

  • “Matlab 足够聪明,不会一遍又一遍地创建相同的矩阵” -> 我很确定数据会一遍又一遍地复制到那里。 MATLAB 矩阵从不指向另一个矩阵的部分数据。 b=a 不会复制数据,但b=a(5:10) 甚至a=a(5:10) 会复制数据。
猜你喜欢
  • 2020-09-17
  • 2018-12-19
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2015-09-26
相关资源
最近更新 更多