Есть ли имя для этой операции набора/массива?

Учитывая входной массив

[a,b,c,d,e]

и функция "присоединиться" (a,b) => (a+b)

мой код возвращает следующий массив массивов, содержащий все возможные варианты, полученные путем применения функции соединения к различным парам элементов при сохранении порядка:

[
  [a,b,c,d,e],
  [a,b+c,d,e],
  [a,b+c+d,e],
  [a,b,c+d,e],
  [a+b,c,d,e],
  [a+b,c+d,e],
  [a+b+c,d,e],
  [a+b+c+d,e],
  [a,b,c,d+e],
  [a,b+c,d+e],
  [a,b+c+d+e],
  [a,b,c+d+e],
  [a+b,c,d+e],
  [a+b,c+d+e],
  [a+b+c,d+e],
  [a+b+c+d+e],
]

Визуально я пытаюсь сделать следующее:

схема упорядоченных разделов

Код работает, но я понятия не имею, как его назвать, и хотел бы использовать имя, понятное другим разработчикам, знакомым с этой операцией, если такое имя существует. Это не набор мощности, но что-то похожее... есть ли имя у этой конкретной операции набора/массива?

РЕДАКТИРОВАТЬ: ОК. Это не перестановки; все перестановки будут состоять из 5-элементных массивов в разном порядке [[a,b,c,d,e], [e,d,c,b,a], [a,d,b,c,e], ...]

Они не являются разделами, поскольку любое подмножество может содержать только смежные элементы ввода. - другими словами, разделы позволили бы это:

диаграмма, изображающая разделы несмежных элементов

(Вероятно, это происходит из-за того, что в чистой теории множеств нет понятия упорядоченного множества.)

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

Я думаю, что myArray.OrderedPartitions((a,b) => (a+b)), вероятно, является достаточно кратким и пояснительным.


person Dylan Beattie    schedule 16.04.2013    source источник
comment
Почему [a+b+c+d+e] отсутствует?   -  person Landei    schedule 16.04.2013
comment
@Landei моя ошибка :) Отредактировал вопрос, включив недостающую перестановку.   -  person Dylan Beattie    schedule 16.04.2013
comment
Это связано с частичными суммами или суммами сегментов, однако это не точное описание.   -  person Koterpillar    schedule 16.04.2013
comment
Операция создает перестановки. Зачем гнида переставлять?   -  person Jakub Zaverka    schedule 16.04.2013
comment
здесь не по теме, возможно, это должно быть на Programers.stackexchange.com?   -  person Alnitak    schedule 16.04.2013
comment
Они определенно не перестановки любого рода! Перестановки по определению представляют собой переупорядочение одного и того же набора элементов. Однако здесь нет двух списков с одинаковыми элементами.   -  person Elmar Peise    schedule 16.04.2013
comment
Можете ли вы описать, что вы делаете в нескольких словах? Если нет, можете ли вы описать намерение в нескольких словах? Кажется, что он делает что-то вроде GetAllJoins (т. е. получает все наборы, полученные в результате применения соединения к соседним элементам входного набора или любого другого набора, который он содержит)... Я определенно не видел ничего подобного раньше, так что не думаю, что у него есть определенное имя, которое будет таким полезным...   -  person Chris    schedule 16.04.2013
comment
Что-то вроде ограниченного разбиения, за исключением того, что у вас есть только одна группа с кардинальностью › 1 (т. е. я не вижу [ a+b, c+d, e ]).   -  person LSerni    schedule 16.04.2013
comment
@Iserni - упущение с моей стороны.   -  person Dylan Beattie    schedule 16.04.2013
comment
Я бы назвал это целочисленным разделом, зависящим от порядка. Это в основном эквивалентно всем способам записи числа в виде суммы целых чисел: 1+1+1+1+1 1+1+1+2 1+1+2+1 1+1+3 1+2+1+1 1+2+2 ...   -  person mbeckish    schedule 16.04.2013
comment
в какой программе вы рисовали схемы?   -  person SpaceTrucker    schedule 18.04.2013
comment
@SpaceTrucker — диаграммы были нарисованы в Visio (office.microsoft.com/en-gb/visio )   -  person Dylan Beattie    schedule 19.04.2013


Ответы (5)


Как сказал Мбекиш в комментарии, эти наборы (после фиксированного порядка в исходном наборе) изоморфны целочисленным разделам, зависящим от порядка, которые, по-видимому, обычно называются композиции. В каждом наборе ровно 2n-1 композиций. Для каждого 1kn существует ровно (n-1) choose (k-1) композиций из n элементов в k наборов с сохранением порядка набора, с которого вы начали. Чтобы визуализировать это, подумайте об элементах вашего набора, расположенных по порядку, и о пространстве между элементами, которые являются соседями в этом порядке; подумайте о своем примере как A|B|C|D|E. Вы заметите, что существует ровно n-1 возможных границ. Чтобы создать k-композицию, вам нужно всего лишь выбрать k-1 из тех возможных границ, которые могут быть, а могут и не быть такими, какими вы сгенерировали свои наборы. Суммируя все (n-1) choose (k-1) для k от 1 до n, мы получаем 2n-1 как количество возможных композиций.

person G. Bach    schedule 16.04.2013
comment
Хорошее объяснение. Возможно, стоит добавить, что сумма равна 2^(n-1). - person rliu; 16.04.2013
comment
Они действительно выглядели бы композициями. Спасибо :) - person Dylan Beattie; 17.04.2013

После вашего редактирования - это все разделы массива (и их количество равно 2^(n-1), потому что вы можете заменить любой разделитель (двоеточие) на объединение (+)).

Примечание. Это разделы массива, а не заданные разделы.

person MBo    schedule 16.04.2013

[Основное редактирование плаката сделало мой ответ устаревшим, это было об исходном опубликованном вопросе:] В онлайн-энциклопедии целочисленных последовательностей они кратко упоминаются как «интервальные подмножества». (http://oeis.org/A000124) Я бы остановился на этом, он достаточно информативен.

person elias    schedule 16.04.2013
comment
Я бы не сказал, что это описание того, что он делает (в том смысле, что если бы я увидел имя, я бы понятия не имел, что я ожидаю от функции - я могу видеть, как имя подходит после многих, хотя ). - person Chris; 16.04.2013

Это направленное дерево, которое указывает в сторону от корневого узла:

введите здесь описание изображения

Важно отметить, что вы не объявляете порядок своих наборов важным, только этот порядок сохраняется с каждым набором. Код Python для создания ваших «разделов» через «присоединение»:

A = map(list, list('abcde'))

def join(A):
    B = []
    for x1,x2 in zip(A,A[1:]):
        B.append((x1,x2,sorted(list(set(x1+x2)))))
    return B
def label(x):
    return '+'.join(x)

# Draw the graph with networkx
import networkx as nx
G = nx.DiGraph()

while len(A)>1:
    B = join(A)
    for x1,x2,pair in B:
        print label(x1), label(pair)
        G.add_edge(label(x1),label(pair))
        G.add_edge(label(x2),label(pair))
    A = [x[2] for x in B]

nx.write_dot(G,'test.dot')

# Render the graph to an image
import os
os.system('dot -Tpng test.dot > test.png')
person Hooked    schedule 16.04.2013

Как насчет myArray.possibleChainings() или myArray.possibleLinkings()?

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

person Thorsten S.    schedule 16.04.2013