我创建了一个len 100的列表
li2 = list(range(100))
我使用下面的二元搜索功能,带有一个计数器,但需要5次搜索才能找到50.应该在第一次尝试时找到它。 (100/2)= 50 li2 [50] == 50
def binary_search(li,item):
low = 0
high = len(li)-1
trys = 0
while low<=high:
mid = int((low + high)/2)
guess = li[mid]
if guess == item:
return'Found',item, 'in', trys,'searches'
elif guess > item:
trys+=1
high = mid - 1
else:
trys+=1
low = mid + 1
return item,' not found', trys, ' searches attempted'
我运行binary_search(li2,50)
并返回
('Found', 50, 'in', 5, 'searches')
答案 0 :(得分:0)
range(100)
将返回一个包含从0到99的所有元素的列表。您的二进制搜索算法将开始搜索49而不是50。
答案 1 :(得分:0)
为什么在使用bisect
时重新发明轮子,bisect_left
通常具有原生实现,因此速度非常快。
import bisect
def binary_search(li,item):
insertion_index = bisect.bisect_left(li,item)
return insertion_index<len(li) and li[insertion_index]==item
返回列表中当前项的插入位置(当然必须对其进行排序)。如果索引在列表范围之外,则item不在列表中。如果index在列表范围内且item位于此索引处,那么您已找到它:
li2 = list(range(100))
print(binary_search(li2,50))
print(binary_search(li2,-2))
print(binary_search(li2,104))
测试:
True
False
False
结果:
$.each(list, function (key, value) {
var html = $(
'<tr>' +
'<td>' + value.Id + '</td>' +
'<td>' + value.FeeHeadName + '</td>' +
'<td>' + value.SchoolName + '</td>' +
'<td>' + value.ClassName + '</td>' +
'<td>' + value.Amount + '</td>' +
'<td>' + "<input type='text' name='Paid' id='paid'/>" + '</td>' +
'<td>' + "<input type='text' id='Discount' name='Discount' />" + '</td>' +
'<td>' + "<input type='text' id='NetAmount' name='NetAmount' />" + '</td>' +
'<td>' + "<input type='checkbox' class='ckb'/>" + '</td>' +
'</tr>');
$("#view").append(html);
html = '';
});