2016-01-23 3 views
1

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

[а, b, c ...]

и мне нужно, чтобы сгенерировать столь же случайный массив массивов, содержащий все элементы основного массива, что-то вроде этого:

Input [1 2 3 4 5 ] => [ [1 2 ] [3 4 ] [ 5 ] ] 

Решение Straitforward заключается в создании всех разделов и случайном выборе одного из них. Это решение гарантирует, что все расщепления будут выбраны с равной вероятностью. Но это слишком медленно для больших чисел. Есть ли другая возможность создать это расщепление?

+0

Вам нужно разделить предметы в начале? если нет, вы можете сделать это, когда это необходимо. он может сохранять как пространство, так и время. предположим, что вам нужно разделить массив с 3-элементными подмассивами, когда вам нужен какой-то случайный элемент внутри, вы можете просто сгенерировать 'x = rand% (n/3)' и получить элементы в 'x * 3',' x * 3 + 1', 'x * 3 + 2'. это просто решение для случая, когда они не нужны все в начале. – meth

ответ

2

Для каждой возможной точки расщепления случайным образом решайте, следует ли ее разбить. Например, в Python:

import random 

def random_split(input_list): 
    result = [[]] 

    # Assume input is nonempty, since it's not clear what the result should 
    # be if the input is empty. 
    result[-1].append(input_list[0]) 

    for item in input_list[1:]: 
     if random.randrange(2): 
      # Split here. 
      result.append([]) 
     result[-1].append(item) 

    return result 
+1

Это относится ко многим расщеплениям (в порядке 'N/2', где' N' - длина списка), т. Е. Он не является однородным в пространстве всех расщеплений. – davidhigh

+0

@davidhigh: Но это именно то, чего вы ожидаете от равномерного распределения. Вы можете легко видеть, что среднее число расщеплений при расщеплении (N-1)/2, так как каждое возможное расщепление соответствует второму расщеплению, где вы разбиваете везде, где первое разделение не происходит, и вы нигде не разбиваете первый разделение сделал. – user2357112

+0

Думая об этом снова, я думаю, что вы правы (и моя интуиция была неправильной). – davidhigh

Смежные вопросы