Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 线性搜索和二进制搜索的区别是什么?_Algorithm_Search_Binary Search_Linear Search - Fatal编程技术网

Algorithm 线性搜索和二进制搜索的区别是什么?

Algorithm 线性搜索和二进制搜索的区别是什么?,algorithm,search,binary-search,linear-search,Algorithm,Search,Binary Search,Linear Search,线性搜索和二进制搜索的区别是什么?A一次查找一个列表,一个项目,不跳转。就复杂性而言,这是一个O(n)搜索-搜索列表所花费的时间以与列表相同的速度增加 是指从排序列表的中间开始,然后查看该值是否大于或小于要查找的值,这决定了该值是在列表的前半部分还是后半部分。跳转到子列表的一半,然后再次比较等等。这几乎就是人类通常在字典中查找单词的方式(尽管我们使用更好的启发式方法,显然-如果你要查找“cat”,你不会从“M”开始)。就复杂性而言,这是一个O(logn)搜索-搜索操作的数量增长比列表慢,因为每次

线性搜索和二进制搜索的区别是什么?

A一次查找一个列表,一个项目,不跳转。就复杂性而言,这是一个
O(n)
搜索-搜索列表所花费的时间以与列表相同的速度增加

是指从排序列表的中间开始,然后查看该值是否大于或小于要查找的值,这决定了该值是在列表的前半部分还是后半部分。跳转到子列表的一半,然后再次比较等等。这几乎就是人类通常在字典中查找单词的方式(尽管我们使用更好的启发式方法,显然-如果你要查找“cat”,你不会从“M”开始)。就复杂性而言,这是一个
O(logn)
搜索-搜索操作的数量增长比列表慢,因为每次操作都会将“搜索空间”减半

例如,假设您在A-Z字母列表中查找U(索引0-25;我们在索引20处查找值)

线性搜索将要求:

列表[0]=“U”
?否。
列表[1]=“U”
?否。
列表[2]=“U”
?否。
列表[3]=“U”
?否。
列表[4]=“U”
?否。
列表[5]=“U”
?否。
...
列表[20]=“U”
?对完成了

二进制搜索将询问:

比较
列表[12]
('M')和'U':越小,请进一步查看。(范围=13-25)
比较
列表[19]
('T')和'U':越小,请进一步查看。(范围=20-25)
比较
列表[22]
('W')和'U':越大,越早查看。(范围=20-21)
比较
列表[20]
('U')和'U':找到了!已完成。

比较两者:

  • 二进制搜索要求对输入数据进行排序;线性搜索不会
  • 二进制搜索需要排序比较;线性搜索只需要相等比较
  • 二元搜索的复杂度为O(logn);如前所述,线性搜索的复杂性为O(n)
  • 二进制搜索需要随机访问数据;线性搜索只需要顺序访问(这可能非常重要-这意味着线性搜索可以传输任意大小的数据)

将其视为在电话簿中找到自己的方式的两种不同方式。线性搜索从一开始就开始,阅读每个名字,直到找到你想要的。另一方面,二进制搜索是当你打开书(通常在中间),查看页面顶部的名称,然后确定你要查找的名称是大于还是小于你要查找的名称。如果你要找的名字更大,那么你就继续以这种方式搜索这本书的上半部分

线性搜索从值列表的开始处开始,按1对1的顺序检查您要查找的结果


一个二进制搜索从排序数组的中间开始,并确定你所寻找的值的哪一边(如果有的话)。然后以相同的方式再次搜索数组的“一半”,每次将结果一分为二。

线性搜索也称为顺序搜索,从一开始就按顺序查看每个元素,以查看所需元素是否存在于数据结构中。当数据量很小时,此搜索速度很快。它很简单,但所需的工作与要搜索的数据量成比例。如果所需元素不存在,则元素数加倍将使搜索时间加倍

对于较大的数组,二进制搜索是有效的。在这里,我们检查中间元素。如果值大于我们要查找的值,则查看前半部分;否则,看看下半场。重复此操作,直到找到所需的项目。必须对表进行排序以进行二进制搜索。它在每次迭代中消除一半的数据。它是对数的


如果我们有1000个元素要搜索,二进制搜索大约需要10个步骤,线性搜索需要1000个步骤。

二进制搜索在O(logn)时间内运行,而线性搜索在O(n)时间内运行因此,二元搜索具有更好的性能

请务必仔细考虑,以更快的二元搜索获胜是否值得为保持列表排序而付出代价(以便能够使用二元搜索)。也就是说,如果你有大量的插入/删除操作,并且只是偶尔进行一次搜索,那么二进制搜索可能会比线性搜索慢。

尝试以下方法:随机选择一个名字“Lastname,Firstname”,然后在电话簿中查找

第一次:从书的开头开始,读名字直到你找到它,或者按字母顺序找到它发生的地方,注意它不在那里

第二次:在中途打开书,看一页。问问你自己,这个人应该在左边还是右边。不管是哪一个,取1/2,找到中间的位置。重复此过程,直到找到条目所在的页面,然后对列应用相同的过程,或者像以前一样沿页面上的名称线性搜索

计时两种方法并报告


(也可以考虑,如果所有的方法都是一个名字列表,而不是排序……

< p>一个线性搜索向下看一个列表,一个项目一次,不跳。就复杂性而言,这是一个O(n)搜索——搜索列表所花费的时间以与列表相同的速度增加

二进制搜索是从已排序列表的中间开始,查看该值是否大于或小于要查找的值,这决定了该值是在列表的前半部分还是后半部分。跳转到子列表的一半,然后再次比较等等。这几乎就是人类通常在词汇中查找单词的方式
test_list = [1, 3, 9, 11, 15, 19, 29]
test_val1 = 25
test_val2 = 15

def linear_search(input_array, search_value):
    index = 0
    while (index < len(input_array)) and (input_array[index] < search_value):
        index += 1
    if index >= len(input_array) or input_array[index] != search_value:
        return -1

    return index


print linear_search(test_list, test_val1)
print linear_search(test_list, test_val2)
test_list = [1, 3, 9, 11, 15, 19, 29]
test_val1 = 25
test_val2 = 15

def binary_search(input_array, value):
    low = 0
    high = len(input_array) - 1
    while low <= high:
        mid = (low + high) / 2
        if input_array[mid] == value:
            return mid
        elif input_array[mid] < value:
            low = mid + 1
        else:
            high = mid - 1

    return -1


print binary_search(test_list, test_val1)
print binary_search(test_list, test_val2)
var unsortedhaystack = [];
var haystack = [];
function init() {
  unsortedhaystack = document.getElementById("haystack").value.split(' ');
}
function sortHaystack() {
  var t = timer('sort benchmark');
  haystack = unsortedhaystack.sort();
  t.stop();
}

var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

function lineerSearch() {
  init();
  var t = timer('lineerSearch benchmark');
  var input = this.event.target.value;
  for(var i = 0;i<unsortedhaystack.length - 1;i++) {
    if (unsortedhaystack[i] === input) {
      document.getElementById('result').innerHTML = 'result is... "' + unsortedhaystack[i] + '", on index: ' + i + ' of the unsorted array. Found' + ' within ' + i + ' iterations';
      console.log(document.getElementById('result').innerHTML);
      t.stop(); 
      return unsortedhaystack[i]; 
    }
  }
}

function binarySearch () {
  init();
  sortHaystack();
  var t = timer('binarySearch benchmark');
  var firstIndex = 0;
  var lastIndex = haystack.length-1;
  var input = this.event.target.value;

  //currently point in the half of the array
  var currentIndex = (haystack.length-1)/2 | 0;
  var iterations = 0;

  while (firstIndex <= lastIndex) {
    currentIndex = (firstIndex + lastIndex)/2 | 0;
    iterations++;
    if (haystack[currentIndex]  < input) {
      firstIndex = currentIndex + 1;
      //console.log(currentIndex + " added, fI:"+firstIndex+", lI: "+lastIndex);
    } else if (haystack[currentIndex] > input) {
      lastIndex = currentIndex - 1;
      //console.log(currentIndex + " substracted, fI:"+firstIndex+", lI: "+lastIndex);
    } else {
      document.getElementById('result').innerHTML = 'result is... "' + haystack[currentIndex] + '", on index: ' + currentIndex + ' of the sorted array. Found' + ' within ' + iterations + ' iterations';
      console.log(document.getElementById('result').innerHTML);
      t.stop(); 
      return true;
    }
  }
}