2013-11-16 2 views
5

Я пытаюсь написать бинарный поиск, который принимает упорядоченный список и находит наибольшее число меньше заданного значения:Как найти максимальное число, меньшее целевого значения в списке?

def binary_max(list, target) 
    hi=len(list)-1 
    lo=0 
    while lo<=hi: 
     mid=(hi+lo)//2 
     midval=list[mid] 
     if midval > target: 
      hi=mid-1 
     elif midval <= target: 
      lo=mid 
     if hi==lo: 
      break 
    return(list[mid]) 
pass 

однако, когда, например, есть список с длиной 2, привет = 1 и среднее значение всегда будет зависеть от lo , так или иначе, чтобы избежать этой проблемы?

благодаря

+0

Это может показаться глупым, но: Можете ли вы обновить свой вопрос, включив в него полную функцию и код, чтобы позвонить? – YXD

+0

seldon 'while' loop является идиоматическим в Python, если он не является бесконечным циклом (' while True') –

+2

@PauloScardine, но если вы посмотрите в 'bisect.py' ... –

ответ

0

Когда вы break из петли, mid все еще содержит значение из предыдущей итерации.

2

Модуль bisect предоставляет функции для выполнения именно этого. Используйте bisect.bisect.

+4

анонимный пользователь ... это, вероятно, домашнее задание. –

+0

@PauloScardine, хм, ты прав. Я пропустил это. – shx2

1

Вот простая функция для этого. Надеюсь, это сработает:

def bin_search(list, target): 
    if target not in list: 
     return None 
    list.sort() 
    return list[list.index(target)-1] 
+0

вы можете упростить его, как этот 'list [list.index (target) -1]' –

+0

@kylek, Ik, но я думал, что пользователь хочет получить подробную функцию ... – JadedTuna

+0

Он делает, я просто говорил, как вы могли бы упростить последние две строки вашего ответа. –

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