Как восстановить пространство из & ldquo; Grip & rdquo;

Искусство компьютерного программирования Том 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
задан abatishchev 11 December 2014 в 18:34
поделиться

2 ответа

Свойство StatusStrip.Padding заблокировано, оно возвращает неверное значение для Padding.Right, если ручка изменения размера отключена. Вы можете исправить это в своем конструкторе формы, например:

public Form1() {
  InitializeComponent();
  statusStrip1.Padding = new Padding(statusStrip1.Padding.Left,
    statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom);
}

Использование свойства Left для указания Right - это исправление. Не отправляйте эту ошибку в Connect, они ее не исправят.

28
ответ дан 30 November 2019 в 12:43
поделиться

Взгляните на эту запись в блоге на MSDN . Вопрос заключался в изменении размера ручки изменения размера вручную, и я думаю, что использование ToolStrip Renderer, как предлагалось, также могло бы сработать для вас.

Проблема, с которой я столкнулся до сих пор, заключается в том, что он удаляет цвет фона в метке состояния в StatusStrip, так что это еще не решение, но это начало.

    public MyForm()
    {
        InitializeComponent();
        statusStrip1.Renderer = new MyRenderer();
    }

    private class MyRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e)
        {
            // don't draw at all
        }
    }
1
ответ дан 30 November 2019 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: