Только 10% программистов способны написать двоичный поиск
Я бы сказал что меня зацепило. И стало интересно, а смогу ли я написать его с первого раза.
Результат ~ 45 минут и 2 прогонки.
Видно не могу я без ошибок написать такой простой алгоритм.
Попутно вынесу используемые функции в низ поста.
import random as r
import datetime as dt
def GenereytArray(elementCount, min, max):
{
Процедура для формирования случайного массива
elementCount - количество элементов в массиве
min - минимальное значение элементов
max - максимальное значение элементов
}
array = [] # инициализация пустого массива
for i in range(elementCount): # для всех элементов в диапазоне от 0 до elementCount
r.seed(dt.datetime.now()) # передаём время для основания генератора случайных чисел
el = r.randint(min, max) # получаем случайное число в диапазоне
array.append(el) # добавляем элемент в массив
array.sort() # сортировка массива
return array # возвращаем данные
def DoBinFind(array, findelement):
leng = len(array) # общая длина массива
midl = int(leng//2) # середина
delt = int(leng//2) # дельта (шаг)
last = -1
find = -1
index = -1
# пока не найден элемент или дельта не = 0
while ((findelement != find) and (delt != 0)):
# ищем средний элемент
last = array[midl]
# если элемент найден то выходим
if last == findelement:
index = midl
break
else:
# иначе определяем на какой шаг нужно сдвинуться
delt = delt//2
# если средний элемент больше искомого то сдвигаемся в лево на указанный шаг
# иначе сдвигаемся в право
if last > findelement:
midl = midl - delt
else: midl = midl + delt
# если элементы не найдены осталось проверить 1й и последний элемент
if index == -1:
if array[0] == findelement:
index = 0
if array[leng - 1] == findelement:
index = leng - 1
return index
def main ():
# запрашиваем исходные данные
elements = int(raw_input('elsements count -->'))
minelement = int(raw_input('min element -->'))
maxelement = int(raw_input('max element -->'))
# сообщаем сколько элементов будет в массиве
print 'genereit %s elements' % elements
# получаем массив
arr = GenereytArray(elements, minelement, maxelement)
# показываем его что бы пользователь мог выбрать что ему нужно
print arr
# запрашиваем элемент для поиска
f = int(raw_input('try to find digit of -->'))
# получаем индекс искомого элемента
ind = DoBinFind(arr, f)
# если элемент = -1 то говорим человеческим языком
if ind == -1:
print 'element not found'
else: print 'index of element is %s' % ind
main()
Итак это хороший шанс начать делать желаемое. Т.е систематизировать знания.
В текущем примере я использовал:
- Генератор случайных чисел
- библиотека random
- функция random.randint(min, max)
- Вставка данных в массив
- [].append(element)
- Сортировка массива
- [].sort()
- Динамичный запрос данных
- raw_input('comment tekst')
- Вывод текста на экран
- print 'tekst %s ' % 'test'


Перед реализацией любого алгоритма надо сначала его понять. Я, бывает, на листочке рисую кучу списков и расчетов :)
ОтветитьУдалитьА вообще в двоичном поиске ничего сложного нет.
Для развития вообще хорошо взять какую-нибудь книжку по алгоримам и "пореализовывать" их...
Ну так я и не говорю что там что то сложное. я говорю что с первого раза не получилось :)
ОтветитьУдалить