Practicing Our Craft

Sep 08, 2021 14:46

Find two bugs in the following binary search implementation:
func search(arr []int, target int) int {
l := 0
r := len(arr) - 1
for l < r {
m := (l + r) / 2
if target < arr[m] {
r = m - 1
} else {
l = m
}
}
if arr[l] == target { //assume len(arr) != 0
return l
}
return -1
}None of this is Golang specific. If you know Java, C or ( Read more... )

coding interview, algorithm

Leave a comment

birdwatcher September 8 2021, 22:51:26 UTC
Баг только один: вместо использования поиска из стандартной библиотеки слеплено нечто любительское на коленке.

Reply

aklepatc September 8 2021, 23:16:25 UTC
Это тоже по-своему верно.

Мне, однако кажется, что реалистичные ситуации, где нужен самопальный метод половинного деления таки случаются в жизни. Правда, это, скорее всего, будет не в Го.

Reply

nponeccop September 9 2021, 19:45:28 UTC
> реалистичные ситуации, где нужен самопальный метод половинного деления
> таки случаются в жизни

А давайте мы их придумаем.

Как насчёт Range Minimal Query, Segment Trees и Fenwick Trees? Есть либы?

Reply

aklepatc September 9 2021, 20:05:08 UTC
Спасибо за поддержку!

Но, вообще-то мне в этом месте надо сознаваться в недостатке базового образования (или проще говоря в дремучем невежестве ; ) и лезть в Гугл.

Ну или задавать мета-вопросы типа "откуда вы всё это знаете"?

Попробую про эти вещи хотя бы в первом приближении почитать...

Reply

nponeccop September 9 2021, 21:30:50 UTC
> Ну или задавать мета-вопросы типа "откуда вы всё это знаете"?

Мета-ответом будет "чем больше вы знаете - тем больше мест куда применить бинарный поиск (или алгебру)".

> Попробую про эти вещи хотя бы в первом приближении почитать...

Да чего там читать. Общая идея RMQ в том, чтобы "быстро" считать минимальное значение в любом куске массива. Для чего мы создаём отдельный массив в котором храним минимальное значение в каждой четвертинке массива.

Ну и если наш интервал больше четвертинки - то на большом куске нашего интервала мы уже знаем предвычисленный минимум и там поэлементно пробегать не надо.

Ну а в общем случае мы сохраняем минимум в половинках, минимум в четвертинках, в восьмушках и так далее, ну и получается минимум за log N шагов при дополнительных затратах памяти в N log N. Ну и там есть разные варианты этой идеи.

Reply

aklepatc September 9 2021, 22:55:57 UTC
Большое спасибо! Классное объяснение.

Reply


Leave a comment

Up