Как записать значения, которые Hibernate связывает с подготовленными утверждениями?

Искусство компьютерного программирования Том 4: Fascicle 3 имеет тонну, которая может соответствовать вашей конкретной ситуации лучше, чем я описываю.

Серые коды

Проблема, с которой вы столкнетесь, - это, конечно, память и довольно быстро, у вас будут проблемы с 20 элементами в вашем наборе - 20C3 = 1140. И если вы хотите итерации по набору, лучше использовать модифицированный серый так что вы не держите их все в памяти. Они генерируют следующую комбинацию из предыдущей и избегают повторений. Их много для разных целей. Разве мы хотим максимизировать различия между последовательными комбинациями? минимизировать? и т. д.

Некоторые из оригинальных работ, описывающих серые коды:

  1. Некоторые пути Гамильтона и алгоритм минимального изменения
  2. Алгоритм комбинированной генерации взаимного обмена

Вот некоторые другие статьи, посвященные теме:

  1. Эффективная реализация алгоритм комбинированного генерации взаимозаменяемых алгоритмов Eades, Hickey, Read [] [PDF] с кодом в Паскале
  2. Комбинированные генераторы
  3. Опрос Комбинированные серые коды (PostScript)
  4. Алгоритм для серого кода

Twiddle (алгоритм) Chase

Phillip J Chase, ` Алгоритм 382: Комбинации M из N объектов '(1970)

Алгоритм в C ...

Индекс комбинаций в лексикографическом порядке (алгоритм пряжков 515)

Вы также можете ссылаться на комбинацию по ее индексу (в лексикографическом порядке). Понимая, что индекс должен быть некоторым изменением справа налево на основе индекса, мы можем построить что-то, что должно восстановить комбинацию.

Итак, у нас есть набор {1,2,3,4, 5,6} ... и мы хотим три элемента. Предположим, что {1,2,3} можно сказать, что различие между элементами является одним и по порядку и минимальным. {1,2,4} имеет одно изменение и лексикографически число 2. Таким образом, число «изменений» в последнем месте учитывает одно изменение в лексикографическом порядке. Второе место с одним изменением {1,3,4} имеет одно изменение, но учитывает большее изменение, поскольку оно находится на втором месте (пропорционально количеству элементов в исходном наборе).

метод, который я описал, является деконструкцией, как кажется, от набора к индексу, нам нужно сделать обратное - что намного сложнее. Вот как решает проблема Пряжки . Я написал некоторые C, чтобы вычислить их , с незначительными изменениями. Я использовал индекс наборов, а не диапазон чисел для представления набора, поэтому мы всегда работаем от 0 ... n. Примечание:

  1. Поскольку комбинации неупорядочены, {1,3,2} = {1,2,3} - мы должны быть лексикографическими.
  2. Этот метод имеет неявное 0, чтобы начать набор для первой разницы.

Индекс комбинаций в лексикографическом порядке (McCaffrey)

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

Набор , который максимизирует , где .

Пример: 27 = C(6,4) + C(5,3) + C(2,2) + C(1,1). Итак, 27-е лексикографическое сочетание четырех вещей: {1,2,5,6}, это индексы того, что вы хотите посмотреть. Пример ниже (OCaml) требует функции choose, слева от читателя:

(* this will find the [x] combination of a [set] list when taking [k] elements *)
let combination_maccaffery set k x =
    (* maximize function -- maximize a that is aCb              *)
    (* return largest c where c < i and choose(c,i) <= z        *)
    let rec maximize a b x =
        if (choose a b ) <= x then a else maximize (a-1) b x
    in
    let rec iterate n x i = match i with
        | 0 -> []
        | i ->
            let max = maximize n i x in
            max :: iterate n (x - (choose max i)) (i-1)
    in
    if x < 0 then failwith "errors" else
    let idxs =  iterate (List.length set) x k in
    List.map (List.nth set) (List.sort (-) idxs)

16
задан Juha Syrjälä 10 September 2010 в 07:47
поделиться