2015-12-17 6 views
1

Я относительно не знаком с python (3.3), и я просто пытаюсь выполнить двоичный поиск по списку слов и не могу понять, как исправить мои типы операндов, когда дело доходит до циклов через индексы ... Я продолжаю получать TypeError. Cant выяснить каким-либо образом вокруг негоБинарный поиск по строкам

def find(L, target): 
    start = 0 
    end = len(L) - 1 

    while start <= end: 
     middle = (start + end)// 2 
     midpoint = L[middle] 
     if midpoint > target: 
      end = midpoint - 1 
     elif midpoint < target: 
      start = midpoint + 1 
     else: 
      return midpoint 

Я вызываю функцию так:

L = [ "Брайан", "Мег", "Питер", "Джо", "Stewie", «Лоис»]

находка (L, «Джо»)

+5

бинарный поиск работает только отсортированные списки –

+3

' midpoint' - строка. Что должно делать «midpoint-1'? –

+0

@FernandoMatsumoto может быть опечаткой. Я думаю, он имел в виду «средний - 1», «средний + 1». – jianweichuah

ответ

3

Ваша логика кажется нормально, для ввода и ошибка с Увеличение и уменьшение средней точки вместо средней исключением.

def find(L, target): 
    start = 0 
    end = len(L) - 1 

    while start <= end: 
     middle = (start + end)/ 2 
     midpoint = L[middle] 
     if midpoint > target: 
      end = middle - 1 
     elif midpoint < target: 
      start = middle + 1 
     else: 
      return midpoint 

L = ["Brian", "Joe", "Lois", "Meg", "Peter", "Stewie"] # Needs to be sorted. 

print find(L, "Peter") 
+0

Что делать, если вы пытаетесь найти строку, которая не существует? Что возвращается? –

+0

@ cricket_007 Нет. Не уверен, что пример использования OP – jianweichuah

1
def find(L, target): 
    start = 0 
    end = len(L) - 1 
    while start <= end: 
     middle = (start + end)// 2 
     midpoint = L[middle] 
     if midpoint > target: 
      end = middle - 1 
     elif midpoint < target: 
      start = middle + 1 
     else: 
      return midpoint 

    L = ["Brian", "Joe", "Lois", "Meg", "Peter", "Stewie"] 
    L = sorted(L) 
    print(find(L, "Lois")) 

Как указывалось другими, использовать середину вместо средней точки

и оптимально использовать бинарный поиск, сортировки списка первый

+2

'sorted (L)' возвращает новый отсортированный список с элементами 'L'. Либо используйте 'L = sorted (L)' или 'L.sort()'. –

Смежные вопросы