C#의 새로운 기능입니다. 나는 힙 구조를 만들려고했는데이 질문을 생각해 냈습니다 : 어떻게하면 힙 구조에 "비교 클래스"를 전달할 수 있습니까? 제 말은 다음과 같이 힙을 생성하고 싶습니다. Heap<int, cmp<int>> heap = new Heap<int, cmp<int>>();
"cmp"는 우선 순위에 따라 힙을 만드는 비교 클래스입니다 (C++의 priority_queue에 대한 아이디어를 가졌습니다).비교 클래스를 제네릭 형식으로 전달하는 C#.
public class Heap<T, Priority>
where Priority : IPriority<T>, new()
where T : IComparable
{
private List<T> storage = new List<T>();
private Priority HeapPriority = new Priority();
private void UpHeap(int position)
{
for(var i = position; i > 0; i = (i - 1) >> 1)
{
// Check whether storage[i] is more Priority than storage[(i - 1) >> 1]
if (HeapPriority.MorePriority(storage[i], storage[(i - 1) >> 1])
.CompareTo(storage[i]) == 0)
{
storage.Swap(i, (i - 1) >> 1);
}
else break;
}
}
}
여기에 iPriority의 인터페이스입니다 : 나는 최대 분 비교자를 소요 힙 만들기에 (내가 생각하는) 성공이
public interface IPriority<T>
where T : IComparable
{
T MorePriority(T a, T b);
}
와 나는이 같은 힙을 사용 :
public class Min<T> : IPriority<T>
where T : IComparable
{
public Min() { }
public T MorePriority(T a, T b)
{
return a.CompareTo(b) <= 0 ? a : b;
}
}
static public void TestHeap()
{
var heap = new Heap<Pair<long, int>, Min<Pair<long, int>>>();
heap.Add(Pair<long, int>(10, 20));
heap.Add(Pair<long, int>(21, 100));
// ...
}
하지만 원하는 방식으로 항목을 정렬하는 힙을 원하지만, 최대 최소 순서가 아닙니다. 게다가 정적 메서드처럼 "Ipriority.MorePriority"를 정적 메서드로 사용하는 방법이 있습니까? 아무도 내게 어떤 조언을 줄 수 있습니까? 나쁜 영어로 죄송합니다.
명백한 대답은'IComparer'입니다. 너 왜 그렇지? 문제를 해결할 수있는 여러 가지 방법이 있습니다. _something_ 해봐. 그 뒤에 _specific_ 질문이있는 경우 귀하가 가지고있는 특정 문제를 명확하게 보여주는 좋은 [mcve]와 함께 새로운 질문을 게시하십시오. –
감사합니다. 나는 그것을 염두에 두겠다. 이것은 나의 첫 질문이므로 바보 같은 질문을해서 미안하다 –
어리석은 질문은 없다. 여기에있는 문제는 가능한 해결책을 연구하는 데 시간을 할애하지 않았으며 어떤 솔루션을 구현하려고 할 때 어떤 특정 문제가 발생했는지 결코 염두에 두지 않는 것입니다. 당신이 명백한 것을 놓친다면 그것은 괜찮습니다. 실제로 그것은 답입니다. 그러나 분명한 대답을 놓친 사람조차도 아마도 _ 무언가를 시도 할 것입니다. 도움을 주신 덕분에 –