创建可合并的优先级队列接口结构

时间:2018-11-17 23:59:07

标签: c# data-structures interface

我有以下界面:

public interface IPriorityQueue<T>
{
    int Size { get; }
    void Insert(T val);
    T Max();
    void DeleteMax();
}

public interface IMergeablePriorityQueue<T> : IPriorityQueue<T>
{
   IPriorityQueue<T> Union(IPriorityQueue<T> Queue);
}

Union是合并两个队列的操作。

现在,在我的实现中,它是左派堆,我想简化Union的复杂性,并且只对引用到堆根的对象进行操作:

public class LeftistHeap<T> : IMergeablePriorityQueue<T>
    where T : IComparable<T>
{
    private Node root = null;

    private LeftistHeap(Node newRoot, int newSize) {...}

    public LeftistHeap<T> Union(LeftistHeap<T> Q)
    {
        return new LeftistHeap<T>(Union(root, Q.root), Size + Q.Size);
    }
    private static Node Union(Node node1, Node node2) {...}
    ...
}

但是此Union未实现接口的Union

我以为我可以将IPriorityQueue的引用转换为LeftistHeap或使Queue参数动态化,但这不是我正在寻找的解决方案。有没有一种整齐的方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

否,您必须完全按照接口中指定的方式实现该方法。

此外,您不能依赖于参数为LeftistHeap,调用方可以传递任何实现IPriorityQueue的对象(当然,如果参数恰好是LeftistHeap,则可以选择更有效的实现)。

答案 1 :(得分:0)

我想我已经找到了解决方法:

public interface IMergeablePriorityQueue<TQ, T> : IPriorityQueue<T>
    where TQ : IMergeablePriorityQueue<TQ, T>
{
    TQ Union(TQ Queue);
}

然后在每个IMergeable...接口的实现中,我都将当前类型放入TQ参数中:

public class LeftistHeap<T> : IMergeablePriorityQueue<LeftistHeap<T>, T>
    where T : IComparable<T>
{
    public LeftistHeap<T> Union(LeftistHeap<T> Q)
    {
        return new LeftistHeap<T>(Union(root, Q.root), Size + Q.Size);
    }
    ...
}

此处描述了类似的问题:How to reference current class type using generics