二进制搜索计数器

时间:2017-01-01 20:15:42

标签: python search binary counter

我创建了一个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')

2 个答案:

答案 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 = '';
                    });