Но это включает создание нового набора n
раз. Есть ли способ сделать это и
создать новый набор только один раз?
Насколько мне известно, нет. Я бы сказал, что у вас есть отличная реализация, она работает в O (LG N) - и это тоже сжато :) Большинство реализаций кучи в любом случае дают O (LG N) для удаления min, так что у вас есть примерно хорошо, как вы можете это получить.
Возможно, вам удастся получить немного лучшую скорость, развернув сбалансированное дерево и внедрив функцию отбрасывания левой или правой ветви для всех значений, превышающих определенное значение. Я не думаю, что дерево AVL или дерево RB подходят в этом контексте, так как вы не можете реально поддерживать их инварианты, но случайное дерево даст вам желаемые результаты.
Трэп работает потрясающе для этого, потому что он использует рандомизацию, а не древовидные инварианты, чтобы сохранять себя относительно сбалансированным. В отличие от дерева AVL или дерева RB, вы можете разделить трэп на узле, не беспокоясь о его несбалансированности. Вот реализация трэпа, которую я написал несколько месяцев назад:
http://pastebin.com/j0aV3DJQ
Я добавил функцию split
, которая позволит вам взять дерево и вернуть два дерева, содержащие все значения, меньшие чем, и все значения, превышающие данное значение. split
работает в O (LG N), используя один проход через дерево, так что вы можете обрезать все ветви вашего дерева за один выстрел - при условии, что вы знаете, на какое значение делить.
Но если я хочу убрать п максимум
элементы ... я просто выполнить
выше п раз, или там быстрее
способ сделать это?
Используя мой Treap
класс:
open Treap
let nthLargest n t = Seq.nth n (Treap.toSeqBack t)
let removeTopN n t =
let largest = nthLargest n t
let smallerValues, wasFound, largerValues = t.Split(largest)
smallerValues
let e = Treap.empty(fun (x : int) (y : int) -> x.CompareTo(y))
let t = [1 .. 100] |> Seq.fold (fun (acc : Treap<_>) x -> acc.Insert(x)) e
let t' = removeTopN 10 t
removeTopN
выполняется за время O (n + lg m), где n - индекс последовательности дерева, а m - количество элементов в дереве.
Я не даю никаких гарантий относительно точности моего кода, используйте на свой страх и риск;)