Сообщения

Сообщения за Март, 2013

Тестирование метода поиска факториала числа в Ruby

Порой требуется найти факториал числа в ruby. Встроенного метода нет, поэтому добавим в класс Integer свой. Вот реализации поиска факториала найденные в сети, какой из них лучше?
После проведения теста в ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-darwin12.2.0] оказалось что третий ( обозначен как inject_factorial) в ruby 1.9.2 результат примерно такой же.


require "benchmark"
class Integer
  def factorial_recursive
    self <= 1 ? 1 : self * (self - 1).factorial
  end
  def factorial_iterative
    f = 1; for i in 1..self; f *= i; end; f
  end
  def inject_factorial
    self.downto(1).inject(:*)
  end
  alias :factorial :inject_factorial
end


Benchmark.bm(70) do |x|
  x.report("factorial_recursive:")   { (1..120).each { |i| i.factorial_recursive } }
  x.report("factorial_iterative:") { (1..120).each { |i| i.factorial_iterative }}
  x.report("inject_factorial:")  { (1..120).each { |i| i.inject_factorial }}
end


Третий метод, показал себя быстр…

Решение задачи коммивояжера (TSP Traveling Salesman Problem)

Вполне возможно вам известна задача коммивояжера,
 Подробнее на русском тут  или на английском тут
На данный момент, из известных мне реализаций алгоритмов для решения этой NP трудной задачи, является конкорд, не смотря на то, что последняя модификация от 2003 года, он отлично решает эти задачи, и вероятно по прежнему лучше всех. Задача на нескольких тысячах точек, может решаться часами, именно поэтому требуется быстрое и эффективное решение вроде конкорда.

Возможно, вы захотите установить его под Mac Os, и вероятно не получится с первого раза откомпилировать код, в таком случае по совету Cartera рекомендую скачать небольшой скрипт который автоматически скачает версию конкорда и необходимые библиотеки qsort и откомпилировав установит. Скачать его можно тут http://code.google.com/p/eggbotcode/downloads/detail?name=build-concorde-osx-0_2.sh