Algorithm 线性搜索和二进制搜索的区别是什么?
线性搜索和二进制搜索的区别是什么?A一次查找一个列表,一个项目,不跳转。就复杂性而言,这是一个Algorithm 线性搜索和二进制搜索的区别是什么?,algorithm,search,binary-search,linear-search,Algorithm,Search,Binary Search,Linear Search,线性搜索和二进制搜索的区别是什么?A一次查找一个列表,一个项目,不跳转。就复杂性而言,这是一个O(n)搜索-搜索列表所花费的时间以与列表相同的速度增加 是指从排序列表的中间开始,然后查看该值是否大于或小于要查找的值,这决定了该值是在列表的前半部分还是后半部分。跳转到子列表的一半,然后再次比较等等。这几乎就是人类通常在字典中查找单词的方式(尽管我们使用更好的启发式方法,显然-如果你要查找“cat”,你不会从“M”开始)。就复杂性而言,这是一个O(logn)搜索-搜索操作的数量增长比列表慢,因为每次
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)
- 二进制搜索需要随机访问数据;线性搜索只需要顺序访问(这可能非常重要-这意味着线性搜索可以传输任意大小的数据)
一个二进制搜索从排序数组的中间开始,并确定你所寻找的值的哪一边(如果有的话)。然后以相同的方式再次搜索数组的“一半”,每次将结果一分为二。
线性搜索也称为顺序搜索,从一开始就按顺序查看每个元素,以查看所需元素是否存在于数据结构中。当数据量很小时,此搜索速度很快。它很简单,但所需的工作与要搜索的数据量成比例。如果所需元素不存在,则元素数加倍将使搜索时间加倍 对于较大的数组,二进制搜索是有效的。在这里,我们检查中间元素。如果值大于我们要查找的值,则查看前半部分;否则,看看下半场。重复此操作,直到找到所需的项目。必须对表进行排序以进行二进制搜索。它在每次迭代中消除一半的数据。它是对数的如果我们有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;
}
}
}