2013-05-04 3 views
1

Я пытаюсь написать рубиновую функцию, чтобы определить среднее ожидаемое время поиска для списка пропусков. У меня нет сильного математического фона, и я считаю, что результаты, которые я получаю от этой функции, неверны.Функция Ruby для вычисления среднего времени поиска для списка пропусков

n = количество элементов в списке

base = знаменатель вероятности продвижения. т.е., если 1 из 4 узлов повышены базовый = 4

def lookup_eficiency(n, base) 
    return (Math.log(n, base)*(base/2.0)) 
end 

Как мне выразить уравнение в Ruby, который будет принимать число элементов в списке пропуска и основание и вернуть среднее время поиска?

+0

И что? Какой у Вас вопрос? – sawa

+0

Извините, я думал, что это подразумевается, но я только что отредактировал вопрос, чтобы сделать его явным. –

+0

Если вы хотите измерить скорость функции, вы можете использовать модуль «Benchmark» http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html. Отвечает ли это часть вашего вопроса? – Rots

ответ

0

Сложность перечня поисковых систем - это O (logbase (n/base)), как насчет этого?

def lookup_efficiency(n, base) 
    Math.log(n/base)/Math.log(base) 
end 

Удостоверьтесь, что ваша база - это поплавок, поэтому вы не получаете целочисленного деления!

+0

Почему бы просто не называть 'base.to_f'? Это будет no-op, если у вас уже есть float. –

+0

Ты на самом деле прав. Я просто подумал не загромождать код более чем базовыми функциями, требуемыми OP, и упомянуть об этом вместо этого. – SudoGuru

+0

Спасибо, но я, когда я тестирую вашу функцию, получаю результаты, которые кажутся неправильными. Например, для списка пропуска с 1000 элементами и вероятности продвижения 1/10 ('n = 1000' и' base = 10') функция возвращает '2.0'. Если 'base = 20', функция возвращает' 1.306 ... '. Я считаю, что это неверно, поскольку в любом списке, где 'n> base', операция поиска, в среднем, требует посещения примерно« базовых/2 »узлов в« нижнем списке ». –