Я работал над реализацией SkipList в Java для моего класса CS2, и после анализа времени выполнения всех моих методов (для забавы) у меня возникла проблема с определением среднего времени выполнения следующего:
// Returns 1 with 50% probability, 2 with 25% probability,
// 3 with 12.5% probability, and so on, without exceeding maxHeight
private static int generateRandomHeight(int maxHeight)
{
int height = 1;
// At most O(maxHeight) which is O(log(n))
// Best case is O(1) and on average O(log(log(n)))??
while (--maxHeight > 0 && Math.random() < .5)
height++;
return height;
}
Я знаю, что наилучшим временем выполнения является O (1), а худшим - O (h), которое гарантированно будет O (log (n)), поскольку h = ⌈log₂ (n) ⌉ (потолок лог-базы два из n) .
Вопрос в том, каково среднее ожидаемое время выполнения этой функции ?
На первый взгляд, Я предположил, что ожидается O (log (log (n))). Я задал этот вопрос своим TA, и после обсуждения с ними мы полагаемся на среднее время выполнения O (1), так как наиболее вероятно, что мы повторяем только один раз или не делаем вообще (например, 50%).