Бинарный поиск Python 3.5

Я пытаюсь написать бинарный поиск в python 3.5, но он не будет работать, я не уверен, почему.

def binarySearch(alist, value):

    first = 0
    last = len(alist)-1
    midpoint = (last//2)
    while binarySearch:
        if value == alist[midpoint]:
            return True and print ("found")
        else:
            if value < midpoint:
                last = midpoint-1
            else:
                if value > midpoint:
                    first = midpoint+1    
binarySearch([1,2,3,4,5,6,7,8],3)

если я поставлю значение 4, он отобразит найдено, если я поставлю что-нибудь еще, ничего не произойдет, и он зависнет, ничего не делая.

Спасибо за вашу помощь.


person Oscar Dolloway    schedule 22.12.2015    source источник
comment
Вы никогда не переназначаете midpoint в цикле   -  person wim    schedule 22.12.2015
comment
@wim а ладно попробую   -  person Oscar Dolloway    schedule 22.12.2015
comment
Я понимаю, что это, вероятно, для класса, но в целом не пишите свой собственный бинарный поиск. В Python уже есть модуль bisect именно для этой цели.   -  person ShadowRanger    schedule 22.12.2015
comment
да, я понимаю, но это будет на моем экзамене, и они ожидают, что я смогу это написать.   -  person Oscar Dolloway    schedule 25.12.2015


Ответы (4)


Пользователь 1915011 опередил меня в моем ответе. В соответствии с его ответом и комментарием @wim я внес следующие изменения в ваш метод binarySearch.

  1. Изменен цикл для использования переменной found
  2. Добавлено дополнительное присваивание midpoint внутри цикла
  3. Убедитесь, что цикл завершается, добавив first<=last
  4. Возврат, найденный после цикла while, указывает на успех или неудачу.

    def binarySearch(alist, value):
    
        first = 0
        last = len(alist)-1
        found = False
        while first<=last and not found:
            midpoint = (first + last)//2
            if value == alist[midpoint]:        
                found =  True 
            else:
                if value < alist[midpoint]:
                    last = midpoint-1
                else:
                    if value > midpoint:
                        first = midpoint+1  
        return found
    
    if binarySearch([1,2,3,4,5,6,7,8],3):
        print "found"
    
person Alex    schedule 22.12.2015
comment
Спасибо чувак, очень ценю - person Oscar Dolloway; 22.12.2015
comment
@Jaco, поскольку вы назначаете среднюю точку в цикле, нет необходимости делать это заранее - person Copperfield; 22.12.2015
comment
Быстрое замечание: он не распознает последний элемент с last = len(alist)-1, он распознает его как элемент перед последним. Итак, в приведенном примере он будет думать, что 7 - это последний элемент, а не 8? Спасибо. - person Oscar Dolloway; 31.10.2016
comment
binarySearch([1,2,3,4,5,6,7,8],8) вроде работает? В Python индексация начинается с 0, поэтому a[len(a)-1] возвращает 8, если a = [1,2,3,4,5,6,7,8] - person Alex; 31.10.2016

  1. Ваше условие цикла просто неверно while binarySearch?
  2. Вы меняете значение средней точки только один раз, вместо этого вы должны менять его каждую итерацию цикла.
  3. Вы сравниваете значение с индексом (средняя точка) и должны сравниваться со значением списка (alist [средняя точка])
  4. Это неправильно: return True and print ("found") всегда будет возвращаться None.
person Žilvinas Rudžionis    schedule 22.12.2015

Вот подробное объяснение того, как это работает:

    def binarySearch(array, i):

    ## Binary search is the algorithm which is used to search an element in a sorted array

    ## The time complexity of the binary search is O(log n)
    ## Which means that in an array of length(2^(n-1)) elements we need to look at only n elements
    ## That is why we say that binary search algorithm runs in logarithmic time, which is much faster than linear time

    start = 0
    last = len(array)-1
    result = False

    count = 0 ## to debug

    print("\n******************************************************************\n")
    while(start <= last and not result):

        ## Debugger Begin
        mid = 0
        print("Loop number: ", count)
        print("Start element: ", array[start], " Position of Start Element: ", start)
        print("Last element: ", array[last], "  Position of Last Element: ", last)
        ## Debugger End

        mid = (start + last)//2 ## '//' indicates the floor division(ignores the value after the period) 
        if(array[mid] == i):
            print("***Mid***")
            result = True;
        else:
            if(i < array[mid]):
                print("***The value of the item:",i," we are searching for is LESS than the current middle element***")
                last = mid - 1
            else:
                print("***The value of the item:",i," we are searching for is GREATER than the current middle element***")
                start = mid + 1

        ## Debugger
        count = count+1
        print("Mid element: ", array[mid], "   Position of Mid Element: ", mid, "\n")
        ## Debugger

    print("******************************************************************")
    if(result == True):
        print("\nThe element:",i ,"is in the array")
    else:
        print("\nItem is not in the array")

    return result

## Array you want to search
array = [9, 11, 12, 21, 23, 34, 45, 49, 65, 98]

## Item you want to search in the array
i = 21

print("Searching the element: ",i , "\nIn the Array: ", array)
print("Length of the array is: ", len(array))

## Binary Search
binarySearch(array, i)
person rzskhr    schedule 12.05.2017

бинарные конвертеры тоже крутые

num = int(input('please enter your number: '))  
list = []  
for i in (128, 64, 32, 16, 8, 4, 2, 1):  
    if num >= i:  
        list.append(1)  
        num = num-i  
    else:  
        list.append(0)
print(list)
person dkelaty    schedule 12.01.2016