Нахождение медианы в среднем случае O (n). Эквивалентный нахождению k-th самого большого объекта в списке n вещей, с k=n/2:
интервал kthLargest (список, k, во-первых, в последний раз) {j = раздел (список, во-первых, в последний раз), если (k == j) еще возвращают список [j] если (k Здесь, partition
выборы элемент центра, и в одной передаче через данные, перестраивает список так, чтобы объекты меньше, чем центр были на первом месте, тогда центр, затем объекты, больше, чем центр. "kthLargest" алгоритм очень похож на quicksort, но рекурсивно вызывает только одну сторону списка.
Для меня, это - самый простой рекурсивный алгоритм, который работает быстрее, чем итеративный алгоритм. Это использует 2*n сравнения в среднем, независимо от k. Это намного лучше, чем наивный подход выполнения k проходит через данные, находя минимум каждым разом, и отбрасывая его.
Alejo
Фактически ни Dispose (или я должен сказать ~ Foo), ни Release не будут вызываться из COM-клиента при освобождении последней ссылки. Это просто не реализовано. Вот некоторые идеи, как это можно сделать.
http://blogs.msdn.com/oldnewthing/archive/2007/04/24/2252261.aspx#2269675
Но метод не рекомендуется даже автором.
Если вы также реализуете COM-клиент, лучшим вариантом будет запрос IDisposable и явный вызов Dispose, iid для запроса:
{805D7A98-D4AF-3F0F-967F-E5CF45312D2C}
Другой вариант, который я могу придумать, - это реализовать своего рода "сборщик мусора COM" ". Каждый объект, созданный COM, будет помещен в список (при условии, что объекты вашего типа могут быть созданы только COM - я не могу придумать никакого метода, чтобы отличить от места создания объекта). И тогда вам придется периодически проверять список и для каждого объекта вызывать что-то вроде этого:
IntPtr iUnk = Marshal.GetIUnknownForObject(@object);
int refCount = Marshal.Release(iUnk);
if (refCount == 0)
@object.Dispose();
, но это какая-то безумная идея.