c# - the - what is heap in programming
Clase de pila en.NET (2)
Las colas de prioridad parecen ser un buen ajuste para su problema: la cola de prioridad en .Net
Google para "colas de prioridad de C #" para más implementaciones.
Posible duplicado:
Fibonacci, Binary, o Binomial montón en c #?
¿Hay alguna clase como montón en .NET? Necesito algún tipo de colección de la que pueda recuperar min. elemento. Solo quiero 3 métodos:
- Añadir()
- RemoveMinElement ()
- GetMinElement ()
No puedo usar la lista ordenada porque las claves deben ser únicas y es posible que tenga varios elementos idénticos.
Puede usar SortedList o SortedDictionary (consulte la discusión a continuación) con una clave personalizada. Si usó un tipo con igualdad referencial, pero podría compararse según el valor que le interesa, esto podría funcionar.
Algo como esto:
class HeapKey : IComparable<HeapKey>
{
public HeapKey(Guid id, Int32 value)
{
Id = id;
Value = value;
}
public Guid Id { get; private set; }
public Int32 Value { get; private set; }
public int CompareTo(HeapKey other)
{
if (_enableCompareCount)
{
++_compareCount;
}
if (other == null)
{
throw new ArgumentNullException("other");
}
var result = Value.CompareTo(other.Value);
return result == 0 ? Id.CompareTo(other.Id) : result;
}
}
Este es un ejemplo práctico del uso de un SortedDictionary que tiene características de rendimiento de pila binaria:
using System;
using System.Collections.Generic;
using System.Linq;
namespace SortedDictionaryAsBinaryHeap
{
class Program
{
private static Boolean _enableCompareCount = false;
private static Int32 _compareCount = 0;
static void Main(string[] args)
{
var rnd = new Random();
for (int elementCount = 2; elementCount <= 6; elementCount++)
{
var keyValues = Enumerable.Range(0, (Int32)Math.Pow(10, elementCount))
.Select(i => new HeapKey(Guid.NewGuid(), rnd.Next(0, 10)))
.ToDictionary(k => k);
var heap = new SortedDictionary<HeapKey, HeapKey>(keyValues);
_compareCount = 0;
_enableCompareCount = true;
var min = heap.First().Key;
_enableCompareCount = false;
Console.WriteLine("Element count: {0}; Compare count for getMinElement: {1}",
(Int32)Math.Pow(10, elementCount),
_compareCount);
_compareCount = 0;
_enableCompareCount = true;
heap.Remove(min);
_enableCompareCount = false;
Console.WriteLine("Element count: {0}; Compare count for deleteMinElement: {1}",
(Int32)Math.Pow(10, elementCount),
_compareCount);
}
Console.ReadKey();
}
private class HeapKey : IComparable<HeapKey>
{
public HeapKey(Guid id, Int32 value)
{
Id = id;
Value = value;
}
public Guid Id { get; private set; }
public Int32 Value { get; private set; }
public int CompareTo(HeapKey other)
{
if (_enableCompareCount)
{
++_compareCount;
}
if (other == null)
{
throw new ArgumentNullException("other");
}
var result = Value.CompareTo(other.Value);
return result == 0 ? Id.CompareTo(other.Id) : result;
}
}
}
}
Resultados:
Recuento de elementos: 100; Compare la cuenta para getMinElement: 0
Recuento de elementos: 100; Compare la cuenta para deleteMinElement: 8
Recuento de elementos: 1000; Compare la cuenta para getMinElement: 0
Recuento de elementos: 1000; Compare la cuenta para deleteMinElement: 10
Cantidad de elementos: 10000; Compare la cuenta para getMinElement: 0
Cantidad de elementos: 10000; Compare la cuenta para deleteMinElement: 13
Cantidad de elementos: 100000; Compare la cuenta para getMinElement: 0
Cantidad de elementos: 100000; Compare la cuenta para deleteMinElement: 14
Recuento de elementos: 1000000; Compare la cuenta para getMinElement: 0
Recuento de elementos: 1000000; Compare la cuenta para deleteMinElement: 21