Создать структуру интерфейса очереди слияния с приоритетом - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть следующие интерфейсы:

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 голосов
/ 18 ноября 2018

Я думаю, что нашел решение:

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);
    }
    ...
}

Подобная проблемаописано здесь: Как ссылаться на текущий тип класса с помощью обобщений

0 голосов
/ 18 ноября 2018

Нет, вы должны реализовать метод точно так, как указано в интерфейсе.

Кроме того, вы не можете полагаться на параметр, являющийся LeftistHeap, вызывающая сторона может передать любой объект, реализующий IPriorityQueue (конечно, вы можете выбрать более эффективную реализацию, если параметры окажутся LeftistHeap).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...