Как мне сгенерировать массив попарных расстояний в Ruby?

Скажем, у меня есть массив, представляющий набор точек:

x = [2, 5, 8, 33, 58]

Как мне сгенерировать массив всех попарных расстояний?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
677
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

x = [2, 5, 8, 33, 58]
print x.collect {|n| x.collect {|i| (n-i).abs}}.flatten

Я думаю, это сработает.

Если вам действительно нужен массив вместо матрицы, это O (n ^ 2/2) вместо O (n ^ 2).

result=[]
x.each_index{|i| (i+1).upto(x.size-1){|j| result<<(x[i]-x[j]).abs}}

это все еще O (n ^ 2), но с половиной сравнений чисел. О (п!) В любом случае не то, что вы имеете в виду.

David Nehme 25.09.2008 05:52

Ой - если 4! это 4 * 3 * 2 * 1, как называется 4 + 3 + 2 + 1?

AShelly 25.09.2008 10:05

1 + 2 + ... + п = п * (п-1) / 2

grifaton 19.04.2011 01:19

@grifaton, да, а есть ли у него название? Произведение чисел от 1 до N равно N факториалу. Как вы называете сумму чисел от 1 до N?

AShelly 19.04.2011 01:43

Ну n * (n + 1) / 2 - n-е треугольное число, но для этого нет общепринятого имени или символа.

grifaton 19.04.2011 02:45

x.map{|i| x.map{|j| (i-j).abs } }

дает

[[0, 3, 6, 31, 56],
 [3, 0, 3, 28, 53],
 [6, 3, 0, 25, 50],
 [31, 28, 25, 0, 25],
 [56, 53, 50, 25, 0]]

(отформатируйте его вот так, напечатав с 'pp' вместо put)

и

x.map{|i| x.map{|j| (i-j).abs } }.flatten

дает

[0, 3, 6, 31, 56, 3, 0, 3, 28, 53, 6, 3, 0, 25, 50, 31, 28, 25, 0, 25, 56, 53, 50, 25, 0]

если вам действительно нужен массив

Другие вопросы по теме