Подтвердить что ты не робот

Пиковый алгоритм поиска

Недавно я начал изучать лекции MIT 6.006, и в первой лекции преподаватель представил алгоритм поиска пиков.

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/MIT6_006F11_lec01.pdf

Согласно его определениям:

Учитывая массив [a, b, c, d, e, f, g], где a-g - числа, b - пик тогда и только тогда, когда a <= b и b >= c.

Он дал рекурсивный подход:

if a[n/2] < a[n/2 -1] then look for a peak from a[1] ... a[n/2 -1]
else if a[n/2] < a[n/2+1] then look for a peak from a[n/2+1] ... a[n]
else a[n/2] is a peak

Он сказал, что алгоритм T (n) = T (n/2) + o (1) = o (lgn)

В своем pdf он также дал полный пример: [6,7,4,3,2,1,4,5]

Оба 7 и 5 являются пиками. Но разве вышеприведенный алгоритм не находит только 7 как пик только потому, что средний элемент удовлетворяет первой ветки?

  • Итак, если мы должны были найти все вершины, мы все равно будем проходить через весь массив? Это будет означать худший случай N?

  • Имеет ли смысл его определение, нам просто нужно найти единственный пик?

Я считаю, что эту проблему можно рассматривать как поиск элемента максимума и минимума в книге Riverst Introduction to Algorithm book.

4b9b3361

Ответ 1

Да, этот алгоритм находит только один пик.

Если вы хотите найти все пики, вам нужно проверить все элементы, поэтому это будет O (n).

Примечание: пик не обязательно является глобальным максимумом.

Ответ 2

Я не совсем убежден, что этот алгоритм - лучший способ найти интересный пик. Он имеет тенденцию благоприятствовать сравнению среднего элемента, который может привести к поиску в субоптимальное направление, и в конечном итоге алгоритм всегда будет находить пик на краях, а не посередине. Простой пример

[1,2,3,4,5,6,7,8] = > Пик будет 8

[6,21,7,8,9,10,11,13] = > Пик будет 13, тогда как пик 21 более интересен

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

Ответ 3

Этот алгоритм выглядит очень похоже на алгоритм двоичного поиска. Бинарный поиск работает только на отсортированных массивах, и этот алгоритм поиска пиков выглядит так, как будто он должен работать с другим определением: x[p] является пиком, если для 0 <= i < p x[i] <= x[i + 1] и для p <= i < x.size x[i] >= x[i + 1]. Если мы решим, что определение в вопросе неверно, и это правильно: все в порядке. И похоже, что это неправильно, потому что он дает несколько пиков во втором случае, вы правы.

Ответ 4

Я только начал этот курс вчера, и проблема заключается в следующем:

Проблема: найдите пик, если он существует (существует ли он всегда?)

Итак, что делает алгоритм, просто пытается найти пик, первый из которых доступен, по крайней мере, время.

Вот почему этот алгоритм находит только один пик.