corefxlab repo์์ ์ต์ ์ ์ ์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/dotnet/corefx/issues/574#issuecomment -307971397์์ ์ ์
์ฐ์ ์์ ๋๊ธฐ์ด์ ์์๋ ๊ณ ์ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธ/์ ๊ฑฐ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ํญ๋ชฉ์ 'ํธ๋ค'์ ๋์ ํด์ผ ํฉ๋๋ค. ๋๋ ์ ๋ฐ์ดํธ/์ ๊ฑฐ ์๋ฏธ ์ฒด๊ณ๊ฐ ์ฒซ ๋ฒ์งธ/์ ์ฒด์ ์ ์ฉ๋์ด์ผ ํ๋๋ฐ, ์ด๋ ์ด์ํฉ๋๋ค.
Queue<T>
( MSDN ๋งํฌ )
```c#
๊ณต๊ฐ ํด๋์ค PriorityQueue
: IE์ซ์ ๊ฐ๋ฅ,
IEnumerable<(TElement ์์, Tpriority ์ฐ์ ์์)>,
IReadOnlyCollection<(TElement ์์, Tpriority ์ฐ์ ์์)>
// ICollection์ ์๋์ ์ผ๋ก ํฌํจ๋์ง ์์
{
๊ณต๊ฐ ์ฐ์ ์์ ํ();
๊ณต๊ฐ PriorityQueue(IComparer
public IComparer<TPriority> Comparer { get; }
public int Count { get; }
public bool IsEmpty { get; }
public bool Contains(TElement element);
// Peek & Dequeue
public (TElement element, TPriority priority) Peek(); // Throws if empty
public (TElement element, TPriority priority) Dequeue(); // Throws if empty
public bool TryPeek(out TElement element, out TPriority priority); // Returns false if empty
public bool TryDequeue(out TElement element, out TPriority priority); // Returns false if empty
// Enqueue & Update
public void Enqueue(TElement element, TPriority priority); // Throws if it is duplicate
public void Update(TElement element, TPriority priority); // Throws if element does not exist
public void EnqueueOrUpdate(TElement element, TPriority priority);
public bool TryEnqueue(TElement element, TPriority priority); // Returns false if it is duplicate (does NOT update it)
public bool TryUpdate(TElement element, TPriority priority); // Returns false if element does not exist (does NOT add it)
public void Remove(TElement element); // Throws if element does not exist
public bool TryRemove(TElement element); // Returns false if element does not exist
public void Clear();
public IEnumerator<(TElement element, TPriority priority)> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
//
// ์
๋ ํฐ ๋ถ๋ถ
//
๊ณต๊ฐ PriorityQueue(Func
๊ณต๊ฐ PriorityQueue(Func
public Func<TElement, TPriority> PrioritySelector { get; }
public void Enqueue(TElement element);
public void Update(TElement element);
}
````
์ด๋ฆฐ ์ง๋ฌธ:
PriorityQueue
๋ Heap
IHeap
๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ๋์
ํ์๊ฒ ์ต๋๊น? (๋์ค์ ๊ธฐ๋ค๋ ค์ผ ํ๋?)IPriorityQueue
์๊ฐ ? (๋์ค์ ๊ธฐ๋ค๋ ค์ผ ํ ๊น์ - IDictionary
์์)(TElement element, TPriority priority)
๋ KeyValuePair<TPriority, TElement>
ํํ ์ฌ์ฉPeek
๋ฐ Dequeue
์๋ ํํ ๋์ out
์ธ์๊ฐ ์์ด์ผ ํฉ๋๊น?Peek
๋ฐ Dequeue
๋์ง๊ธฐ๊ฐ ์ ํ ์ ์ฉํฉ๋๊น?https://github.com/dotnet/corefx/issues/163 ๋ฌธ์ ๋ ํต์ฌ .NET ์ปฌ๋ ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฐ์ ์์ ๋๊ธฐ์ด ์ถ๊ฐ๋ฅผ ์์ฒญํ์ต๋๋ค.
์ด ๊ฒ์๋ฌผ์ ์ค๋ณต๋์ง๋ง corefx API ๊ฒํ ํ๋ก์ธ์ค์ ๋ํ ๊ณต์ ์ ์ถ์ ์ํํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ๋ฌธ์ ๋ด์ฉ์ ์๋ก์ด System.Collections.Generic.PriorityQueue์ ๋ํ _speclet_์
๋๋ค.
์น์ธ๋๋ฉด ํ๋ณด์ ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
.NET BCL(๊ธฐ๋ณธ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ํ์ฌ ์ฃผ๋ฌธํ ์์ฐ์-์๋น์ ์ปฌ๋ ์ ์ ๋ํ ์ง์์ด ๋ถ์กฑํฉ๋๋ค. ๋ง์ ์ํํธ์จ์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํญ๋ชฉ ๋ชฉ๋ก์ ์์ฑํ๊ณ ๋ฐ์ ์์์ ๋ค๋ฅธ ์์๋ก ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ ๋ ฌ๋ ํญ๋ชฉ ์ปฌ๋ ์ ์ ์ง์ํ๋ ๋ค์์คํ์ด์ค์ System.Collections ๊ณ์ธต ๊ตฌ์กฐ์๋ ์ธ ๊ฐ์ง ์ผ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค. System.Collections.Generic.SortedList, System.Collections.Generic.SortedSet ๋ฐ System.Collections.Generic.SortedDictionary.
์ด ์ค SortedSet ๋ฐ SortedDictionary๋ ์ค๋ณต ๊ฐ์ ์์ฑํ๋ ์์ฐ์-์๋น์ ํจํด์ ์ ํฉํ์ง ์์ต๋๋ค. SortedList์ ๋ณต์ก์ฑ์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ ๋ชจ๋์์ ฮ(n) ์ต์ ์ ๊ฒฝ์ฐ์ ๋๋ค.
์์ฐ์-์๋น์ ์ฌ์ฉ ํจํด์ด ์๋ ์ ๋ ฌ๋ ์ปฌ๋ ์ ์ ๋ํ ํจ์ฌ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋๋ค. ์ฉ๋ ํฌ๊ธฐ ์กฐ์ ์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ๊ฒฝ์ฐ ์ฝ์ (์ธํ) ๋ฐ ์ ๊ฑฐ(๋ํ) ์ฑ๋ฅ์ ฮ(log n)๋ก BCL์ ์กด์ฌํ๋ ๊ธฐ์กด ์ต์ ๋ณด๋ค ํจ์ฌ ์ข์ต๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ค์ํ ์์ฉ ํ๋ก๊ทธ๋จ ํด๋์ค์ ๊ฑธ์ณ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค. Priority Queues์ Wikipedia ํ์ด์ง๋ ์ ์ดํด๋ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก ๋ชฉ๋ก์ ์ ๊ณตํฉ๋๋ค. ๊ณ ๋๋ก ์ ๋ฌธํ๋ ๊ตฌํ์๋ ์ฌ์ ํ ์ฌ์ฉ์ ์ง์ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ตฌํ์ด ํ์ํ ์ ์์ง๋ง ํ์ค ๊ตฌํ์ ๊ด๋ฒ์ํ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ค์ค ์์ฐ์์ ์ถ๋ ฅ์ ์์ฝํ๋ ๋ฐ ํนํ ์ ์ฉํ๋ฉฐ, ์ด๋ ๊ณ ๋๋ก ๋ณ๋ ฌํ๋ ์ํํธ์จ์ด์์ ์ค์ํ ํจํด์ ๋๋ค.
C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Java ๋ชจ๋ ๊ธฐ๋ณธ API์ ์ผ๋ถ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
``` C#
๋ค์์คํ์ด์ค System.Collections.Generic
{
///
/// ์ ๋ ฌ๋ ์์๋ก ์ ๊ฑฐ๋๋ ๊ฐ์ฒด ์ปฌ๋ ์
์ ๋ํ๋
๋๋ค.
///
///
[DebuggerDisplay("์นด์ดํธ = {count}")]
[DebuggerTypeProxy(typeof(System_PriorityQueueDebugView<>))]
๊ณต๊ฐ ํด๋์ค PriorityQueue
{
///
/// ์ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
/// ๊ธฐ๋ณธ ๋น๊ต์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
///
๊ณต๊ฐ ์ฐ์ ์์ ํ();
/// <summary>
/// Initializes a new instance of the <see cref="PriorityQueue{T}"/> class
/// that has the specified initial capacity.
/// </summary>
/// <param name="capacity">The initial number of elements that the <see cref="PriorityQueue{T}"/> can contain.</param>
/// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="capacity"/> is less than zero.</exception>
public PriorityQueue(int capacity);
/// <summary>
/// Initializes a new instance of the <see cref="PriorityQueue{T}"/> class
/// that uses a specified comparer.
/// </summary>
/// <param name="comparer">The <see cref="T:System.Collections.Generic.IComparer{T}"/> to use when comparing elements.</param>
/// <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is null.</exception>
public PriorityQueue(IComparer<T> comparer);
/// <summary>
/// Initializes a new instance of the <see cref="PriorityQueue{T}"/> class
/// that contains elements copied from the specified collection and uses a default comparer.
/// </summary>
/// <param name="collection">The collection whose elements are copied to the new <see cref="PriorityQueue{T}"/>.</param>
/// <exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is null.</exception>
public PriorityQueue(IEnumerable<T> collection);
/// <summary>
/// Initializes a new instance of the <see cref="PriorityQueue{T}"/> class
/// that contains elements copied from the specified collection and uses a specified comparer.
/// </summary>
/// <param name="collection">The collection whose elements are copied to the new <see cref="PriorityQueue{T}"/>.</param>
/// <param name="comparer">The <see cref="T:System.Collections.Generic.IComparer{T}"/> to use when comparing elements.</param>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="collection"/> is null. -or-
/// <paramref name="comparer"/> is null.
/// </exception>
public PriorityQueue(IEnumerable<T> collection, IComparer<T> comparer);
/// <summary>
/// Initializes a new instance of the <see cref="PriorityQueue{T}"/> class that is empty,
/// has the specified initial capacity, and uses a specified comparer.
/// </summary>
/// <param name="capacity">The initial number of elements that the <see cref="PriorityQueue{T}"/> can contain.</param>
/// <param name="comparer">The <see cref="T:System.Collections.Generic.IComparer{T}"/> to use when comparing elements.</param>
/// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="capacity"/> is less than zero.</exception>
/// <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is null.</exception>
public PriorityQueue(int capacity, IComparer<T> comparer);
/// <summary>
/// Gets the <see cref="IComparer{T}"/> for the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <value>
/// The <see cref="T:System.Collections.Generic.IComparer{T}"/> that is used when
/// comparing elements in the <see cref="PriorityQueue{T}"/>.
/// </value>
public IComparer<T> Comparer
{
get;
}
/// <summary>
/// Gets the number of elements contained in the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <value>The number of elements contained in the <see cref="PriorityQueue{T}"/>.</value>
public int Count
{
get;
}
/// <summary>
/// Adds an object to the into the <see cref="PriorityQueue{T}"/> by its priority.
/// </summary>
/// <param name="item">
/// The object to add to the <see cref="PriorityQueue{T}"/>.
/// The value can be null for reference types.
/// </param>
public void Enqueue(T item);
/// <summary>
/// Removes and returns the object with the lowest priority in the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <returns>The object with the lowest priority that is removed from the <see cref="PriorityQueue{T}"/>.</returns>
/// <exception cref="InvalidOperationException">The <see cref="PriorityQueue{T}"/> is empty.</exception>
public T Dequeue();
/// <summary>
/// Returns the object with the lowest priority in the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <exception cref="InvalidOperationException">The <see cref="PriorityQueue{T}"/> is empty.</exception>
public T Peek();
/// <summary>
/// Removes all elements from the <see cref="PriorityQueue{T}"/>.
/// </summary>
public void Clear();
/// <summary>
/// Determines whether an element is in the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <param name="item">
/// The object to add to the end of the <see cref="PriorityQueue{T}"/>.
/// The value can be null for reference types.
/// </param>
/// <returns>
/// true if item is found in the <see cref="PriorityQueue{T}"/>; otherwise, false.
/// </returns>
public bool Contains(T item);
/// <summary>
/// Copies the elements of the <see cref="PriorityQueue{T}"/> to an <see cref="T:System.Array"/>,
/// starting at a particular <see cref="T:System.Array"/> index.
/// </summary>
/// <param name="array">
/// The one-dimensional <see cref="T:System.Array">Array</see> that is the
/// destination of the elements copied from the <see cref="PriorityQueue{T}"/>.
/// The <see cref="T:System.Array">Array</see> must have zero-based indexing.
/// </param>
/// <param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
/// <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is null.</exception>
/// <exception cref="T:System.ArgumentOutOfRangeException">
/// <paramref name="arrayIndex"/> is less than zero. -or-
/// <paramref name="arrayIndex"/> is equal to or greater than the length of the <paramref name="array"/>
/// </exception>
/// <exception cref="ArgumentException">
/// The number of elements in the source <see cref="T:System.Collections.ICollection"/> is
/// greater than the available space from <paramref name="index"/> to the end of the destination
/// <paramref name="array"/>.
/// </exception>
public void CopyTo(T[] array, int arrayIndex);
/// <summary>
/// Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an
/// <see cref="T:System.Array"/>, starting at a particular <see cref="T:System.Array"/> index.
/// </summary>
/// <param name="array">
/// The one-dimensional <see cref="T:System.Array">Array</see> that is the
/// destination of the elements copied from the <see cref="PriorityQueue{T}"/>.
/// The <see cref="T:System.Array">Array</see> must have zero-based indexing.
/// </param>
/// <param name="index">The zero-based index in <paramref name="array"/> at which copying begins.</param>
/// <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is null.</exception>
/// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="index"/> is less than zero.</exception>
/// <exception cref="ArgumentException">
/// <paramref name="array"/> is multidimensional. -or-
/// <paramref name="array"/> does not have zero-based indexing. -or-
/// <paramref name="index"/> is equal to or greater than the length of the <paramref name="array"/> -or-
/// The number of elements in the source <see cref="T:System.Collections.ICollection"/> is
/// greater than the available space from <paramref name="index"/> to the end of the destination
/// <paramref name="array"/>. -or-
/// The type of the source <see cref="T:System.Collections.ICollection"/> cannot be cast automatically
/// to the type of the destination <paramref name="array"/>.
/// </exception>
void ICollection.CopyTo(Array array, int index);
/// <summary>
/// Copies the elements stored in the <see cref="PriorityQueue{T}"/> to a new array.
/// </summary>
/// <returns>
/// A new array containing a snapshot of elements copied from the <see cref="PriorityQueue{T}"/>.
/// </returns>
public T[] ToArray();
/// <summary>
/// Returns an enumerator that iterates through the <see cref="PriorityQueue{T}"/>
/// </summary>
/// <returns>An enumerator for the contents of the <see cref="PriorityQueue{T}"/>.</returns>
public Enumerator GetEnumerator();
/// <summary>
/// Returns an enumerator that iterates through the <see cref="PriorityQueue{T}"/>
/// </summary>
/// <returns>An enumerator for the contents of the <see cref="PriorityQueue{T}"/>.</returns>
IEnumerator<T> IEnumerable<T>.GetEnumerator();
/// <summary>
/// Returns an enumerator that iterates through the <see cref="PriorityQueue{T}"/>.
/// </summary>
/// <returns>An <see cref="T:System.Collections.IEnumerator"/> that can be used to iterate through the collection.</returns>
IEnumerator IEnumerable.GetEnumerator();
/// <summary>
/// Sets the capacity to the actual number of elements in the <see cref="PriorityQueue{T}"/>,
/// if that number is less than than a threshold value.
/// </summary>
public void TrimExcess();
/// <summary>
/// Gets a value that indicates whether access to the <see cref="ICollection"/> is
/// synchronized with the SyncRoot.
/// </summary>
/// <value>true if access to the <see cref="T:System.Collections.ICollection"/> is synchronized
/// with the SyncRoot; otherwise, false. For <see cref="PriorityQueue{T}"/>, this property always
/// returns false.</value>
bool ICollection.IsSynchronized
{
get;
}
/// <summary>
/// Gets an object that can be used to synchronize access to the
/// <see cref="T:System.Collections.ICollection"/>.
/// </summary>
/// <value>
/// An object that can be used to synchronize access to the
/// <see cref="T:System.Collections.ICollection"/>.
/// </value>
object ICollection.SyncRoot
{
get;
}
public struct Enumerator : IEnumerator<T>
{
public T Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext();
public void Reset();
public void Dispose();
}
}
}
```
| ์ด์ | ๋ณต์ก์ฑ | ๋ฉ๋ชจ |
| --- | --- | --- |
| ๊ฑด์ค | ฮ(1) | |
| IEnumerable์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ๊ธฐ | ฮ(n) | |
| ๋๊ธฐ์ด์ ๋ฃ๊ธฐ | ฮ(๋ก๊ทธ n) | |
| ๋๊ธฐ์ด์์ ๋นผ๊ธฐ | ฮ(๋ก๊ทธ n) | |
| ์ฟ๋ณด๊ธฐ | ฮ(1) | |
| ์นด์ดํธ | ฮ(1) | |
| ์ง์ฐ๊ธฐ | ฮ(N) | |
| ํฌํจ | ฮ(N) | |
| ๋ณต์ฌ ๋์ | ฮ(N) | Array.Copy ์ฌ์ฉ, ์ค์ ๋ณต์ก์ฑ์ ๋ ๋ฎ์ ์ ์์ |
| ํ ์ด๋ ์ด | ฮ(N) | Array.Copy ์ฌ์ฉ, ์ค์ ๋ณต์ก์ฑ์ ๋ ๋ฎ์ ์ ์์ |
| GetEnumerator | ฮ(1) | |
| Enumerator.MoveNext | ฮ(1) | |
์ปฌ๋ ์
์ด '์์ ์ '์ด์ด์ผ ํฉ๋๊น? ์ฆ, IComparison์ด ๋์ผํ ๋ ํญ๋ชฉ์ด
'IEnumerable์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ'์ ๋ณต์ก์ฑ์ ฮ(n)์ผ๋ก ์์ ํ์ต๋๋ค. @svic๋ ๊ฐ์ฌํฉ๋๋ค.
| ์ด์ | ๋ณต์ก์ฑ |
| --- | --- |
| IEnumerable์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ๊ธฐ | ฮ(๋ก๊ทธ n) |
๋๋ ์ด๊ฒ์ด ฮ(n)์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ์ต์ํ ์ ๋ ฅ์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
+1
Rx์๋ ๊ณ ๋๋ก ํ๋ก๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์น ์ฐ์ ์์ ๋๊ธฐ์ด ํด๋์ค๊ฐ ์์ต๋๋ค.
GetEnumerator๋ฅผ ํธ์ถํ๋ ๋์ ๋ฐ foreach๋ฅผ ์ฌ์ฉํ ๋ ์ถ๊ฐ ํ ํ ๋น์ ํผํ๊ธฐ ์ํด ์ค์ฒฉ๋ ๊ณต๊ฐ ์ด๊ฑฐ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น? ๋๊ธฐ์ด์ ์ด๊ฑฐํ๋ ๊ฒ์ ๋๋ฌธ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ด ๊ฐ์ ์ ์๋์ค์ ๋๋ค.
๊ตฌ์กฐ์ฒด ์ด๊ฑฐ์๋ฅผ ์ฌ์ฉํ๋ Queue<T>
์ ์ผ์นํ๋๋ก ๊ตฌ์กฐ์ฒด ์ด๊ฑฐ์๋ฅผ ์ฌ์ฉํ๋ ์ชฝ์ผ๋ก ๊ธฐ์ธ๊ณ ์ถ์ต๋๋ค. ๋ํ ๊ตฌ์กฐ์ฒด ์ด๊ฑฐ์๊ฐ ์ง๊ธ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ํฅํ์ ์ฌ์ฉํ๋๋ก PriorityQueue<T>
๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ํ ์ผ๊ด ์ฝ์ ์ ์ํ ๋ฐฉ๋ฒ๋ ์์ต๋๊น? ๊ทธ๋ฐ ๋ค์ ๋์์ด๋๋ค๋ฉด ์ฒ์๋ถํฐ ์์ํ์ง ์๊ณ ํญ์ ์ด์ ์ฝ์ ์ง์ ์์ ์ ๋ ฌํ๊ณ ๊ณ์ํ ์ ์์ต๋๊น?:
public void Enqueue(List<T> items) {
items.Sort(_comparer);
... insertions ...
}
๋๋ ์ด๊ธฐ ๊ตฌํ์ ์ฌ๋ณธ์ ์ฌ๊ธฐ์ ๋์ก๋ค. ํ ์คํธ ๋ฒ์๋ ์์ง ์์ ํ์ง ์์ง๋ง ๊ถ๊ธํ ์ฌ๋์ด ์์ผ๋ฉด ์ดํด๋ณด๊ณ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์๋ ค์ฃผ์ธ์. System.Collections ํด๋์ค์ ๊ธฐ์กด ์ฝ๋ฉ ๊ท์น์ ์ต๋ํ ๋ฐ๋ฅด๋ ค๊ณ ํ์ต๋๋ค.
๋ฉ์๋. ์ผ๋ถ ์ด๊ธฐ ํผ๋๋ฐฑ:
Queue<T>.Enumerator
๋ IEnumerator.Reset
๋ช
์์ ์ผ๋ก ๊ตฌํํฉ๋๋ค. PriorityQueue<T>.Enumerator
๋ ๋๊ฐ์ด ํด์ผ ํฉ๋๊น?Queue<T>.Enumerator
๋ _index == -2
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ฑฐ์๊ฐ ์ญ์ ๋์์์ ๋ํ๋
๋๋ค. PriorityQueue<T>.Enumerator
์๋ ๋์ผํ ์ฃผ์์ด ์์ง๋ง ์ถ๊ฐ _disposed
ํ๋๊ฐ ์์ต๋๋ค. ์ถ๊ฐ _disposed
ํ๋๋ฅผ ์ ๊ฑฐํ๊ณ _index == -2
๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ ์๊ฒ ๋ง๋ค๊ณ Queue<T>
์ ์ผ์นํ๋๋ก ์ฒ๋ฆฌ๋์์์ ๋ํ๋
๋๋ค._emptyArray
ํ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋์ Array.Empty<T>()
์ฌ์ฉ์ ๋์ฒดํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.๋ํ...
Dictionary<TKey, TValue>
, HashSet<T>
, SortedList<TKey, TValue>
, SortedDictionary<TKey, TValue>
, SortedSet<T>
๋ฑ)์ null์ ํ์ฉํฉ๋๋ค. ๋น๊ต์๋ฅผ ์ํด ์ ๋ฌ๋๋ฉฐ ์ด ๊ฒฝ์ฐ Comparer<T>.Default
๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.๋ํ...
ToArray
๋ ์ ๋ฐฐ์ด์ ํ ๋นํ๊ธฐ ์ ์ _size == 0
๋ฅผ ํ์ธํ์ฌ ์ต์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ Array.Empty<T>()
๋ฐํํ๋ฉด ๋ฉ๋๋ค.@justinvp ์ข์ ํผ๋๋ฐฑ, ๊ฐ์ฌํฉ๋๋ค!
@์๋นํด
Array.Empty๋ F# ๊ธฐ๋ฅ์ด๋ฏ๋ก ์ฌํ๊ฒ๋ ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
๋ ์ด์: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Array.cs#L1060 -L1069
issue-574 ๋ธ๋์น์ eickle/corefx ๋ก ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค.
Array.Empty ๊ตฌํ
dotnet/corefx#966 ๋ฌธ์ ๊ฐ ์๋ฃ๋๋ฉด ์์ ๋ฉ๋๋ค.
ํผ๋๋ฐฑ์ ์ฐพ๊ณ ์๋ ํ ๊ฐ์ง ํต์ฌ ์์ญ์ ToArray, CopyTo ๋ฐ ์ด๊ฑฐ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํ๋์ด ์์ต๋๋ค. ์ฆ, ๋์ ๋ฐฐ์ด์ด ํ์ด๊ณ ๋น๊ต์์ ์ํด ์ ๋ ฌ๋์ง ์์ต๋๋ค.
์ธ ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค.
1) ๊ทธ๋๋ก ๋๊ณ ๋ฐํ๋ ๋ฐฐ์ด์ด ์ ๋ ฌ๋์ง ์์์์ ๋ฌธ์ํํฉ๋๋ค. (์ ๋ ฌ๋ ๋๊ธฐ์ด์ด ์๋๋ผ ์ฐ์ ์์ ๋๊ธฐ์ด์
๋๋ค)
2) ๋ฐํ๋ ํญ๋ชฉ/๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฉ์๋๋ฅผ ์์ ํฉ๋๋ค. ๋ ์ด์ O(n) ์์
์ด ์๋๋๋ค.
3) ๋ฉ์๋์ ์ด๊ฑฐ ๊ฐ๋ฅํ ์ง์์ ๋ชจ๋ ์ ๊ฑฐํ์ญ์์ค. ์ด๊ฒ์ "์์ํ" ์ต์
์ด์ง๋ง ์ฐ์ ์์ ๋๊ธฐ์ด์ด ๋ ์ด์ ํ์ํ์ง ์์ ๋ ๋๋จธ์ง ๋๊ธฐ์ด ํญ๋ชฉ์ ๋น ๋ฅด๊ฒ ์ก๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํฉ๋๋ค.
ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ์ ๋ ๋ค๋ฅธ ์ฌํญ์ ์ฐ์ ์์๊ฐ ๋์ผํ ๋ ํญ๋ชฉ์ ๋ํด ๋๊ธฐ์ด์ด ์์ ์ ์ด์ด์ผ ํ๋์ง ์ฌ๋ถ์ ๋๋ค(๊ฒฐ๊ณผ ๋น๊ต 0). ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ ํญ๋ชฉ์ด ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ์์๋๋ก ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋๋ค๋ ๋ณด์ฅ์ ์์ง๋ง System.Reactive.Core์์ ์ฌ์ฉ๋๋ ๋ด๋ถ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ตฌํ์ ์ด ์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฝ๊ฐ์ ์ถ๊ฐ ์ค๋ฒํค๋๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด ์ทจํฅ์ ์ด๊ฒ์ํ์ง ์๋ ๊ฒ์ด์ง๋ง ๊ฐ๋ฐ์์ ๊ธฐ๋์น ์ธก๋ฉด์์ ์ด๋ค ์ต์ ์ด ๋ ๋์์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
๋๋ .NET์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ๊ฐํ๋ ๋ฐ ๊ด์ฌ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด PR์ ๋ณด๊ฒ ๋์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ด ์ ์์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋ณด๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. :). ์ฝ๋๋ฅผ ๊ฒํ ํ ํ ๋ค์ ์ฌํญ์ ํ์ธํ์ต๋๋ค.
IComparer
์์๊ฐ Equals
์ ์ผ์นํ์ง ์์ผ๋ฉด ์ด Contains
๊ตฌํ์ ๋์( IComparer
)์ ๋ค์๊ณผ ๊ฐ์ด ์ผ๋ถ ์ฌ์ฉ์์๊ฒ ๋๋ ์ ์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก _์ฐ์ ์์๊ฐ ๊ฐ์ ํญ๋ชฉ์ ํฌํจํฉ๋๋ค_.Dequeue
์์ ๋ฐฐ์ด์ ์ถ์ํ๋ ์ฝ๋๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. 1/4์ด ๊ฐ๋ ์ฐผ์ ๋ ํ ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.Enqueue
๋ฉ์๋๊ฐ null
์ธ์๋ฅผ ์๋ฝํด์ผ ํฉ๋๊น?Clear
์ ๋ณต์ก์ฑ์ System.Array.Clear
์ ๋ณต์ก์ฑ์ด๊ธฐ ๋๋ฌธ์ ฮ(n) ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. https://msdn.microsoft.com/en-us/library/system.array.clear%28v=vs.110%29.aspx
Dequeue
์์ ๋ฐฐ์ด์ ์ถ์ํ๋ ์ฝ๋๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. 1/4์ด ๊ฐ๋ ์ฐผ์ ๋ ํ ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
Queue<T>
๋ฐ Stack<T>
๋ ๋ฐฐ์ด์ ์ถ์ํ์ง ์์ต๋๋ค( ์ฐธ์กฐ ์์ค ๊ธฐ๋ฐ, ์์ง CoreFX์ ์์).
@mbeidler ๋๊ธฐ์ด์์ ์๋ ๋ฐฐ์ด ์ถ์์ ์ผ๋ถ ํํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ง๋ง @svick์ด ์ง์ ํ๋ฏ์ด ์ ์ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฐธ์กฐ ๊ตฌํ์๋ ์กด์ฌํ์ง ์์ต๋๋ค. .NET Core/BCL ํ์์ ์ด๋ฌํ ์คํ์ผ์ ๊ตฌํ์ ์ ํํ ํน๋ณํ ์ด์ ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์
๋ฐ์ดํธ: ๋ชฉ๋ก์ ํ์ธํ์ต๋๋ค.
Enqueue๋ null์ ์ง์ํด์ผ ํ๋ฉฐ ํ์ฉํ๋ ๊ฒ์ผ๋ก ๋ฌธ์ํ๋์ด ์์ต๋๋ค. ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๊น? ๋๋ ์์ง ๊ทธ ์ง์ญ์์ ๋จ์ ํ ์คํธ ์์ญ์ด ์ผ๋ง๋ ๊ฒฌ๊ณ ํ์ง ๊ธฐ์ต๋์ง ์๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ @svick ์ด ๋งํฌํ ์ฐธ์กฐ ์์ค์์ Queue<T>
_ShrinkThreshold
๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉ๋์ง ์์ ๊ฐ์ธ ์์๊ฐ ์์์ ์์์ต๋๋ค. ์๋ง๋ ๊ทธ ๋์์ ์ด์ ๋ฒ์ ์ ์กด์ฌํ์ ๊ฒ์
๋๋ค.
Contains
๊ตฌํ์์ Equals
IComparer
๋์ https://gist.github. com/mbeidler/9e9f566ba7356302c57e
@mbeidler ์ข์ ์ง์ ์
๋๋ค. MSDN์ ๋ฐ๋ฅด๋ฉด IComparer
๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ปฌ๋ ์
ํด๋์ค์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. SortedList์์ ์๋ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ฉด
ํ๋ฆผ์์ด ๊ธฐ์กด ์ปฌ๋ ์ ํด๋์ค์ ๋ฒ๊ทธ์ด๊ธฐ๋ ํฉ๋๋ค. ๋๋จธ์ง ์ปฌ๋ ์ ํด๋์ค๋ฅผ ์ดํด๋ณด๊ณ IComparer๋ฅผ ํ์ฉํ์ง๋ง ๋๋ฑ์ฑ์ ๋ณ๋๋ก ํ ์คํธํ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ๋น์ ๋ง์ด ๋ง์์. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฒฝ์ฐ ํ๋ฑ๊ณผ ์์ ํ ๋ ๋ฆฝ์ ์ธ ์ฌ์ฉ์ ์ง์ ์์ ์ง์ ๋์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๋ด ํฌํฌ ๋ถ๊ธฐ์ ์์ ์ฌํญ๊ณผ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ปค๋ฐํ์ต๋๋ค. Contains์ ์๋ก์ด ๊ตฌํ์ List์ ๋์์ ์ง์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์ค๋ ๋์ค์ ์๊ฐ์ด ๋๋ฉด ๋ค๋ฅธ ๋ด์ฅ ์ปฌ๋ ์ ์ ๋ํ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ ์ถํ ๊ฒ์ ๋๋ค. ํ๊ท ๋์์ผ๋ก ์ธํด ์์ ํ ์๋ ์์ง๋ง ์ต์ํ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
ContainsKey
๊ฐ IComparer<TKey>
๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ํค๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ContainsValue
๊ฐ ์ ํ ๊ฒ์์์ IComparable<TValue>
๋์ Equals
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋
ผ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ์ ์์ฐ์ค๋ฌ์ด ์์๊ฐ equals์ ์ผ์นํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ๊ธฐ ๋๋ฌธ์ ๋ฒ์๊ฐ ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
์ ๋ํ MSDN ์ค๋ช
์์์ด ๋ํ๋ฉ๋๋ค SortedList<TKey, TValue>
์ ๋ํ ์ค๋ช
๋ถ๋ถ ContainsValue
TValue์ ์ ๋ ฌ ์์๊ฐ ํ๋ฑ ๋์ ์ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ํ๋
๋๋ค ์์ต๋๋ค.
@terrajobst ์ง๊ธ๊น์ง์ API ์ ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ด๊ฒ์ด CoreFX์ ์ ํฉํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
:+1:
์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ์ ์์ ๊ณต์์ ์ผ๋ก ๊ฒํ ํ๊ธฐ์ ์ถฉ๋ถํ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก 'API ๊ฒํ ์ค๋น ์๋ฃ'๋ก ๋ ์ด๋ธ์ ์ง์ ํ์ต๋๋ค.
Dequeue
๋ฐ Peek
๋ฉ์๋๊ฐ ๋ฐ์ํ๋ฏ๋ก ํธ์ถ์๋ ๊ฐ ํธ์ถ ์ ์ ์นด์ดํธ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ๋์ (๋๋ ์ถ๊ฐ๋ก) ๋์ ์์ง ํจํด์ ๋ฐ๋ผ TryDequeue
๋ฐ TryPeek
์ ๊ณตํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น? ๊ธฐ์กด์ ์ ๋ค๋ฆญ ์ปฌ๋ ์
์ non-throwing ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ด๋ฌํ ๋ฉ์๋๊ฐ ์๋ ์ ์ปฌ๋ ์
์ ์ถ๊ฐํ๋ ๊ฒ์ ๋น์์ฐ์ ์ผ๋ก ๋ณด์
๋๋ค.
@andrewgmorris ๊ด๋ จ https://github.com/dotnet/corefx/issues/4316 "๋๊ธฐ์ด์ TryDequeue ์ถ๊ฐ"
์ฐ๋ฆฌ๋ ์ด์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ฒํ ๋ฅผ ๋ฐ์๊ณ ํ๋ ์์ํฌ์ ProrityQueue๊ฐ ํ์ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ํ ์ค๊ณ ๋ฐ ๊ตฌํ์ ์ถ์งํ๋ ๋ฐ ๋์์ ์ค ๋๊ตฐ๊ฐ๋ฅผ ๊ตฌํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ํ์ ํ๋ ์ฌ๋์
๊ทธ๋ ๋ค๋ฉด API์๋ ์ด๋ค ์์ ์ด ๋จ์ ์์ต๋๊น?
์ด๊ฒ์ ์์ API ์ ์์์ ๋๋ฝ๋์์ต๋๋ค. PriorityQueue<T>
๋ IReadOnlyCollection<T>
์ ์ผ์นํ๋๋ก Queue<T>
IReadOnlyCollection<T>
๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค( Queue<T>
์ด์ .NET์์ IReadOnlyCollection<T>
๋ฅผ ๊ตฌํํฉ๋๋ค. 4.6).
๋ฐฐ์ด ๊ธฐ๋ฐ ์ฐ์ ์์ ๋๊ธฐ์ด์ด ๊ฐ์ฅ ์ข์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. .NET์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ ๋ง ๋น ๋ฆ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ malloc์ด ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒ์-์์ ๋ธ๋ก ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ด ์ฐ์ ์์ ๋๊ธฐ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://github.com/BrannonKing/Kts.Astar/tree/master/Kts.AStar
@ebickle _speclet_์ ์์
/// Adds an object to the end of the <see cref="PriorityQueue{T}"/>.
...
public void Enqueue(T item);
๋์ /// Inserts object into the <see cref="PriorityQueue{T}"> by its priority.
๋ผ๊ณ ํด์ผ ํ์ง ์๊ฒ ์ต๋๊น?
@SunnyWar Enqueue ๋ฉ์๋์ ๋ํ ๋ฌธ์๋ฅผ ์์ ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์ผ๋ง ์ ์ ์ ๋ ์ด ์์ ์์ ๊ณต์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ Skip List ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด๊ณผ ์ ์ฌํ ๋ณต์ก์ฑ์ ๊ฐ์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์์ต๋๋ค. https://gist.github.com/bbarry/5e0f3cc1ac7f7521fe6ea25947f48ace
https://en.wikipedia.org/wiki/Skip_list
๊ฑด๋๋ฐ๊ธฐ ๋ชฉ๋ก์ ํฌํจ์ด ํ๊ท ์ฌ๋ก O(log(n))
๋ผ๋ ์ ์ ์ ์ธํ๊ณ ๋ ํ๊ท ์ฌ๋ก์์ ์์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ณต์ก์ฑ๊ณผ ์ผ์นํฉ๋๋ค. ๋ํ ์ฒซ ๋ฒ์งธ ๋๋ ๋ง์ง๋ง ์์์ ๋ํ ์ก์ธ์ค๋ ์์ ์๊ฐ ์์
์ด๋ฉฐ ์๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ ๋ชจ๋์ ๋ฐ๋ณต์ PQ์ ์๋ฐฉํฅ ๋ณต์ก๋์ ์ผ์นํฉ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ ๋ง์ด ๋๋ ํํ์ ๋จ์ ์ด ๋ถ๋ช
ํ ์์ผ๋ฉฐ O(n)
์ต์
์ ๊ฒฝ์ฐ ์ฝ์
๋ฐ ์ ๊ฑฐ๋ก ๋์ด๊ฐ๋ฏ๋ก ์ฅ๋จ์ ์ด ์์ต๋๋ค...
์ด๊ฒ์ ์ด๋ฏธ ์ด๋๊ฐ์ ๊ตฌํ๋์ด ์์ต๋๊น? ์ถ์ ์์ ์ผ์ ์ธ์ ์ธ๊ฐ์?
๋ํ ๊ธฐ์กด ํญ๋ชฉ์ ์ฐ์ ์์๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
@Priya91 @ianhays ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ํด ์ค๋น๋ ๊ฒ์ผ๋ก ํ์๋ ์ค๋น๊ฐ ๋์์ต๋๊น?
์ด๊ฒ์ ์์ API ์ ์์์ ๋๋ฝ๋์์ต๋๋ค: PriorityQueue
IReadOnlyCollection์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋๊ธฐ์ด๊ณผ ์ผ์น์ํค๊ธฐ ์ํด (๋๊ธฐ ์ค ์ด์ IReadOnlyCollection์ ๊ตฌํํฉ๋๋ค. .NET 4.6).
๋๋ ์ฌ๊ธฐ์ @justinvp์ ๋์ํฉ๋๋ค.
@Priya91 @ianhays ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ํด ์ค๋น๋ ๊ฒ์ผ๋ก ํ์๋ ์ค๋น๊ฐ ๋์์ต๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ๋งํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ ์ ๋์ ์์ ์์์ต๋๋ค. ์ด๋ํด ๋ด ์๋ค.
@justinvp @ianhays IReadOnlyCollection ์ ๊ตฌํํ๋๋ก ์ฌ์์ ์
๋ฐ์ดํธํ์ต๋๋ค.
ํด๋์ค์ ์ ์ฒด ๊ตฌํ์ด ์์ผ๋ฉฐ ๋ฐฐ์ด ๊ธฐ๋ฐ ๊ตฌํ์ ์ฌ์ฉํ๋ ์ฐ๊ฒฐ๋ PriorityQueueDebugView์ ๋๋ค. ๋จ์ ํ ์คํธ๊ฐ ์์ง 100% ์ ์ฉ๋์ง๋ ์์์ง๋ง ๊ด์ฌ์ด ์๋ค๋ฉด ์ฝ๊ฐ์ ์์ ์ ์ํํ๊ณ ํฌํฌ์์ ๋จผ์ง๋ฅผ ํธ์ด๋ผ ์ ์์ต๋๋ค.
@NKnusperer ๋ ๊ธฐ์กด ํญ๋ชฉ์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ์ ๋ํด ์ข์ ์ง์ ์ ํ์ต๋๋ค. ์ง๊ธ์ ์๋ตํ์ง๋ง ์ฌ์ ๊ฒํ ์ค์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋๋ค.
์ ์ฒด ํ๋ ์์ํฌ์๋ ๊ฐ๋ฅํ ๋์์ด 2๊ฐ์ง ๊ตฌํ๋์ด ์์ต๋๋ค.
https://referencesource.microsoft.com/#q =์ฐ์ ์์ ํ
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ์ stackoverflow http://stackoverflow.com/questions/683041/java-how-do-i-use-a-priorityqueue ์ Java PriorityQueue์ ๋ํ ์ง๋ฌธ์ด
API ๊ฒํ :
CoreFX์์ ์ด ์ ํ์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ CoreFX์์ ์ด ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
API ํํ์ ์ต์ข
๊ฒํ ๋ฅผ ์ํด ์ํ ์ฝ๋ PriorityQueue<Thread>
๋ฐ PriorityQueue<MyClass>
๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
T
๋ก๋ง ์์๋ฉ๋๋ค.๋ ธํธ:
Remove
๋ฐ Add
ํ์ํฉ๋๋ค.์ด๊ฒ์ CoreFX์ ์์ผ๋ฉด ์ ๋ง ์ ์ฉํ ์ ํ์ ๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ์ก๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๊น?
๋๋ ์ฐ์ ์์ ํ๋ฅผ ๋ฐ์ด๋๋ฆฌ ํ์ ๊ณ ์ ์ํค๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์๋๋ค. ์์ธํ ๋ด์ฉ์ AlgoKit ์ํค ํ์ด์ง ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋น ๋ฅธ ์๊ฐ:
์๋
์ ๋ช ๊ฐ์ง ํ ์ ํ์ ๊ตฌํํ์ต๋๋ค. ํนํ, ์ฐ์ ์์ ํ๋ก ์ฌ์ฉํ ์ ์๋ IHeap
์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.
์ ๋ IHeap
์ธํฐํ์ด์ค์ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ๊ตฌํ(์ ์ด๋ ํด๋น ์ด๋ ์ด ๊ธฐ๋ฐ)์ ์๊ฐํ๋ ๋ฐ ์ฐฌ์ฑํฉ๋๋ค. API ๋ฐ ๊ตฌํ์ ์์์ ๋งํฌํ ์ ์ฅ์์ ์์ต๋๋ค.
๋ฐ๋ผ์ _์ฐ์ ์์ ๋๊ธฐ์ด_์ด ์์ต๋๋ค. ํ .
์ด๋ป๊ฒ ์๊ฐํ๋์?
@karelz @safern @danmosemsft
@pgolebiowski ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ฉด์๋ ์ฑ๋ฅ์ด ์ข์ API๋ฅผ ์ค๊ณํ๊ณ ์์์ ์์ง ๋ง์ญ์์ค. PriorityQueue
(์ปดํจํฐ ๊ณผํ ์ฉ์ด๋ก ์ ๋ฆฝ๋)๋ฅผ ์ํ๋ฉด ๋ฌธ์์์ / ์ธํฐ๋ท ๊ฒ์์ ํตํด ์ฐพ์ ์ ์์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌํ์ด ํ(๊ฐ์ธ์ ์ผ๋ก ์ ๊ทธ๋ฐ์ง ๊ถ๊ธํจ)์ด๊ฑฐ๋ ๋ค๋ฅธ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ๊ตฌํ์ด ๋ ๊ฐ๋จํ ๋์๋ณด๋ค ์ธก์ ๊ฐ๋ฅํ๊ฒ ๋ ๋ซ๋ค๋ ๊ฒ์ ์
์ฆํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด(์ฝ๋์ ๋ณต์ก์ฑ๋ ์ด๋ ์ ๋ ์ค์ํ ๋ฉํธ๋ฆญ์
๋๋ค).
๋ฐ๋ผ์ ์ฌ์ ํ ํ ๊ธฐ๋ฐ ๊ตฌํ( IHeap
API ์ ์ธ)์ด ์ผ๋ถ ๊ฐ๋จํ ๋ชฉ๋ก ๊ธฐ๋ฐ ๋๋ ๋ฐฐ์ด ๋ชฉ๋ก ์ฒญํฌ ๊ธฐ๋ฐ ๊ตฌํ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ด์ ๋ฅผ ์ค๋ช
ํ์ญ์์ค(๋ช ๋ฌธ์ฅ/๋จ๋ฝ ์ด์์ ์ผ๋ก๋ ), ๊ตฌํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ๋์๋ฅผ ์ป์ ์ ์์ต๋๋ค(PR ๊ฒํ ์ ๊ฑฐ์ ๋ ์ ์๋ ๋ณต์กํ ๊ตฌํ์ ์๊ฐ ๋ญ๋น๋ฅผ ๋ฐฉ์ง).
๋๋กญ ICollection
, IEnumerable
? ์ผ๋ฐ ๋ฒ์ ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค(์ผ๋ฐ IEnumerable<T>
๋ IEnumerable
).
@pgolebiowski ๊ตฌํ์ด ์ธ๋ถ API๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๋ฐฉ๋ฒ. PriorityQueue
๋ ํ๋/๊ณ์ฝ์ ์ ์ํฉ๋๋ค. ๋ฐ๋ฉด Heap
๋ ํน์ ๊ตฌํ์
๋๋ค.
๊ธฐ๋ณธ ๊ตฌํ์ด ํ(๊ฐ์ธ์ ์ผ๋ก ์ ๊ทธ๋ฐ์ง ๊ถ๊ธํจ)์ด๊ฑฐ๋ ๋ค๋ฅธ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ๊ตฌํ์ด ๋ ๊ฐ๋จํ ๋์๋ณด๋ค ์ธก์ ๊ฐ๋ฅํ๊ฒ ๋ ๋ซ๋ค๋ ๊ฒ์ ์ ์ฆํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด(์ฝ๋์ ๋ณต์ก์ฑ๋ ์ด๋ ์ ๋ ์ค์ํ ๋ฉํธ๋ฆญ์ ๋๋ค).
๋ฐ๋ผ์ ์ฌ์ ํ ํ ๊ธฐ๋ฐ ๊ตฌํ์ด ๋จ์ํ ๋ชฉ๋ก ๊ธฐ๋ฐ ๋๋ ๋ฐฐ์ด ๋ชฉ๋ก ์ฒญํฌ ๊ธฐ๋ฐ ๊ตฌํ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ด์ ๋ฅผ ์ค๋ช ํ์ฌ(์ด์์ ์ผ๋ก๋ ๋ช ๋ฌธ์ฅ/๋จ๋ฝ์ผ๋ก) ๊ตฌํ ๋ฐฉ์ [...]
์ข์์. ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ตฌํํ ์ ์๋ ์ถ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ๋ฌผ๋ก ํ๊ณผ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ตฌํํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ณด๋ค ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก:
๋ด ๋ง์ ๋ท๋ฐ์นจํ๊ธฐ ์ํด ์ด๋ก ์ ์ง์๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์๊ฐ , Cormen:
[...] ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ต๋ ์ฐ์ ์์ ๋๊ธฐ์ด๊ณผ ์ต์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ ๊ฐ์ง ํํ๋ก ์ ๊ณต๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ max-heap์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ max-priority ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ด์ ์ ๋ง์ถ ๊ฒ์ ๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์ด ํ์์ ๋ถ๋ช ํ ๋ช ์ํ์ต๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ์ง๋ฆ๊ธธ์ด์ง๋ง ์์ด๋์ด๋ฅผ ์ป์ต๋๋ค. ์ด์ ๋ ์ค์ํ ๊ฒ์ ๋ค๋ฅธ ์ธ์ด์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ผ์ ์ค์ธ ์์ ์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
PriorityQueue<T>
โ ํ์ผ๋ก ๊ตฌํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด.BinaryHeap
โ API์์ ๋ช
์์ ์ผ๋ก ํ์
๋๋ค. ๋ฌธ์ ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ๊ตฌํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ์ด๋ผ๊ณ ๋งํฉ๋๋ค CFBinaryHeap
โ ๋ค์ ๋งํ์ง๋ง "์ฐ์ ์์ ํ"๋ผ๋ ์ถ์์ ์ฉ์ด์ ์ฌ์ฉ์ ํผํ๋ฉด์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ฌด์์ธ์ง ๋ช
์์ ์ผ๋ก ๋งํฉ๋๋ค. ํด๋์ค๋ฅผ ์ค๋ช
ํ๋ ๋ฌธ์: ์ด์ง ํ์ ์ฐ์ ์์ ํ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ญ๋๋ค.priority_queue
โ ๋ค์ ํ ๋ฒ, ๋ฐฐ์ด์ ๋งจ ์์ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ ์ ๊ตฌํ๋์์ต๋๋ค.heapq
โ ํ์ด API์ ๋ช
์์ ์ผ๋ก ๋
ธ์ถ๋ฉ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ฌธ์์์๋ง ์ธ๊ธ๋ฉ๋๋ค. ์ด ๋ชจ๋์ ์ฐ์ ์์ ๋๊ธฐ์ด ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ํ๋ ํ ๋๊ธฐ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. heap package
โ ํ ์ธํฐํ์ด์ค๋ ์์ต๋๋ค. ๋ช
์์ ์ธ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์ง๋ง ๋ค์ ๋ฌธ์์์๋ง ๊ฐ๋ฅํฉ๋๋ค. ํ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ตฌํํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ Rust/Swift/Python/Go ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ์ ๋ ธ์ถ ํด์ผ ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ฏฟ์ผ๋ฉฐ ๋ฌธ์์์ ์ฐ์ ์์ ํ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ๋ช ํํ๊ฒ ๋ช ์ํฉ๋๋ค. ์ ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋งค์ฐ ๊นจ๋ํ๊ณ ๊ฐ๋จํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ฏฟ์ต๋๋ค.
ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ๋ ธ์ถํ๊ณ ๋ฌธ์์์๋ง ์ฐ์ ์์ ํ ์ฐธ์กฐ๋ฅผ ๋ง๋๋ ์ ๊ทผ ๋ฐฉ์์ ์ข์ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐ๋ฆฌ๋ ์์ ๋ฌธ์ ์ ๋์ํด์ผ ํ์ง๋ง ๋ค๋ฅธ ์ฃผ์ ๋ฅผ ์์ํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ . ์ฌ๊ธฐ์์ ๋ ๊ฐ์ง ์๋ฃจ์ ์ ๋ณผ ์ ์์ต๋๋ค.
ArrayHeap
ํด๋์ค๋ง ์ ๊ณตํฉ๋๋ค. ์ด๋ฆ์ ๋ณด๋ฉด ์ด๋ค ์ข
๋ฅ์ ํ์ ๋ค๋ฃจ๊ณ ์๋์ง ์ฆ์ ์ ์ ์์ต๋๋ค(๋ค์ ๋งํ์ง๋ง ์์ญ ๊ฐ์ง ํ ์ ํ์ด ์์). ๋ฐฐ์ด ๊ธฐ๋ฐ์์ ์ ์ ์์ต๋๋ค. ๋น์ ์ ๋น์ ์ด ์๋ํ๊ณ ์๋ ์ง์น์ ์ฆ์ ์ ์ ์์ต๋๋ค.IHeap
์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ํ๋ ์ด์์ ๊ตฌํ์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ๊ณ ๊ฐ์ ์ธํฐํ์ด์ค์ ์์กดํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ง ๋ช
ํํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. DijkstraAlgorithm
ํด๋์ค๋ฅผ ์์ฑํ๋ค๊ณ ์์ํด๋ณด์ญ์์ค. IHeap
์ธํฐํ์ด์ค(๋งค๊ฐ๋ณ์ํ๋ ์์ฑ์ ํ๋)์ ์์กดํ๊ฑฐ๋ ArrayHeap
(๊ธฐ๋ณธ ์์ฑ์)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. "์ฐ์ ์์ ๋๊ธฐ์ด" ์ฉ์ด ์ฌ์ฉ์ผ๋ก ์ธํด ๋ช
ํํ๊ณ ๋จ์ํ๋ฉฐ ๋ช
์์ ์ด๋ฉฐ ๋ชจํธํจ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ก ์ ์ผ๋ก ๋งค์ฐ ์๋ฏธ๊ฐ ์๋ ๋ฉ์ง ์ธํฐํ์ด์ค.์์ ์ ๊ทผ ๋ฐฉ์์์ ArrayHeap
๋ ๋ฐฐ์ด๋ก ์ ์ฅ๋ ์์์ ํ ์์์ ์์ ํ d-ary ํธ๋ฆฌ๋ฅผ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด BinaryHeap
๋๋ QuaternaryHeap
๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ถ๊ฐ ํ ๋ก ์ ์ํด ์ด ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ธธ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค:
4-ary ํ(quaternary)์ 2-ary ํ(binary)๋ณด๋ค ๋จ์ํ ๋น ๋ฆ
๋๋ค. ์ด ๋ฐฑ์์๋ ๋ง์ ํ
์คํธ๊ฐ ์ํ๋์์ต๋๋ค. implicit_4
๋ฐ implicit_2
(๋๋ก๋ implicit_simple_4
๋ฐ implicit_simple_2
)์ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๋ฐ ๊ด์ฌ์ด ์์ ๊ฒ์
๋๋ค.
์ต์ ์ ๊ตฌํ ์ ํ์ ์ ๋ ฅ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. ์์์ d-ary ํ, ํ์ด๋ง ํ, ํผ๋ณด๋์น ํ, ์ดํญ ํ, ๋ช ์์ d-ary ํ, ์์ ์ ํ, ์ง์ง ํ, ์๋ฐ ํ, ์์ ์ํ๋ ์ฝํ ํ ๋ฐ ์๊ฒฉํ ํผ๋ณด๋์น ํ ์ค์์ ๋ค์ ์ ํ์ด ๋ํ๋ฉ๋๋ค. ๋ค์ํ ์๋๋ฆฌ์ค์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
IHeap
์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ง์ ๊ฒฝ์ฐ ์ด๋ ์ด ๊ธฐ๋ฐ ์๋ฃจ์
๋ณด๋ค ๋น ๋ฅด๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค .๋ ๋ค ํ๋ก๊ทธ๋๋ฐ ๋ ธ๋ ฅ์ด ๋๋ผ์ธ ์ ๋๋ก ๋ฎ์ต๋๋ค. ๋ด ๊ตฌํ์ ์ดํด๋ณด์ญ์์ค.
@karelz @benaadams
์ด๊ฒ์ CoreFX์ ์์ผ๋ฉด ์ ๋ง ์ ์ฉํ ์ ํ์ ๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ์ก๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๊น?
@safern ์ง๊ธ๋ถํฐ ์ด๊ฒ์ ์ก๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
์๊ฒ ์ต๋๋ค. ์ ํค๋ณด๋์ ์์ ์ฌ์ด์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. PriorityQueue
๋ ๋ฌผ๋ก Heap
-- Queue
์ ๋ํด ๋ง์ด ์ ๋๋ ๋ถ๋ถ๋ง ์๊ฐํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด '์ ๋ ฌ'๋๋ค๋ ์ฌ์ค์ ์์์ต๋๋ค. ๋
ผ๋ฆฌ, ์๊ณ ๋ฆฌ์ฆ, ํ๋ง ๊ธฐ๊ณ ๋ฑ์ ์ข์ํ๋ ๋์ ๊ฐ์ ์ฌ๋์๊ฒ๋ ๋งค์ฐ ์ฐฝํผํ ์ฌ๊ณ ํ๋ก์ธ์ค ์ค๋จ์
๋๋ค. ์ฃ์กํฉ๋๋ค. (BTW: Java ๋ฌธ์ ๋งํฌ์์ ๋ช ๋ฌธ์ฅ์ ์ฝ์ ๋ง์ ๋ถ์ผ์น๊ฐ ์ฆ์ ํด๋ฆญ๋์์ต๋๋ค.)
๊ทธ๋ฐ ๊ด์ ์์ ๋ณด๋ฉด Heap
์์ API๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ํ์ง๋ง ํด๋น ํด๋์ค๋ฅผ ์์ง ๊ณต๊ฐํด์๋ ์ ๋ฉ๋๋ค. CoreFX์์ ํ์ํ ๊ฒฝ์ฐ ์์ฒด API ๊ฒํ ์ ์์ฒด ํ ๋ก ์ด ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ตฌํ์ผ๋ก ์ธํ API ํ๋ฉด ํฌ๋ฆฌํ๋ฅผ ์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด ์ณ์ ์ผ์ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋
ผ์๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฐ ๊ด์ ์์ ์ ๋ ์์ง IHeap
๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ค์ ์ข์ ๊ฒฐ์ ์ด ๋ ์ ์์ต๋๋ค.
ํน์ ํ(์: ์์์ ์ธ๊ธํ 4-ary)์ด ์ผ๋ฐ ์์ ์
๋ ฅ์ ๊ฐ์ฅ ์ ํฉํ๋ค๋ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ์ด๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. @safern @ianhays @stephentoub ๊ฐ ์๊ฒฌ์ ํ์ธ/์์ฑํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์.
์ฌ๋ฌ ๊ตฌํ ์ต์
์ด ์๋ ๊ธฐ๋ณธ ํ์ ๋งค๊ฐ๋ณ์ํ๋ IMO๊ฐ CoreFX์ ์ํ์ง ์๋ ๊ฒ์
๋๋ค(์ฌ๊ธฐ์ ๋ด๊ฐ ํ๋ฆด ์๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ด
์๋ค).
์ ์ด์ ๋ IMO์์ ์ฌ๋๋ค(์๊ณ ๋ฆฌ์ฆ์ ๋์์ค์ ๋ํ ๊ฐ๋ ฅํ ๋ฐฐ๊ฒฝ ์ง์์ด ์๋ ํ๊ท ๊ฐ๋ฐ์)์ด ์ ํํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด ์๋ง์ ์ ๋ฌธ ์ปฌ๋ ์
์ ๊ณง ์ถํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ์/์ปค๋ฎค๋ํฐ๊ฐ ์์ ํ ํด๋น ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ฅผ ์ํ ํ๋ฅญํ NuGet ํจํค์ง๊ฐ ๋ ๊ฒ์
๋๋ค. ์์ผ๋ก๋ PowerCollections์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค(์ง๋ 4๊ฐ์ ๋์ GitHub์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฃ์ ์์น์ ์์ ํด์ผ ํ๋์ง ๋๋ ์ปค๋ฎค๋ํฐ๊ฐ ์์ ํ๋๋ก ๊ถ์ฅํด์ผ ํ๋์ง์ ๋ํด ์ ๊ทน์ ์ผ๋ก ๋
ผ์ ์ค์
๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด ๋ค๋ฅธ ์๊ฒฌ์ด ์์ต๋๋ค. , ๋๋ ์ฐ๋ฆฌ๊ฐ 2.0 ์ดํ์ ๊ทธ ์ด๋ช
์ ๋ง๋ฌด๋ฆฌ ์ง์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค)
์์ ํ๊ณ ์ถ์ ๋๋ก ํ ๋น...
@pgolebiowski ๊ณต๋ ์์ ์ ์ด๋๊ฐ ์ ์ก๋์์ต๋๋ค. ping์ ์๋ฝํ๋ฉด ๊ทธ๋ ํ ๋นํ ์ ์์ต๋๋ค(GitHub ์ ํ).
@benaadams ๋๋ ICollection
์ ์งํ ๊ฒ์
๋๋ค(์ฝ๊ฐ์ ์ ํธ๋). CoreFX์ ๋ค๋ฅธ ds์์ ์ผ๊ด์ฑ์ ์ํด. IMO ์ฌ๊ธฐ์ ํ๋์ ์ด์ํ ์ง์น์ ๊ฐ์ง ๊ฐ์น๊ฐ ์์ต๋๋ค ... ์์์ ์ ํญ๋ชฉ(์: PowerCollections๋ฅผ ๋ค๋ฅธ ์ ์ฅ์์๋ ์ถ๊ฐ)์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ด ์๋ ํญ๋ชฉ์ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค... ์๊ฐ?
๋ค, ์ ํค๋ณด๋์ ์์ ์ฌ์ด์ ๋ฌธ์ ์์ต๋๋ค.
ใ ใ ๐ ๊ฑฑ์ ๋ง์ธ์.
ํ ์์ API๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ๊ทธ ํด๋์ค๋ฅผ ๊ณต๊ฐํด์๋ ์๋์ง๋ง [...] ์ฐ๋ฆฌ๋ ๊ตฌํ์ผ๋ก ์ธํ API ํ๋ฉด ํฌ๋ฆฝ์ ์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด ์ณ์ ์ผ์ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ ผ์๊ฐ ํ์ํฉ๋๋ค. [...] ์์ง IHeap์ ๋ง๋ค ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ค์ ์ข์ ๊ฒฐ์ ์ด ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฃน์ ๊ฒฐ์ ์ด PriorityQueue
๋ก ๊ฐ๋ ๊ฒ์ด๋ผ๋ฉด ์ ๋ ๊ทธ๋ฅ ๋์์ธ์ ๋๊ณ ์ด๊ฒ์ ๊ตฌํํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ PriorityQueue
๋ฅผ ์ถ๊ฐํ๋ฉด ๋์ค์ Heap
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด API์์ ์ง์ ๋ถํด์ง ์ ์๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ญ์์ค. ๋ ๋ค ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ผ์ข
์ ์ค๋ณต์ฑ IMO์ผ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๋์์ธ ๋์๊ฐ ๋ ๊ฒ์
๋๋ค. ๋๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ๊ฐํ์ง ์์ ๊ฒ์
๋๋ค. ๋์์ด ๋์ง ์์ต๋๋ค.
๋ํ, ํ ๊ฐ์ง ๋ ์๊ฐํฉ๋๋ค. ์ค์ ๋ก ํ์ด๋ง ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๊ฝค ์์ฃผ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐฐ์ด ๊ธฐ๋ฐ ํ์ ๋ณํฉ์ ๋์ฐํฉ๋๋ค. ์ด ์์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์ ๋๋ค. ๋ณํฉ ํ์ด ๋ง์ผ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐฐ์ด ํ ๋์ ํ์ด๋ง ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ณํฉ ์์ ์ ์ผ์ ํฉ๋๋ค (์๊ฐ). ์ด๊ฒ์ ๋ด๊ฐ ๋ฉ์ง ์ธํฐํ์ด์ค์ ๋ ๊ฐ์ง ๊ตฌํ์ ์ ๊ณตํ๊ณ ์ถ์ ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ ๋๋ค. ํ๋๋ ์ผ๋ฐ ์ ๋ ฅ์ ์ํ ๊ฒ์ด๊ณ ๋ ๋ฒ์งธ๋ ํนํ ํ ๋ณํฉ๊ณผ ๊ด๋ จ๋ ์ผ๋ถ ํน์ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
IHeap
+ ArrayHeap
+ PairingHeap
ํฌํํ์ธ์! ๐ (Rust / Swift / Python / Go์์์ ๊ฐ์ด)
ํ์ด๋ง ํ์ด ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ -- ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ IHeap
+ ArrayHeap
๋ก ๊ฐ์. PriorityQueue
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฏธ๋์ ๊ฐ๋ฅ์ฑ์ ์ ๊ทธ๊ณ API๋ฅผ ๋ ๋ช
ํํ๊ฒ ๋ง๋ ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น?
ํ์ง๋ง ์ ๊ฐ ๋งํ๋ฏ์ด -- ์ฌ๋ฌ๋ถ ๋ชจ๋๊ฐ ์ ์๋ ์๋ฃจ์
์ ๋ํด PriorityQueue
ํด๋์ค์ ํฌํํ๋ค๋ฉด -- ์ข์ต๋๋ค.
๊ณต๋ ์์ ์ ์ด๋๊ฐ ์ ์ก๋์์ต๋๋ค. ping์ ์๋ฝํ๋ฉด ๊ทธ๋ ํ ๋นํ ์ ์์ต๋๋ค(GitHub ์ ํ ์ฌํญ).
@karelz ํ :)
์ง๊ธ PriorityQueue๋ฅผ ์ถ๊ฐํ๋ฉด ๋์ค์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ด API์์ ์ง์ ๋ถํด์ง ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ๊ณ ๋ คํ์ญ์์ค. ๋ ๋ค ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ผ์ข ์ ์ค๋ณต์ฑ IMO์ผ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๋์์ธ ๋์๊ฐ ๋ ๊ฒ์ ๋๋ค. ๋๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค. ๋์์ด ๋์ง ์์ต๋๋ค.
๋์ค์ ์ ์ง์ ๋ถํด์ง๋์ง ์์ธํ ์ค๋ช
ํด์ฃผ์ค ์ ์๋์? ๋น์ ์ ๊ด์ฌ์ฌ๋ ๋ฌด์์
๋๊น?
PriorityQueue
๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ๊ฐ๋
์
๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ์ด๋ฆ์ด ์ง์ ๋ ์ ํ์ด ์์ผ๋ฉด ์ ์ฉํฉ๋๋ค. ๋ง์ฃ ?
Heap
๋ํ ๋
ผ๋ฆฌ ์ฐ์ฐ(์ ์ด๋ ํด๋น ์ด๋ฆ)์ด ๋ค๋ฅผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ผํ๋ค๋ฉด ์ต์
์ ๊ฒฝ์ฐ(์ด์์ ์ด์ง๋ ์์ง๋ง ์ธ์์ ์ข
๋ง์ ์๋)์์ ๋์ผํ ์ฝ๋์ 2๊ฐ์ง ๋ค๋ฅธ ๊ตฌํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋๋ PriorityQueue
๋ถ๋ชจ๋ก Heap
ํด๋์ค๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค. ๋ง์ต๋๊น? (API ๊ฒํ ๊ด์ ์์ ํ์ฉ๋๋ค๊ณ ๊ฐ์ - ์ง๊ธ ๋น์ฅ์ ์ด์ ๋ฅผ ์ ์ ์์ง๋ง API ๊ฒํ ์ ๋ํ ์๋
๊ฐ์ ๊ฒฝํ์ด ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ์ธํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ๊ฒ์
๋๋ค)
ํฌํ ๋ฐ ์ถ๊ฐ ์ค๊ณ ๋
ผ์๊ฐ ์ด๋ป๊ฒ ์งํ๋๋์ง ๋ด
์๋ค ... ์ ๋ IHeap
+ ArrayHeap
์ ๋ํ ์์ด๋์ด๋ก ์ฒ์ฒํ ์๋ฐ์
ํ๊ณ ์์ง๋ง ์์ง ์์ ํ ํ์ ํ์ง ๋ชปํ๊ณ ์์ต๋๋ค ...
์์์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ... ์ผ๋ฐ์ด ์๋ ํญ๋ชฉ์ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค.
ํฉ์์ ๋นจ๊ฐ ๊ฑธ๋ . ICollection
์ญ์ ํ ์ ์๋๋ก ์ถ๊ฐํ ๋ค๋ฅธ ์ปฌ๋ ์
์ด ์๋ ์ฌ๋์ด ์์ต๋๊น?
์ํ/๋ง ๋ฒํผ; ์ผ๋ฐ ๋ฐ ๋์?
@karelz ๋ช
๋ช
๋ฌธ์ ์ ๋ํ ์๋ฃจ์
์ DataFlow๊ฐ ์์ฐ/์๋น์ ํจํด์ ๋ํด ์ํํ๋ ๊ฒ์ฒ๋ผ IPriorityQueue
์ ๊ฐ์ ๊ฒ์ผ ์ ์์ต๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ตฌํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ๊ณผ ์ด์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ตฌํ์ ์ ๊ฒฝ์ ์ฐ๊ฑฐ๋ ๊ตฌํ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค.
๋์ค์ ์ ์ง์ ๋ถํด์ง๋์ง ์์ธํ ์ค๋ช ํด์ฃผ์ค ์ ์๋์? ๋น์ ์ ๊ด์ฌ์ฌ๋ ๋ฌด์์ ๋๊น?
PriorityQueue
๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ๊ฐ๋ ์ ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ์ด๋ฆ์ด ์ง์ ๋ ์ ํ์ด ์์ผ๋ฉด ์ ์ฉํฉ๋๋ค. ๋ง์ฃ ? [...] ๋๋ ์ฒ์ฒํIHeap
+ArrayHeap
์ ๋ํ ์์ด๋์ด๋ฅผ ์ค๋นํ๊ณ ์์ง๋ง ์์ง ์์ ํ ํ์ ํ์ง ๋ชปํ๊ณ ์์ต๋๋ค ...
@karelz ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ถ์ํ( IPriorityQueue
๋๋ IHeap
)๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ ๋ง ์ค์ํฉ๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์ ๋๋ถ์ ๊ฐ๋ฐ์๋ ๋ถ๋ฆฌ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํน์ ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค์ ๋ํด ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ์ ์ฐ์ฑ๊ณผ IoC ์ ์ ์ด ๋ ๋ง์ด ์์ต๋๋ค. ๊ทธ๋ฌํ ์ฝ๋์ ๋ํ ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค(Dependency Injection์ ์ฌ์ฉํ๋ฉด ์์ ์ ์กฐ๋กฑ IPriorityQueue
๋๋ IHeap
์ฃผ์
ํ๊ณ ์ด๋ค ์๊ฐ์ ์ด๋ค ์ธ์๋ก ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค). ์ถ์ํ๊ฐ ์ข์ต๋๋ค.
"์ฐ์ ์์ ํ"๋ผ๋ ์ฉ์ด๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ์ฌ์ค์ ๋๋ค. ๋ฌธ์ ๋ ์ฐ์ ์์ ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ํ์ ์ฌ์ฉํ๋ ๋จ ํ ๊ฐ์ง๋ฟ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ง์ ์ข ๋ฅ์ ํ. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ค์์ ๊ฐ์ง ์ ์์์ต๋๋ค:
class ArrayHeap : IPriorityQueue {}
class PairingHeap : IPriorityQueue {}
class FibonacciHeap : IPriorityQueue {}
class BinomialHeap : IPriorityQueue {}
๋๋
class ArrayHeap : IHeap {}
class PairingHeap : IHeap {}
class FibonacciHeap : IHeap {}
class BinomialHeap : IHeap {}
๋์๊ฒ๋ ๋ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ข์ ๋ณด์ ๋๋ค. ๋๋ ์ด๋ป๊ฒ ์๊ฐํด?
PriorityQueue
์์
์ ๋ํด โ ๋๋ฌด ๋ชจํธํ๊ณ ๊ทธ๋ฐ ์์
์ ๋ํด ์์ ํ ๋ฐ๋ํฉ๋๋ค. ๋ชจํธํ ์ธํฐํ์ด์ค๋ ์ข์ง๋ง ๊ตฌํ์ ์๋๋๋ค. ๋ฐ์ด๋๋ฆฌ ํ์ด๋ผ๋ฉด BinaryHeap
๋ผ๊ณ ๋ถ๋ฅด์ธ์. ๋ค๋ฅธ ๊ฒ์ด๋ผ๋ฉด ๊ทธ์ ๋ฐ๋ผ ์ด๋ฆ์ ์ง์ ํ์ญ์์ค.
๋๋ SortedDictionary
์ ๊ฐ์ ํด๋์ค์ ๋ฌธ์ ๋๋ฌธ์ ํด๋์ค ์ด๋ฆ์ ๋ช
ํํ๊ฒ ์ง์ ํ๋ ๋ฐ ์ฐฌ์ฑํฉ๋๋ค. SortedList
์ฝ์ ๋ฐ ์ฐจ์ด์ ์ ๋ํด ๊ฐ๋ฐ์๋ค ์ฌ์ด์ ๋ง์ ํผ๋์ด ์์ต๋๋ค. ๊ทธ๋ฅ BinarySearchTree
ํ๋ฉด ์ถ์ด ๋ ๋จ์ํด์ง๊ณ ์ฐ๋ฆฌ๋ ์ง์ ๊ฐ์ ๋ ์ผ์ฐ ์์ด๋ค์ ๋ณผ ์ ์์ ๊ฒ์
๋๋ค.
ํ์ ์ด๋ฆ์ ํ์ผ๋ก ์ง์ ํด ๋ณด๊ฒ ์ต๋๋ค.
@benaadams ๊ทธ๋ค ๊ฐ๊ฐ์ ๊ทธ๊ฒ์ CoreFX๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค(์ฆ, CoreFX ์ฝ๋ ์์ฒด์ ๊ฐ์น๊ฐ ์์ด์ผ ํ๊ฑฐ๋, ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค) -- ์ฐ๋ฆฌ๋ ์ต๊ทผ์ ๊ทธ๋ฐ ๊ฒ๋ค์ ๊ฝค ๋ง์ด ๋ ผ์ํ์ต๋๋ค. . ์์ง 100% ํฉ์๋ ์๋์ง๋ง CoreFX์ ์ปฌ๋ ์ ์ ๋ ์ถ๊ฐํ๋ ค๋ ์ฌ๋์ ์์ต๋๋ค.
๊ฐ์ฅ ๊ฐ๋ฅ์ฑ ์๋ ๊ฒฐ๊ณผ(ํธํฅ๋ ์ฃผ์ฅ, ๋ด๊ฐ ์๋ฃจ์
์ ์ข์ํ๊ธฐ ๋๋ฌธ์)๋ ๋ค๋ฅธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ PowerCollections๋ก ํ๋ผ์ด๋ฐํ ๋ค์ ์ปค๋ฎค๋ํฐ์์ ์ฐ๋ฆฌ ํ์ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์ง์นจ/๊ฐ๋
์ผ๋ก ํ์ฅํ๋๋ก ํ๋ ๊ฒ์
๋๋ค.
BTW: @terrajobst ๋ ๊ทธ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฉฐ("์ฐ๋ฆฌ๋ ์ํ๊ณ์์ ๋ ์ข๊ณ ๋ ์ํฅ๋ ฅ ์๋ ์ผ์ ํด์ผ ํฉ๋๋ค") ์ปค๋ฎค๋ํฐ๊ฐ ์ด๋ฅผ ์์ ํ ์ถ์งํ๊ณ (๊ธฐ์กด PowerCollection์ผ๋ก ์์ํ๋ ๊ฒ์ ํฌํจํ์ฌ) ์ฐ๋ฆฌ์ ํ๋๊ฐ ๋์ง ์๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๋ค. repos - ์ผ๋ถ๋ ์ฐ๋ฆฌ ์์์ ๋
ผ์ ๋ฐ ๊ฒฐ์ ์ ๋ด๋ฆฝ๋๋ค.
// ์ฐ๋ฆฌ๊ฐ ๊ฒฐ์ ํ๊ธฐ ์ ์ ์ปค๋ฎค๋ํฐ๊ฐ ์ด ์๋ฃจ์
์ ๋ฐ์ด๋ค ๊ธฐํ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ;-). ๊ทธ๋ฌ๋ฉด ํ ๋ก (๋ฐ ๋ด ์ ํธ๋)์ด ์์๊ฑฐ๋ฉ๋๋ค ;-)
@pgolebiowski ๋น์ ์ Heap
๊ฐ PriorityQueue
๋ณด๋ค ๋ซ๋ค๋ ๊ฒ์ ์์ํ ํ์ ์ํค๊ณ ์์ต๋๋ค -- ์ฐ๋ฆฌ๋ ๊ฐ๋ ฅํ ์ง์นจ๊ณผ ๋ฌธ์๊ฐ ํ์ํ ๊ฒ์
๋๋ค " PriorityQueue
- Heap
์ฌ์ฉ
๊ทธ๋ฌ๋ CoreFX์ 2๊ฐ ์ด์์ ํ ๊ตฌํ์ ํฌํจํ๋ ๊ฒ์ ๋งค์ฐ ์ฃผ์ ํฉ๋๋ค. 98% ์ด์์ '์ผ๋ฐ' C# ๊ฐ๋ฐ์๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ์ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์์ง ์๊ฐ์กฐ์ฐจ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋จ์ง ์ผ์ ์์ํ๋ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํฉ๋๋ค. ๋ชจ๋ SW์ ๋ชจ๋ ๋ถ๋ถ์ด ๊ณ ์ฑ๋ฅ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋ ๊ฒ์ ์๋๋๋ค. ๋ชจ๋ ์ผํ์ฉ ๋๊ตฌ, UI ์ฑ ๋ฑ์ ๋ํด ์๊ฐํด ๋ณด์ญ์์ค. ์ด ds๊ฐ ์ค์ํ ๊ฒฝ๋ก์ ์๋ ๊ณ ์ฑ๋ฅ ํ์ฅ ์์คํ ์ ์ค๊ณํ์ง ์๋ ํ ์ ๊ฒฝ ์ฐ์ง ์์์ผ ํฉ๋๋ค.
๊ฐ์ ๋ฐฉ์์ผ๋ก SortedDictionary
๋๋ ArrayList
๋๋ ๊ธฐํ ds๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์๋ ๊ด์ฌ์ด ์์ต๋๋ค. ๋๋ (๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก) ๋ด ์๋๋ฆฌ์ค์ ๋ํด ์ด๋ฌํ ds์์ ๊ณ ์ฑ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๊ตฌํ์ ํ์ธํ๊ณ ๋ด ์๋๋ฆฌ์ค์ ์ถฉ๋ถํ์ง ๋๋ ํ์ํ์ง ๊ฒฐ์ ํด์ผ ํจ์ ์ดํดํฉ๋๋ค. ๋ด ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์กฐ์ ๋ ์ต์์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด ๋๋ง์ ํน์ ๊ตฌํ์ ๋กค์์ํฉ๋๋ค.
2%๊ฐ ์๋ 98%์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ฌ์ฉ์ฑ์ ์ต์ ํํด์ผ ํฉ๋๋ค. ๋๋ฌด ๋ง์ ์ต์
(๊ตฌํ)์ ์ถ์ํ๊ณ ๋ชจ๋ ์ฌ๋์ด ๊ฒฐ์ ํ๋๋ก ๊ฐ์ํ๋ฉด 98%์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ถํ์ํ ํผ๋์ ์ผ๊ธฐํ ๋ฟ์
๋๋ค. ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค...
IMO .NET ์์ฝ์์คํ
์ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฉํ ๋งค์ฐ ์ ์ ํ ์ฑ๋ฅ ํน์ฑ์ ๊ฐ์ง ๋ง์ API(์ปฌ๋ ์
๋ฟ๋ง ์๋๋ผ)์ ๋จ์ผ ์ ํ์ ์ ๊ณตํ๋ ๋ฐ ํฐ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํ์๋ก ํ๊ณ ๋ ๊น์ด ํ๊ณ ๋ค๊ณ ๋ ๋ง์ด ๋ฐฐ์ฐ๊ณ ์ ํ๋ ์ฌ๋๋ค์ ์ํด ๊ณ ์ฑ๋ฅ ํ์ฅ์ ํ์ฉํ๋ ์ํ๊ณ๋ฅผ ์ ๊ณตํ๊ณ /๊ต์ ์๋ ์ ํ๊ณผ ์ ์ถฉ์์ ๋ง๋ญ๋๋ค.
์ฆ, IHeap
์ธํฐํ์ด์ค(์ IDictionary
๋ฐ IReadOnlyDictionary
)๊ฐ ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ฐ์ฃผ ...
์ฐ๋ฆฌ๋ ์ด๋ฏธ (์ด๋ ์ ๋) @pgolebiowski ๊ฐ ISet<T>
๋ฐ HashSet<T>
๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฅ ๋ฏธ๋ฌ๋ง ํ๋ผ๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ์์ API๋ ์ธํฐํ์ด์ค( IPriorityQueue<T>
)๋ก ๋ณ๊ฒฝ๋ ๋ค์ ์์ฒด ํด๋์ค๋ก ๊ณต๊ฐ์ ์ผ๋ก ๋
ธ์ถ๋๊ฑฐ๋ ๋
ธ์ถ๋์ง ์์ ์ ์๋ ๋ด๋ถ์ ์ผ๋ก ํ์ ์ฌ์ฉํ๋ ๊ตฌํ( HeapPriorityQueue<T>
)์ด ์์ต๋๋ค.
( PriorityQueue<T>
) IList<T>
๋ ๊ตฌํํด์ผ ํฉ๋๊น?
@karelz ICollection
๋ SyncRoot
๋ฐ IsSynchronized
. ์ ๊ธ ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ ํ ๋น์ด ์์์ ์๋ฏธํ๋ ๊ตฌํ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์กฐ๊ธ ๋ฌด์๋ฏธํ ๋ ๋์ง๋๋ค.
@benaadams ์ด๊ฒ์ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด ๊ตฌํ์ 99.99%๊ฐ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ์ด๋ฏ๋ก(์ฌ๊ธฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํ ์์ ์ ๋๋ค) ๋ฐฐ์ด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ๋ ธ์ถํด์ผ ํฉ๋๊น?
4, 8, 10, 13, 30, 45 ์์๊ฐ ์๋ ํ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์์๋ฅผ ๊ณ ๋ คํ๋ฉด ์ธ๋ฑ์ค 0, 1, 2, 3, 4, 5์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ ๋ด๋ถ ๊ตฌ์กฐ ๋ [4, 8, 30, 10, 13, 45]์ ๋๋ค(2์ง์์์๋ 4์ง์๋ก ๋ค๋ฅผ ์ ์์).
i
์์ ๋ด๋ถ ์ซ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๊ฑฐ์ ์์์ ์ด๋ฏ๋ก ์ฌ์ฉ์์ ๊ด์ ์์ ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค.i
์์๋ฅผ ํํ๊ณ i
๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ๋ค์ ํ ๋ฒ ํธ์ํฉ๋๋ค.IList<T>
๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฑด๋ฐฉ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค. ๋ด API๊ฐ ํ์ฉํ๋ ์ปฌ๋ ์
์ ์ ์ฐํ๊ฒ ์ฌ์ฉํ๊ณ ์ด๊ฑฐํ๊ณ ์ถ์ง๋ง IEnumerable<T>
๋ฅผ ํตํด ํ ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค.
์ ๋ํ ์ผ๋ฐ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๊นจ๋ฌ์์ต๋๋ค.
ICollection<T>
{
int Count
CopyTo(T[], int index)
}
๊ทธ๋์ ๊ทธ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ๋ง์ญ์์ค ๐ข (์ผ์ข ์ IReadOnlyCollection์ด์ง๋ง)
๊ทธ๋ฌ๋ ์ด๊ฑฐ์์ ๋ํ ์ฌ์ค์ ์ ๋์๊ณ ๊ทธ๋ฅ ๋์ ธ์ผ ํ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ๋ด๊ฐ ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ
public bool TryDequeue(out T item); // Add
public bool TryPeek(out T item); // Add
public struct Enumerator : IEnumerator<T>
{
public T Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext();
void IEnumerator.Reset(); // Explicit
public void Dispose();
}
๋น์ ์ด ๋ฐฉ๋ฒ์ ๋ํด ๋
ผ์ํ๊ณ ์๊ธฐ ๋๋ฌธ์... ์ฐ๋ฆฌ๋ ์์ง IHeap
๋ IPriorityQueue
์ ๋ํด ํฉ์ํ์ง ์์์ต๋๋ค. ์ด๊ฒ์ ๋ฐฉ๋ฒ์ ์ด๋ฆ๊ณผ ๋
ผ๋ฆฌ์ ์ฝ๊ฐ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ชฝ์ด๋ ํ์ฌ API ์ ์์๋ ๋ค์์ด ๋๋ฝ๋์ด ์์ต๋๋ค.
์ด๋ฌํ ์์
์ ํนํ ์์ ์
๋ฐ์ดํธ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ด ์์ผ๋ฉด ๋ง์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ ๊ตฌํํ ์ ์์ต๋๋ค. ํธ๋ค ์ ํ์ ๋์
ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ API์์ ํธ๋ค์ IHeapNode
์
๋๋ค. ์ด๊ฒ์ IHeap
๋ฐฉ์์ผ๋ก ๊ฐ๋ ๋ ๋ค๋ฅธ ์ฃผ์ฅ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํญ์ ํ ๋
ธ๋๊ฐ ๋๋ PriorityQueueHandle
์ ํ์ ๋์
ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค... ๐ ๊ฒ๋ค๊ฐ ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ง์ฐํฉ๋๋ค... ๋ฐ๋ฉด์, ํ ๋
ธ๋๋ -- ๋ชจ๋๊ฐ ๋ฌผ๊ฑด์ ์๊ณ ์๊ณ ๊ทธ๋ค์ด ๋ค๋ฃจ๊ณ ์๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
์ค์ ๋ก API ์ ์์ ๋ํด ๊ฐ๋จํ ๋งํด์ ์ด ๋๋ ํ ๋ฆฌ๋ฅผ ์ดํด๋ณด์ญ์์ค. ์ฐ๋ฆฌ๋ ์๋ง๋ ๊ทธ ์ค ์ผ๋ถ๋ง ํ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ IMO์ ํ์ํ ๊ฒ๋ง ํฌํจํ๊ณ ์์ผ๋ฏ๋ก ์์์ ์ผ๋ก ์ดํด๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฌ๋ฌ๋ถ์ ์๊ฐ์ ์ด๋ป์ต๋๊น?
IHeapNode
๋ clr ์ ํ KeyValuePair์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๊น?
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ์ ์์์ ์ ํ์ ๋ถ๋ฆฌํ๋ฏ๋ก ์ด์ PriorityQueue<TKey, TValue>
๊ฐ ์๋ IComparer<TKey> comparer
์
๋๊น?
KeyValuePair๋ ๊ตฌ์กฐ์ฒด์ผ ๋ฟ๋ง ์๋๋ผ ์์ฑ๋ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์กฐ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋์ผํ ํค์์๋ง ์๋ํ์ง ์์ต๋๋ค. ์ ๋ฐ์ดํธ/์ ๊ฑฐํ ์์๋ฅผ ์๊ธฐ ์ํด์๋ ๋ ๋ง์ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค.
IHeapNode
๋ฐ ArrayHeapNode
:
/// <summary>
/// Represents a heap node. It is a wrapper around a key and a value.
/// </summary>
public interface IHeapNode<out TKey, out TValue>
{
/// <summary>
/// Gets the key for the value.
/// </summary>
TKey Key { get; }
/// <summary>
/// Gets the value contained in the node.
/// </summary>
TValue Value { get; }
}
/// <summary>
/// Represents a node of an <see cref="ArrayHeap{TKey,TValue}"/>.
/// </summary>
public class ArrayHeapNode<TKey, TValue> : IHeapNode<TKey, TValue>
{
/// <inheritdoc cref="IHeapNode{TKey,TValue}.Key"/>
public TKey Key { get; internal set; }
/// <inheritdoc cref="IHeapNode{TKey,TValue}.Value"/>
public TValue Value { get; }
/// <summary>
/// The index of the node within an <see cref="ArrayHeap{TKey,TValue}"/>.
/// </summary>
public int Index { get; internal set; }
/// <summary>
/// Initializes a new instance of the <see cref="ArrayHeapNode{TKey,TValue}"/> class,
/// containing the specified value.
/// </summary>
public ArrayHeapNode(TKey key, TValue value, int index)
{
this.Key = key;
this.Value = value;
this.Index = index;
}
}
๊ทธ๋ฆฌ๊ณ ArrayHeap
๋ด์ ์
๋ฐ์ดํธ ๋ฐฉ๋ฒ :
/// <inheritdoc cref="IHeap{TKey,TValue}.Update"/>
public override void Update(ArrayHeapNode<TKey, TValue> node, TKey key)
{
if (node == null)
throw new ArgumentNullException(nameof(node));
var relation = this.Comparer.Compare(key, node.Key);
node.Key = key;
if (relation < 0)
this.MoveUp(node);
else
this.MoveDown(node);
}
๊ทธ๋ฌ๋ ์ด์ ํ์ ๋ชจ๋ ์์๋ ์ถ๊ฐ ๊ฐ์ฒด์ ๋๋ค. PriorityQueue ๋์์ ์ํ์ง๋ง ์ด๋ฌํ ์ถ๊ฐ ํ ๋น์ ์ํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?
๊ทธ๋ฌ๋ฉด ์์๋ฅผ ์
๋ฐ์ดํธ/์ ๊ฑฐํ ์ ์์ต๋๋ค. DecreaseKey
์ฐ์ฐ์ ์์กดํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๋ฒ ์ด ๊ตฌํ์ด ๋ ๊ฒ์
๋๋ค(๋งค์ฐ ์ผ๋ฐ์ ์). ์๋ฅผ ๋ค์ด Dijkstra์ ์๊ณ ๋ฆฌ์ฆ, Prim์ ์๊ณ ๋ฆฌ์ฆ. ๋๋ ์ผ์ข
์ ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑ ์ค์ด๊ณ ์ผ๋ถ ํ๋ก์ธ์ค(๋๋ ๋ฌด์์ด๋ )๊ฐ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋ํ ๋ค๋ฅธ ๋ชจ๋ ํ ๊ตฌํ์์ ์์๋ ๋ช ์์ ์ผ๋ก ๋ ธ๋์ผ ๋ฟ์ ๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์๋ฒฝํ๊ฒ ์์ฐ์ค๋ฝ๊ณ ์ฌ๊ธฐ์์๋ ์ฝ๊ฐ ์ธ์์ ์ด์ง๋ง ์ ๋ฐ์ดํธ/์ ๊ฑฐ์ ํ์ํฉ๋๋ค.
Java์์ ์ฐ์ ์์ ๋๊ธฐ์ด์๋ ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ต์ ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ:
AlgoKit ํ๋ก์ ํธ๋ฅผ ์ํด ํ์ ๊ตฌํํ๊ณ ์ด๋ฌํ ๋ชจ๋ ์ค๊ณ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ ๋ .NET ์์ฑ์๊ฐ ํ(๋๋ ์ฐ์ ์์ ํ)๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ด๋ ์ชฝ ๋์์ธ๋ ์ข์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๊ฐ์ ๋จ์ ์ด ์์ต๋๋ค.
๊ฐ๋จํ ๋งํด์ -- ์ฐ์ ์์์ ๋ฐ๋ผ ์์์ ํจ์จ์ ์ธ ์์๋ฅผ ์ง์ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๊ณ ์์ ์ ๋ฐ์ดํธ/์ ๊ฑฐ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐฐ์ด์ ์์๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ํํ๋ ๊ฒ์ด ์ข์ง ์๋ค๊ณ ๋๋๋ค๋ฉด, ์ด๊ฒ์ด ์ ์ผํ ๋ฌธ์ ๋ ์๋๋๋ค. ๋ค๋ฅธ ํ๋๋ ๋ณํฉ์ ๋๋ค. ์ด๋ ์ด ๊ธฐ๋ฐ ํ์์๋ ์์ ํ ๋นํจ์จ์ ์ ๋๋ค. ๊ทธ๋ฌ๋... ํ์ด๋ง ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ( pairing heap: A new form of self-adjusting heap )๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
IHeap
์ธํฐํ์ด์ค ์ถ๊ฐArrayHeap
๋ฐ PairingHeap
, ์
๋ฐ์ดํธ, ์ ๊ฑฐ, ๋ณํฉArrayHeap
์ฃผ์์ ๋ํผ์ธ PriorityQueue
๋ฅผ ์ถ๊ฐํ์ฌ API๋ฅผ ๋จ์ํํฉ๋๋ค.PriorityQueue
๋ System.Collections.Generic
์๊ณ ๋ชจ๋ ํ์ System.Collections.Specialized
์์ต๋๋ค.
๊ณต์ฅ?
API ๊ฒํ ๋ฅผ ํตํด ์ธ ๊ฐ์ง ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ป์ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ์ ์์ API๊ฐ ๋ ์ข์ต๋๋ค. ๋์ค์ ๋ถ์กฑํ ๊ฒฝ์ฐ ์ธ์ ๋ ์ง ์ถ๊ฐํ ์ ์์ง๋ง API๋ฅผ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ HeapNode ํด๋์ค์ ํฌ์ด ์๋ ์ด์ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฐ ์ข ๋ฅ์ ๊ฒ์ ๋ด๋ถ ์ ์ฉ์ด์ด์ผ ํ๊ณ API๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฏธ ์กด์ฌํ๋ ์ ํ์ ๋ ธ์ถํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ KVP์ผ ๊ฒ์ ๋๋ค.
@ianhays ์ด๊ฒ์ด ๋ด๋ถ ์ ์ฉ์ผ๋ก ์ ์ง๋๋ฉด ์ฌ์ฉ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์์์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๋ ๋ชจ๋ Java ๋ฌธ์ ๋ก ๋๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ ์ด๋ฏธ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๊ตฌํํฉ๋๋ค... ๋์๊ฒ๋ ์ข์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ธ๋๋ฅผ ๋ํ๋ด๋ ๊ฐ๋จํ ํด๋์ค๋ฅผ ๊ฐ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋์ฉ๋๋ค.
BTW: ์ฐ๊ฒฐ ๋ชฉ๋ก์๋ ์ฌ์ฉ์๊ฐ ์ ์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ ธ๋ ํด๋์ค๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฑฐ์ ๋ฏธ๋ฌ๋ง์ ๋๋ค.
์ฌ์ฉ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์๋ ์์์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋์ ์ฌ์ค์ ์๋๋๋ค. ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ์ํ์ง ์์ ๋ฐฉ์์ผ๋ก ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
public override void Update(ArrayHeapNode<TKey, TValue> node, TKey key)
{
}
๋น์ ์ ์๋ฅผ ๋ค์ด
public override void Update(TKey item, TValue priority)
{
}
๋๋ ์ฐ์ ์์๋ฅผ ์ ํ ๋งค๊ฐ ๋ณ์๋ก ๋ ธ์ถํ๋ ๊ฒ์ ๋ํด ์์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ธฐ๋ณธ ์ฐ์ ์์ ์ ํ์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ TValue๋ ๋ถํ์ํ ํน์ด์ฑ์ด ๋ ๊ฒ์ ๋๋ค.
void Update(TKey item, TValue priority)
๋จผ์ -- ์ฝ๋์์ TKey
๋ฐ TValue
๋ ๋ฌด์์
๋๊น? ์ด๋ป๊ฒ ์๋ํด์ผ ํฉ๋๊น? ์ปดํจํฐ ๊ณผํ์ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ฒ์งธ:
๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ธฐ๋ณธ ์ฐ์ ์์ ์ ํ์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ TValue๋ ๋ถํ์ํ ํน์ด์ฑ์ด ๋ ๊ฒ์ ๋๋ค.
"๊ธฐ๋ณธ ์ฐ์ ์์ ์ ํ"์ ์ ์ํ์ญ์์ค. PriorityQueue<T>
๊ฐ๊ณ ์ถ๋ค๋ ๋๋์ด ๋๋๋ฐ ๋ง๋์? ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฐ์ ์์์ ๊ฐ์ ๋๋ฌ์ผ ๋ํผ์ธ ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ IComparable
์ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ญ์์ค. ๊ฝค ๊ฐ๋ํ.
์ฒซ ๋ฒ์งธ -- ์ฝ๋์์ TKey์ TValue๋ ๋ฌด์์ ๋๊น?
ํญ๋ชฉ ๋ฐ ํญ๋ชฉ์ ์ฐ์ ์์์ ๋๋ค. ๊ทธ๊ฒ๋ค์ ์ฐ์ ์์ ๋ฐ ํด๋น ์ฐ์ ์์์ ์ฐ๊ด๋ ํญ๋ชฉ์ผ๋ก ์ ํํ ์ ์์ง๋ง TKey๊ฐ ๋ฐ๋์ ๊ณ ์ ํ์ง ์์(์ฆ, ์ค๋ณต ์ฐ์ ์์ ํ์ฉ) ์ปฌ๋ ์ ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฐ๋ํ์ง ์์ง๋ง ๋์๊ฒ TKey๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ์ฑ์ ์๋ฏธํฉ๋๋ค.
์์ ์ Node ํด๋์ค๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด Update ๋ฉ์๋๋ฅผ ๋ ธ์ถํ๊ธฐ ์ํ ์๊ตฌ ์ฌํญ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค.
"๊ธฐ๋ณธ ์ฐ์ ์์ ์ ํ"์ ์ ์ํ์ญ์์ค. ๋๋ ๋น์ ์ด PriorityQueue๋ฅผ ๊ฐ๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์ ๋๋ ์ ์์ต๋๋ค.
, ๊ทธ๋ ์ง?
์. ์ด ์ค๋ ๋๋ฅผ ๋ค์ ์ฝ์ด๋ณด๊ธด ํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ธ์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฐ์ ์์์ ๊ฐ์ ๋ํ ๋ํผ์ธ ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ IComparable๊ณผ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ญ์์ค. ๊ฝค ๊ฐ๋ํ.
๋น์ ์ ํ๋ฆฌ์ง ์์๋ค. ์๋นํ ์์ ์ฌ์ฉ์ ๊ฐ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํผ ์ ํ์ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ํ ์ฐ์ ์์ ํ์ ๋ฃ๊ณ ์ถ์ ๋น๊ต ๊ฐ๋ฅํ ์ ํ์ด๋ ์ ์๋ ๋น๊ต๊ธฐ๊ฐ ์๋ ์ ํ์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์๋นํ ์์ ์ฌ์ฉ์๊ฐ ์๋ค๊ณ ์์ํฉ๋๋ค. ๋ฌธ์ ๋ ๋ ์ค ์ด๋ ์บ ํ๊ฐ ๋ ํฐ๊ฐ์ ๋๋ค.
.Net์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ ค๋ฉด ์ ํ์ Heap<T>
, ArrayHeap<T>
๋๋ QuaternaryHeap<T>
๊ฐ ์๋๋ผ PriorityQueue<T>
๋ผ๊ณ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
List<T>
๊ฐ ์๋๋ผ ArrayList<T>
์์ต๋๋ค.Dictionary<K, V>
๊ฐ ์๋๋ผ HashTable<K, V>
์์ต๋๋ค.ImmutableList<T>
๊ฐ ์๋๋ผ ImmutableAVLTreeList<T>
์์ต๋๋ค.Array.Sort()
ํ์ง Array.IntroSort()
.์ด๋ฌํ ์ ํ์ ์ฌ์ฉ์๋ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ๋ฐฉ๋ฒ์ ๊ด์ฌ์ด ์์ผ๋ฉฐ ์ ํ์ ๋ํด ๊ฐ์ฅ ๋์ ๋๋ ๊ฒ์ด ์๋์ด์ผ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฐ์ ์์์ ๊ฐ์ ๋ํ ๋ํผ์ธ ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ IComparable๊ณผ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ญ์์ค.
๋น์ ์ ํ๋ฆฌ์ง ์์๋ค. ์๋นํ ์์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํผ ์ ํ์ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฝ API์์ ๋น๊ต๋ ์ ๊ณต๋ ๋น๊ต์ IComparer<T> comparer
์ํด ์ ๊ณต๋๋ฉฐ ๋ํผ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ข
์ข
์ฐ์ ์์๋ ์ ํ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ์๊ฐ ์ค์ผ์ค๋ฌ๋ ์ ํ์ ์์ฑ์ผ๋ก ์คํ ์๊ฐ์ ๊ฐ์ต๋๋ค.
์ฌ์ฉ์ ์ ์ IComparer
์ ํจ๊ป KeyValuePair
์ฌ์ฉํ๋ฉด ์ถ๊ฐ ํ ๋น์ด ์ถ๊ฐ๋์ง ์์ต๋๋ค. ํญ๋ชฉ์ด ์๋ ๊ฐ์ ๋น๊ตํด์ผ ํ๋ฏ๋ก ์
๋ฐ์ดํธ์ ๋ํ ๊ฐ์ ์ฐธ์กฐ๊ฐ ํ๋ ์ถ๊ฐ๋ฉ๋๋ค.
ํญ๋ชฉ์ด ref ๋ฐํ์ ํตํด ์ป์ ๋ค์ ref์ ์ํด ์ ๋ฐ์ดํธ๋์ด ์ ๋ฐ์ดํธ ๋ฉ์๋๋ก ๋ค์ ์ ๋ฌ๋๊ณ ์ฐธ์กฐ๊ฐ ๋น๊ต๋์ง ์๋ ํ ์ ๋ฐ์ดํธ๋ ๊ตฌ์กฐ์ฒด ํญ๋ชฉ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ์ข ๋์ฐํฉ๋๋ค.
@svic
.Net์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ ค๋ฉด ์ ํ์
Heap<T>
,ArrayHeap<T>
๋๋QuaternaryHeap<T>
๊ฐ ์๋๋ผPriorityQueue<T>
๋ผ๊ณ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ธ๊ฐ์ ๋ํ ๋ฏฟ์์ ์์ด๊ฐ๊ณ ์๋ค.
PriorityQueue
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํธ์ถํ๋ ๊ฒ์ .NET์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ผ์นํ๊ณ Heap
ํธ์ถํ๋ ๊ฒ์ ๊ทธ๋ ์ง ์์ต๋๊น? ํ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์คํ๊ณผ ํ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค.ArrayHeap
-> QuaternaryHeap
๋ํ ๊ธฐ๋ณธ ํด๋์ค . ์์ฒญ๋ ์ฐจ์ด.List
์ด ๋ชฉ๋ก์ด์ง๋ง ๋ชฉ๋ก์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๐.NET์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์ถ์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์์ ๋ฌด์์ ๋ณผ ์ ์์ต๋๊น? Jon Skeet์ SortedDictionary
๋ฅผ SortedTree
๋ก ๋ถ๋ฌ์ผ ํ๋ค๊ณ ๋งํ์ต๋๋ค. ์ด๋ ๊ตฌํ์ ๋ ์์ธํ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
@pgolebiowski
ํ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
์, ์ฌ์ฉ๋ฒ์ด ์๋ ๊ตฌํ์ ์ค๋ช ํฉ๋๋ค.
์คํ๊ณผ ํ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค.
๋ ๋ค ์ค์ ๋ก ๊ตฌํ์ ์ค๋ช ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฆ์ด ๋ฐฐ์ด ๊ธฐ๋ฐ์์ ์๋ ค์ฃผ์ง ์์ต๋๋ค.
ArrayHeap
->QuaternaryHeap
๋ํ ๊ธฐ๋ณธ ํด๋์ค . ์์ฒญ๋ ์ฐจ์ด.
์, ๊ทํ์ ๋์์ธ์ ์ดํดํฉ๋๋ค. ๋ด ๋ง์ ์ด ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋์ด์๋ ์ ๋๋ค๋ ๊ฒ์ ๋๋ค.
ํน์ ๋์์ธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ๋ง์ ๊ฒ๋ค์ด ๋์ต๋๋ค. ์ค๋ ๋๋ฅผ ๋ค์ ์ฝ์ผ์ญ์์ค.
์ค์ ์ฝ์์ต๋๋ค. ๋๋ ๊ทธ ๋์์ธ์ด BCL์ ์ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. ์ฌ๋๋ค์ด "4์ฐจ ํ"์ด ๋ฌด์์ธ์ง ๋๋ ์ฌ์ฉํด์ผ ํ๋์ง ๊ถ๊ธํดํ๊ฒ ๋ง๋๋ ๋ด์ฉ์ด ์๋๋ผ ์ฌ์ฉํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ๋ด์ฉ์ ํฌํจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌํ์ด ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๊ฐ ๋ค์ด์ต๋๋ค.
ํด์ํ ์ด๋ธ, ArrayList. ๊ทธ๋ค์ ์กด์ฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์, ์๋ฌด๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ .Net Framework 1.0 ํด๋์ค์ ๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๊ทธ๋ค์ ์ด๋ฆ์ Java์์ ๋ณต์ฌ๋์์ผ๋ฉฐ .Net Framework 2.0 ๋์์ด๋๋ ํด๋น ๊ท์น์ ๋ฐ๋ฅด์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ์๊ฐ์๋ ๊ทธ๊ฒ์ด ์ณ์ ๊ฒฐ์ ์ด์์ต๋๋ค.
BTW, "๋ชฉ๋ก"์ IMO ์ด๋ฆ ์ง์ ์ ์์ด ๋งค์ฐ ์๋ชป๋ ์ ํ์ ๋๋ค. ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ์๊ฐ์
List
๊ฐ ๋ชฉ๋ก์ด์ง๋ง ๋ชฉ๋ก์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๊ฒ์์ด๋ค. ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์ ์๋์ง๋ง ๋์ผํ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ArrayList
๋๋ ResizeArray
( List<T>
๋ํ F#์ ์ด๋ฆ)๋ฅผ ์ด๋์๋ ์ฐ์ง ์์๋ ๋๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ฌด์์ ๋ค๋ฃจ๊ณ ์๋์ง ์ฆ์ ๋ณด์ฌ์ฃผ๋ ์๋ฏธ ์๋ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
๋๋ถ๋ถ์ ์ฌ๋๋ค์ QuaternaryHeap
ํ์๋๋ฉด ์์ ์ด ๋ฌด์์ ๋ค๋ฃจ๊ณ ์๋์ง ๋ชจ๋ฅผ ๊ฒ์
๋๋ค. ๋ฐ๋ฉด์ PriorityQueue
๋๋ฉด CS ๋ฐฐ๊ฒฝ์ด ์๋๋ผ๋ ๋ฌด์์ ๋ค๋ฃจ๊ณ ์๋์ง ๋ช
ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ค์ ๊ตฌํ์ด ๋ฌด์์ธ์ง ์์ง ๋ชปํ์ง๋ง ๊ทธ๊ฒ์ด ๋ฌธ์ํ๋ฅผ ์ํ ๊ฒ์
๋๋ค.
@ianhays
์ฒซ ๋ฒ์งธ -- ์ฝ๋์์ TKey์ TValue๋ ๋ฌด์์ ๋๊น?
ํญ๋ชฉ ๋ฐ ํญ๋ชฉ์ ์ฐ์ ์์์ ๋๋ค. ๊ทธ๊ฒ๋ค์ ์ฐ์ ์์ ๋ฐ ํด๋น ์ฐ์ ์์์ ์ฐ๊ด๋ ํญ๋ชฉ์ผ๋ก ์ ํํ ์ ์์ง๋ง TKey๊ฐ ๋ฐ๋์ ๊ณ ์ ํ์ง ์์(์ฆ, ์ค๋ณต ์ฐ์ ์์ ํ์ฉ) ์ปฌ๋ ์ ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฐ๋ํ์ง ์์ง๋ง ๋์๊ฒ TKey๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ์ฑ์ ์๋ฏธํฉ๋๋ค.
ํค -- ์ฐ์ ์์ ์ง์ ์ ์ฌ์ฉ๋๋ ํญ๋ชฉ์ ๋๋ค. ํค๋ ๊ณ ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ฐ ๊ฐ์ ์ ํ ์ ์์ต๋๋ค.
์์ ์ Node ํด๋์ค๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด Update ๋ฉ์๋๋ฅผ ๋ ธ์ถํ๊ธฐ ์ํ ์๊ตฌ ์ฌํญ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค.
๋ด ์๊ฐ์๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํค ๊ฐ์/ํค ์ฆ๊ฐ ์ง์์ ๋๋ค . ๋ํ ์ด ์ฃผ์ ์์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ๊ด๋ จ๋ ๋์ฐ๋ฏธ ํด๋์ค๊ฐ ์์ต๋๋ค.
์๋นํ ์์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํผ ์ ํ์ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ํ ์ฐ์ ์์ ํ์ ๋ฃ๊ณ ์ถ์ ๋น๊ต ๊ฐ๋ฅํ ์ ํ์ด๋ ์ ์๋ ๋น๊ต๊ธฐ๊ฐ ์๋ ์ ํ์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์๋นํ ์์ ์ฌ์ฉ์๊ฐ ์๋ค๊ณ ์์ํฉ๋๋ค. ๋ฌธ์ ๋ ๋ ์ค ์ด๋ ์บ ํ๊ฐ ๋ ํฐ๊ฐ์ ๋๋ค.
๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ํด์๋ ๋ชจ๋ฅด์ง๋ง ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฝค ๋์ฐํ๊ฒ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ง๋ค ์ฌ์ฉ์ ์ ์ ๋น๊ต๊ธฐ ๋ ผ๋ฆฌ๋ก ๋ํผ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค ...
๋ ๋ค๋ฅธ ์๊ฐ - ๋ํผ๋ฅผ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
class Wrapper
{
public int Priority { get; set; }
public string SomeStuff ...
}
๋๋ ์ด ์ ํ์ผ๋ก PriorityQueue<T>
๋ฅผ ๋จน์ธ๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์์ ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค. ํค ์ ํ๊ธฐ๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฌํ ๋์์ธ์ ํ์ ๋ด๋ถ ์์
์ ์ค๋จ์ํฌ ์ ์์ต๋๋ค. ๋น์ ์ ์์์ ์์ ์๋ก์ ๋น์ ์ ์ฐ์ ์์ ์ธ์ ๋ ์ง ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ํ ์
๋ฐ์ดํธ์ ๋ํ ์๋ฆผ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ๋น์ ์ ๊ทธ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๊ณ ๊ทธ๊ฒ์ ํธ์ถํ ์ฑ
์์ด ์์ต๋๋ค. ๊ฝค ์ํํ๊ณ ๋์๊ฒ ์ง์ค์ ์ด์ง ์์ต๋๋ค.
๋ด๊ฐ ์ ์ํ ํธ๋ค์ ๊ฒฝ์ฐ -- ์ฌ์ฉ์์ ๊ด์ ์์ ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ฐฝ์ฑ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
IMO IHeap
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๋ค์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค API๊ฐ ์๋ค๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ API ๊ฒํ ๊ณผ์ ์ด์์ ํ์๋ก ๊ณ ๊ฐ์๊ฒ ํ์ ๋ค๋ฅธ ์ข
๋ฅ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด 3 ๊ฐ์ ์ API๋ฅผ ๋
ธ์ถ ๊ฐ๊ณ ์์ง ์์์ง ์ฐ๋ฆฌ๊ฐ์ ์ด์ ์ํ๋ ค๋์ด์ @ianhays 'ํจ๊ป ํด์ PriorityQueue
์ด๋ฆ์ด ๋ฌด์์ด๋ ์๊ด ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก ๋๊ธฐ์ด์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด Node ๋ด๋ถ/๊ณต์ฉ ํด๋์ค๋ฅผ ๊ฐ์ง ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ถ๊ฐ ํ ๋น์ด ํ์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ IDictionary๊ฐ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋ฐ๋ฅผ ์ ์๊ณ KeyValuePair๋ฅผ ์์ฑํ๋ Enumerable์ ๋ํ ๊ฐ์ ์ฐ์ถํ ๋PriorityQueue<T>
(์ด ์ด๋ฆ์ ๋จ์ง ํ๋๋ฅผ ์ฃผ๊ธฐ ์ํ ๊ฒ์
๋๋ค). ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ ์ฒด BCL์ด IComparer<T>
๋ก ์ํํ๋ ์์
์ ๋ฐ๋ฅด๊ณ ํด๋น ๋น๊ต๊ธฐ์ ๋น๊ตํ์ฌ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฐ์ ์์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ API๋ฅผ ๋
ธ์ถํ ํ์๊ฐ ์์ต๋๋ค.
์ผ๋ถ API์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ฉด ๊ธฐ๋ณธ ์ฐ์ ์์๋ฅผ ์ํ๋ ์ผ๋ฐ ๊ณ ๊ฐ์๊ฒ "์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๊ฑฐ๋" ๋ ๋ณต์กํด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. IComparer<T>
์ฌ์ฉ์ ์ง์ ์ต์
์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ด๋ฉฐ BCL ์ ๋ฐ์ ๊ฑธ์ณ ์๋ ์ง์นจ์ ๋ฐ๋ฆ
๋๋ค.
์ด๋ฆ์ ์ด๋ป๊ฒ ํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ๋ค์ ์ด๋ฆ์ ์ถ์์ ์ธ ๊ฐ๋ ๊ณผ ๊ทธ ๊ตฌํ๊ณผ ๊ทธ๊ฒ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ๋ณด๋ค๋ ์ฌ์ฉ์๋ฅผ ์ํด ๋ฌ์ฑํ ๊ฒ์ ์ด๋ฆ์ ๋ฐ์ ๋ช ๋ช ๋์์ต๋๋ค. (์ด๋ ๋ํ ๋ ๋์ ๊ฒ์ผ๋ก ํ๋ช ๋๋ฉด ๋ค๋ฅธ ๊ตฌํ์ ์ฌ์ฉํ๋๋ก ๊ตฌํ์ ๊ฐ์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค)
์คํ๊ณผ ํ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค.
Stack
๋ ๋ฌดํ ํฌ๊ธฐ ์กฐ์ ๋ฐฐ์ด์ด๊ณ Queue
๋ ๋ฌดํ ํฌ๊ธฐ ์กฐ์ ์ํ ๋ฒํผ๋ก ๊ตฌํ๋ฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ์ถ์์ ๊ฐ๋
์ ์ด๋ฆ์ ๋ฐ์ ๋ช
๋ช
๋์์ต๋๋ค. ์คํ(์ถ์ ์๋ฃํ) : ํ์
์ ์ถ(LIFO), ํ(์ถ์ ์๋ฃํ) : ์ ์
์ ์ถ(FIFO)
ํด์ํ ์ด๋ธ, ArrayList. ๊ทธ๋ค์ ์กด์ฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ ํญ๋ชฉ
๋ค, ํ์ง๋ง ๊ทธ๋ ์ง ์์ ์ฒ ํฉ์๋ค. ๊ทธ๊ฒ๋ค์ ๋ ๋ฌธ๋ช ํ๋ ์๋์ ์ธ๊ณต๋ฌผ์ ๋๋ค. ํ๋ฆฌ๋ฏธํฐ๋ธ ๋๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ํ ์์ ๋ฐ ์์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ถ๊ฐ์ ํ ๋นํ์ญ์์ค.
@terrajobst ์ ํ๋ซํผ ํธํ์ฑ ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ "ํ์ง ๋ง์ญ์์ค"๋ผ๊ณ ์๋ ค์ค๋๋ค.
๋ชฉ๋ก์ ๋ชฉ๋ก์ด์ง๋ง ๋ชฉ๋ก์ด ์๋๋๋ค.
์ค์ ๋ก ์ํ์ค๋ผ๊ณ ๋ ํ๋ ๋ชฉ๋ก(์ถ์ ๋ฐ์ดํฐ ์ ํ) ์ ๋๋ค.
๋๋ฑ ์ฐ์ ์์ ๋๊ธฐ์ด ์ ์ฌ์ฉ ์ ๋ฌ์ฑํ ๋ด์ฉ์ ์๋ ค์ฃผ๋ ์ถ์ ์ ํ์ ๋๋ค. ๊ตฌํ ์ ์ํ ๋ฐฉ์์ด ์๋(๋ค์ํ ๊ตฌํ์ด ์์ ์ ์์)
๋ง์ ํ๋ฅญํ ํ ๋ก !
์๋ ์ฌ์์ ๋ช ๊ฐ์ง ํต์ฌ ์์น์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค.
@karelz @pgolebiowski
"ํ"์ผ๋ก ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ตฌํ์ ๋ง์ถฐ ์ ๋ ฌ๋ ๋ค๋ฅธ ์ฉ์ด๋ ์ปฌ๋ ์
์ ๋ํ ๋๋ถ๋ถ์ BCL ๊ท์น๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. ์ญ์ฌ์ ์ผ๋ก .NET ์ปฌ๋ ์
ํด๋์ค๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ/ํจํด์ ์ค์ ์ ๋์ง ์๊ณ ๋ฒ์ฉ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ด ์๋ ์๊ฐ์ .NET ์์ฝ์์คํ
์ด๊ธฐ์ API ๋์์ด๋๊ฐ ์๋์ ์ผ๋ก "ArrayList"์์ "List"๋ก ์ด๋ํ๋ค๋ ๊ฒ์
๋๋ค.
ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋์ผํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ง์ ์ค๊ธ ๊ฐ๋ฐ์๋ (์ฌํ๊ฒ๋) "ํ"์ ๋ณด๊ณ "์ผ๋ฐํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ"ํ๋ ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ํ(์: ํ ๋ฐ ์คํ)์ผ๋ก ํผ๋ํฉ๋๋ค. System.Collections.Generic์ ๋ณด๊ธ์ผ๋ก ์ธํด ๊ฑฐ์ ๋ชจ๋ .NET ๊ฐ๋ฐ์์ ์ง๋ฅ์ ์ธ ์ ์์ ๋ํ๋๋ฉฐ ์ ๋ฉ๋ชจ๋ฆฌ ํ์ ํ ๋นํ ์ ์๋ ์ด์ ๋ฅผ ๊ถ๊ธํดํ ๊ฒ์ ๋๋ค. :)
์ด์ ๋นํด PriorityQueue๋ ํจ์ฌ ๋ ์ฝ๊ฒ ๊ฒ์ํ ์ ์๊ณ ํผ๋์ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. "Queue"๋ฅผ ์ ๋ ฅํ๊ณ PriorityQueue์ ๋ํ ์ ์์ ๋ฐ์ ์ ์์ต๋๋ค.
์ ์ ์ฐ์ ์์ ๋๋ ์ฐ์ ์์์ ๋ํ ์ผ๋ฐ ๋งค๊ฐ ๋ณ์(TKey, Tpriority ๋ฑ)์ ๋ํ ๋ช ๊ฐ์ง ์ ์ ๋ฐ ์ง๋ฌธ์ด ์์ต๋๋ค. ๋ช
์์ ์ฐ์ ์์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์๋น์๊ฐ ์ฐ์ ์์๋ฅผ ๋งคํํ๊ณ API์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค๋ ์์ฒด ๋
ผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋ด์ฅ IComparer ์ฌ์ฉ
ํญ๋ชฉ์ด ๊ณ ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ Enqueue()๋ ArgumentException์ ๋ฐ์์ํค๊ธฐ ์ํด ๊ณ ์ ์ฑ ์กฐํ๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ํ ํญ๋ชฉ์ ๋ ๋ฒ ์ด์ ๋๊ธฐ์ด์ ๋ฃ์ ์ ์๋ ์ ํจํ ์๋๋ฆฌ์ค๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๋น๊ณ ์ ์ฑ ๋์์ธ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ์๋์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ Update() ์์ ์ ์ ๊ณตํ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ช ๊ฐ์ง ์๊ฒฌ์์ ์ ์ ์๋ฏ์ด ์ด๊ฒ์ "๋ ธ๋" ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ API์ ๋ค์ด๊ฐ๊ธฐ ์์ํ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ๊ฐ๋น์ง ์์ง์ด ํ์ํ ํ ๋น์ด ํ์ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒฝ์ฐ์๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์๋น ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์ฆ๊ฐํฉ๋๋ค.
ํ ๋ ์ฌ์์ ๊ฒ์ํ๊ธฐ ์ ์ API์ ์ฌ์ฉ์ ์ง์ IpriorityQueue ์ธํฐํ์ด์ค๊ฐ ์์์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ์ ๋ฐ๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ๊ฐ ๋ชฉํ๋ก ํ๋ ์ฌ์ฉ ํจํด์ Enqueue, Dequeue ๋ฐ Iterate์์ต๋๋ค. ๊ธฐ์กด ์ธํฐํ์ด์ค ์ธํธ์์ ์ด๋ฏธ ๋ค๋ฃจ์์ต๋๋ค. ์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ๋ ๋๊ธฐ์ด๋ก ์๊ฐํ์ญ์์ค. ํญ๋ชฉ์ด IComparer๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๊ธฐ์ด์์ ์์ฒด(์ด๊ธฐ) ์์น๋ฅผ ์ ์งํ๋ ํ
์ผ๋ถ ๊ณ ๊ฐ ์ฝ๋ ์์ ๋ ๋ชจ๋ ๊ทํ์๊ฒ ๋น์ง๊ณ ์์ต๋๋ค. ์๋ ๊ณํ์ ์์ ์ ๊ธฐ์ด๋ก ์ฌ์ฉํ๊ธฐ ์ํด PriorityQueue์ ๊ธฐ์กด BCL ๊ตฌํ์ ์ดํด๋ณด๋ ๊ฒ์ด์์ต๋๋ค.
์์ฝ API์์ ๋น๊ต๋ ์ ๊ณต๋ ๋น๊ต์ IComparer์ ์ํด ์ ๊ณต๋ฉ๋๋ค.
๋น๊ต์, ๋ํผ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ข ์ข ์ฐ์ ์์๋ ์ ํ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์๊ฐ ์ค์ผ์ค๋ฌ๋ ์ ํ์ ์์ฑ์ผ๋ก ์คํ ์๊ฐ์ ๊ฐ์ต๋๋ค.
์ ์๋ OP API์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ์ค ํ๋๋ฅผ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
์ด์คํ API๋ ๋ ๋ฒ์งธ ๋ ๊ฐ์ง ์ต์ ์ ๋ถ๋ด์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ง ์์ต๋๊น? ์ด๋ฏธ ์ฐ์ ์์ ๊ฐ ํฌํจ๋ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ์ PriorityQueue/Heap ์์ฑ์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? API๋ ์ด๋ป๊ฒ ์๊ฒผ๋์?
๋ด ์๊ฐ์๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํค ๊ฐ์/ํค ์ฆ๊ฐ ์ง์์ ๋๋ค.
public override void Update(ArrayHeapNode<TKey, TValue> node, TKey key) {}
public override void Update(TKey key, TValue value);
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ง์ ๋ ์ฐ์ ์์์ ์ฐ๊ฒฐ๋ ํญ๋ชฉ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ์ ArrayHeapNode๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? TKey/TValue๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์๋ ์์ ์ ๋ฌด์์ ๋๊น?
@ianhays
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ง์ ๋ ์ฐ์ ์์์ ์ฐ๊ฒฐ๋ ํญ๋ชฉ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ์ ArrayHeapNode๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? TKey/TValue๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์๋ ์์ ์ ๋ฌด์์ ๋๊น?
์ ์ด๋ ์ด์ง ํ(๋ด๊ฐ ๊ฐ์ฅ ์ ์๊ณ ์๋ ๊ฒ)์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ๊ฐ์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ํ์์ ํด๋น ์์น๋ฅผ ์๊ณ ์๋ค๋ฉด ์ ์ํ๊ฒ ์ํํ ์ ์์ต๋๋ค(O(log n) ์๊ฐ).
๊ทธ๋ฌ๋ ๊ฐ๊ณผ ์ฐ์ ์์๋ง ์๊ณ ์๋ค๋ฉด ๋จผ์ ๊ฐ์ ์ฐพ์์ผ ํ๋๋ฐ, ์ด๋ ๋๋ฆฐ ๊ฐ(O(n))์ ๋๋ค.
๋ฐ๋ฉด์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ํ์ ํญ๋ชฉ๋น ํ๋์ ํ ๋น์ ์์ํ ์ค๋ฒํค๋์ ๋๋ค.
ํ์ํ ๋๋ง ์ค๋ฒํค๋๋ฅผ ์ง๋ถํ์ง๋ง ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ๊ณ ๊ฒฐ๊ณผ API๊ฐ ์ข์ง ์์ ์ ์๋ ์๋ฃจ์ ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ด์คํ API๋ ๋ ๋ฒ์งธ ๋ ๊ฐ์ง ์ต์ ์ ๋ถ๋ด์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ง ์์ต๋๊น? ์ด๋ฏธ ์ฐ์ ์์๊ฐ ํฌํจ๋ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ์ PriorityQueue/Heap ์์ฑ์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? API๋ ์ด๋ป๊ฒ ์๊ฒผ๋์?
์ข์ ์ ์
๋๋ค. ์๋น์๊ฐ ์ด๋ฏธ ๊ฐ๊ณผ ๋ณ๋๋ก ์ ์ง ๊ด๋ฆฌ๋๋ ์ฐ์ ์์ ๊ฐ(์ฆ, ์ ์)์ ๊ฐ๊ณ ์๋ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์๋ API์ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค. ๊ทธ ๋ฐ๋๋ฉด์
์ ๋ ฌ๋ ๋ชฉ๋ก
๋์๊ฒ ๋์ผํ ์์น์ด ๋๊ธฐ์ด์ ์ ์ฉ๋ฉ๋๋ค. ํ๋ ์ญ์ฌ์ ์ผ๋ก 1์ฐจ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
๋ด ํ๋ C++ std ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ ์ฝ๊ฐ ๋ น์ฌ์์ง๋ง std::priority_queue์กฐ์ฐจ๋ ํธ์, ํ ๋ฐ ๋น๊ต์๋ฅผ ํ ํ๋ฆฟ(์ผ๋ฐ) ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ๊ฐ๋ฅํ ํ ์ฑ๋ฅ์ ๋ฏผ๊ฐํฉ๋๋ค. :)
๋ฐฉ๊ธ ๋ช ๊ฐ์ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฐ์ ์์ ํ์ ํ ๊ตฌํ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ค์บํ์ต๋๋ค. C++, Java, Rust ๋ฐ Go๋ ๋ชจ๋ ๋จ์ผ ์ ํ์ผ๋ก ์๋ํฉ๋๋ค(์ฌ๊ธฐ์ ๊ฒ์๋ ์๋ API์ ์ ์ฌ). NPM์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ/์ฐ์ ์์ ํ ๊ตฌํ์ ์ผํ ๋ณด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
@pgolebiowski ๋ ํน์ ๊ตฌํ์ ๋ฐ๋ผ ๋ช ์์ ์ผ๋ก ๋ช ๋ช ๋ ํน์ ๊ตฌํ์ด ์์ด์ผ ํ๋ค๊ณ ์คํดํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ ์ํ๋ ์ฑ๋ฅ ๋ชฉํ์ ์ผ์นํ๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์๊ณ ์์ฉํ ์ ์๋ ์ ์ถฉ์์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ๋ ์์ํฌ ์ปฌ๋ ์ ์ ์ผ๋ฐ์ ์ธ ๋์์ ์ํ๋ ์ฉ๋์ 90%๋ฅผ ๋ค๋ฃน๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋์์ด๋ ๊ตฌํ์ ์ํ ๊ฒฝ์ฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค. ๊ตฌํ ์ด๋ฆ์ ๋ฐ์ ์ด๋ฆ์ ์ง์ ํ๋ฉด ํ์์ ๋ง๋์ง ์ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ๋์ ์ ํ์ ํน์ ๊ตฌํ์ ๋ฌถ๊ณ ์ถ์ง๋ ์์ต๋๋ค. ์ ํ ์ด๋ฆ์ด ๋์ผํ๊ฒ ์ ์ง๋์ด์ผ ํ๊ณ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ํฉ๋๋ค.
๋ ผ์๊ฐ ํ์ํ ๋ง์ ๋ฌธ์ ๊ฐ ์์ง๋ง ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋์ํ์ง ์๋ ๋ถ๋ถ์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์์ ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ .
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ์์ ์ ์ด๋ป๊ฒ ์ง์ํ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ํฌํจ์์ผ์ผ ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ธฐ๋ณธ์ ๋๋ค. ์๋ฐ์์ ๋์์ด๋๋ค์ ๊ทธ๊ฒ๋ค์ ์๋ตํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก:
์ด๊ฒ์ ๋จ์ง ํ์ฌํฉ๋๋ค. ์ ๋ง ๊ทธ๋ฐ ๊ธธ์ ๊ฐ๊ณ ์ถ์ ์ฌ๋์ด ์์๊น? ๊ทธ๋ฐ ๋นํ์ฑํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ณต๊ฐํ๋ ๊ฒ์ด ๋ถ๋๋ฝ์ต๋๋ค.
@pgolebiowski ๋ ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ํ๋ซํผ์ ๋ํ ์ต์ ์ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์๋ฌด๋ ๊นจ์ง API๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ค์๋ก๋ถํฐ ๋ฐฐ์ฐ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ์ ์ฉํ ๊ด๋ จ ์ ๋ณด(์: ์๋ฐ ์ด์ผ๊ธฐ)๋ฅผ ๊ณ์ ๊ฐ์ ธ์ค์ธ์.
๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง๋ฅผ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
๋ฐฉ๊ธ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ ๋ฐ์ดํธ/์ ๊ฑฐ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ๊ณ ์ถ์ผ๋๊ณ ๋ฌผ์์ต๋๋ค... ์ด๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ๋ฃ๊ณ ํฉ์๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ ์ข์ ์๋๋ฅผ ์์ฌํ์ง ์์ต๋๋ค! ๋๋ก๋ ์ง๋ฌธํ๋ ๋ฐฉ๋ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๋๋ค์ด ์๋๋ฐฉ์ ํ ์คํธ๋ฅผ ์ธ์ํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํ ์คํธ๋ ๊ฐ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ธ๋ก ์ ์ผ๋ฉด ๋ค๋ฅด๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์ 2์ธ๊ตญ์ด๋ก์์ ์์ด๋ ํจ์ฌ ๋ ํผ๋์ค๋ฝ๊ณ ์ฐ๋ฆฌ ๋ชจ๋๋ ๊ทธ๊ฒ์ ์ธ์ํ ํ์๊ฐ ์์ต๋๋ค. ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ ์คํ๋ผ์ธ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ์ฑํ ํ ์ ์์ด ๊ธฐ์ฉ๋๋ค... ์ฌ๊ธฐ์์ ๋ ผ์๋ฅผ ๊ธฐ์ ํ ๋ก ์ผ๋ก ๋ค์ ๋๋ฆฌ๊ฒ ์ต๋๋ค...
Heap vs. PriorityQueue ๋ ผ์์ ๋ํ ๋์ 2์ผํธ: ๋ ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ์ ํจํ๋ฉฐ ๋ถ๋ช ํ ์ฅ์ ๊ณผ ๋จ์ ์ด ์์ต๋๋ค.
์ฆ, "PriorityQueue"๋ ๊ธฐ์กด .NET ์ ๊ทผ ๋ฐฉ์๊ณผ ํจ์ฌ ๋ ์ผ์นํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๋์ ํต์ฌ ์ปฌ๋ ์
์ List์
๋๋ค.
ํ๋์ ์ปฌ๋ ์ ์ด ์ฌ๊ธฐ์์ ์ถ์ธ๋ฅผ ๊ฑฐ์ค๋ฅด๋ ๊ฒ์ ์ด์ํ๊ฒ ๋๊ปด์ง ๊ฒ์ ๋๋ค.
์ถ๊ฐ ์์ฑ์๊ฐ ์๋ PriorityQueue ์๊ฐ: PriorityQueue
์ด ๊ฒฝ์ฐ PrioriryQueue
ํด๋์ค ArrayHeap : IHeap {}
ํด๋์ค PairingHeap : IHeap {}
ํด๋์ค ํผ๋ณด๋์น ํ: IHeap {}
ํด๋์ค BinomialHeap : IHeap {}
์ข์์. ๋ค์ํ ๋ชฉ์๋ฆฌ๊ฐ ์์ต๋๋ค. ๋๋ ๋ค์ ํ ๋ก ์ ํตํด ์ ๊ทผ ๋ฐฉ์์ ์์ ํ์ต๋๋ค. ๋ํ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์๋ ํ ์คํธ๋ ์์ ๊ฒ์๋ฌผ์์ ์ธ์ฉํ ๋ด์ฉ์ ์ฌ์ฉํฉ๋๋ค.
์ด ์ ์ฒด ํ ๋ก ์ ๊ถ๊ทน์ ์ธ ๋ชฉํ๋ ์ฌ์ฉ์๋ฅผ ํ๋ณตํ๊ฒ ๋ง๋๋ ํน์ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์์๊ฒ ๋ง์ ์์๊ฐ ์๊ณ ๊ทธ ์ค ์ผ๋ถ๋ ๋ค๋ฅธ ์์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ ๋์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ฒฐ๊ตญ, ๊ทธ๋ค์ ๋ค์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋๋ก ์ด ์์ ๋ฌถ์์ ํน์ ์์๋ก ์ ์งํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๋ค๋ฅธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑ์๋ ์ด ๊ธฐ๋ฅ์ ์ง์ํ๋ ค๊ณ ํ์ต๋๋ค. ์ด ์น์ ์์๋ Python , Java , C++ , Go , Swift ๋ฐ Rust ์์ ํด๊ฒฐ๋ ๋ฐฉ๋ฒ์ ์ฐธ์กฐํฉ๋๋ค.
์ปฌ๋ ์ ์ ์ด๋ฏธ ์ฝ์ ๋ ์์ ์์ ์ ์ง์ ํ์ง ์์ต๋๋ค . ์ปฌ๋ ์ ์ ์๋ช ๋์ ํด๋น ์์์ ์ฐ์ ์์๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋๋ผ์ด ์ผ์ ๋๋ค. ํนํ ๊ทธ๋ฌํ ์ปฌ๋ ์ ์ด ์๋น์ค์ ์ ์ฒด ์๋ช ๋์ ์ฌ์ฉ๋๋๋ก ์๋๋ ๊ฒฝ์ฐ. ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ๋ก ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ๋ ๋ง์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ค๊ณ๋ ๋จ์ํ ์๋ชป๋ ๊ฒ ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ณ ๊ฐ์ด ์์ค๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์๋ ๋ ๋ค๋ฅธ ์ ์ ๋ชจ๋ ๋จ์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ์ด๋๋ฆฌ ํ ๊ตฌํ์ ํตํด ์ด๋ฌํ ๋ถ๋ถ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ธ์, ๊ทธ๊ฒ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ(๋ฌด์์ ์ ๋ ฅ)์์ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ๊ตฌํ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ ๋ฌ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ 4์ฐจ ํ (๋ฐฐ์ด๋ก ์ ์ฅ๋ ์์์ ํ ์์์ ์์ ํ 4ํญ ํธ๋ฆฌ)์ ๋๋ค. ํจ์ฌ ๋ ์๋ ค์ ธ ์์ผ๋ฉฐ ์ด๊ฒ์ด ์๋ง๋ ๋์์ด๋๊ฐ ๋์ ๋ฐ์ด๋๋ฆฌ ํ์ ์ฌ์ฉํ๋ ์ด์ ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ - ๋ ์ฌ๊ฐํ์ง๋ง ๋ ๋ค๋ฅธ ์๋ชป๋ ์ ํ์ ๋๋ค.
๊ทธ๋ก๋ถํฐ ๋ฌด์์ ๋ฐฐ์ธ ์ ์์ต๋๊น?
์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ค์์ ์ ๊ณตํด์ผ ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ์๊ฐํฉ๋๋ค.
IHeap<T>
์ธํฐํ์ด์คHeap<T>
ํด๋์คIHeap
์ธํฐํ์ด์ค์๋ ์ด ๊ฒ์๋ฌผ์ ์์ ๋ถ๋ถ์์ ์ค๋ช
ํ ๋ชจ๋ ์์
์ ์ํํ๊ธฐ ์ํ ๋ฉ์๋๊ฐ ๋ถ๋ช
ํ ํฌํจ๋์ด ์์ต๋๋ค. 4์ฐจ ํ์ผ๋ก ๊ตฌํ๋ Heap
ํด๋์ค๋ 98%์ ๊ฒฝ์ฐ์ ์ ํฉํ ์๋ฃจ์
์
๋๋ค. ์์์ ์์๋ ์์ฑ์์ ์ ๋ฌ๋ IComparer<T>
๋๋ ์ ํ์ด ์ด๋ฏธ ๋น๊ต ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
IHeap
ํ๋ฉด ํ์ด๋ง ํ , ์ดํญ ํ, ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ์ฌ๋ํ๋ ๋ฐ์ด๋๋ฆฌ ํ.Heap
๊ตฌํ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ ์ฌ๋ก์ 98%์ ์ต์ ํ๋์ด ์์ต๋๋ค.ISet
๋ฐ HashSet
IList
๋ฐ List
IDictionary
๋ฐ Dictionary
Heap
๋ ์ค์ ๋ก ๋ช
ํํ๊ณ ๋ช
ํํฉ๋๋ค. Stack
, Queue
, List
๋ฐ Array
์๋ ์กฐํ๋ฅผ ์ด๋ฃน๋๋ค. ๊ฐ์ฅ ํ๋์ ์ธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Go, Swift, Rust)์์๋ ์ด๋ฆ ์ง์ ๊ณผ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ์ฉ๋์์ต๋๋ค. ์ด๋ค์ ๋ช
์์ ์ผ๋ก ํ์ ๋
ธ์ถํฉ๋๋ค.@pgolebiowski Heap<T>
/ IHeap<T>
์ด๋ฆ์ด Stack<T>
, Queue<T>
๋ฐ/๋๋ List<T>
์์ต๋๊น? ์ด๋ฌํ ์ด๋ฆ ์ค ์ด๋ ๊ฒ๋ ๋ด๋ถ์ ์ผ๋ก ๊ตฌํ๋๋ ๋ฐฉ์์ ์ค๋ช
ํ์ง ์์ต๋๋ค(๋ฐ์ํ๋ T ๋ฐฐ์ด).
@SamuelEnglard
Heap
๋ด๋ถ์ ์ผ๋ก ๊ตฌํ๋๋ ๋ฐฉ๋ฒ๋ ๋งํ์ง ์์ต๋๋ค. ์ ๊ทธ๋ ๊ฒ ๋ง์ ์ฌ๋๋ค ์๊ฒ ํ ์ด ํน์ ๊ตฌํ์ ์ฆ์ ๋ฐ๋ฅด๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋จผ์ ๋์ผํ API๋ฅผ ๊ณต์ ํ๋ ํ์ ๋ณํ์ด ๋ง์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์ ๋ค๋ฃจ๊ณ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ฌ์ ํ โโ๋งค์ฐ ์ถ์์ ์
๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๊ฐ 4์ฐจ ํ์ ๋ค๋ฃจ๊ณ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ถ์์ ์
๋๋ค. T
๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ตฌํ๋ ์๋ ์์ต๋๋ค(์ Stack<T>
, Queue<T>
๋ฐ List<T>
) ๋๋ ๋ช
์์ (๋
ธ๋ ๋ฐ ํฌ์ธํฐ ์ฌ์ฉ).
๊ฐ๋จํ ๋งํด์ Heap<T>
๋ Stack<T>
, Queue<T>
๋ฐ List<T>
์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ๊ธฐ๋ณธ ์ถ์ ๋น๋ฉ ๋ธ๋ก์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ๋ํ, ๋ฐ์ํ๋ ๋๋ก ๋ชจ๋ ์๋์ T
๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์ ๋ ์ด ์ ์ฌ์ฑ์ด ์ ๋ง ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ด ๋ผ?
์ฐธ๊ณ ๋ก ์ ๋ ๋ค์ด๋ฐ์ ๋ฌด๊ด์ฌํฉ๋๋ค. C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ต์ํ ์ฌ๋๋ค์ ์๋ง๋ _priority_queue_๋ฅผ ์ ํธํ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํด ๊ต์ก์ ๋ฐ์ ์ฌ๋๋ค์ _Heap_์ ์ ํธํ ์ ์์ต๋๋ค. ํฌํ๋ฅผ ํด์ผ ํ๋ค๋ฉด _heap_์ ์ ํํ ๊ฒ์ ๋๋ค. ๋น๋ก ๊ทธ๊ฒ์ด ์ ์๊ฒ๋ ๋์ ๋์ง๊ธฐ์ ๊ฐ๊น์ง๋ง ๋ง์ ๋๋ค.
@pgolebiowski ๋ด ์ง๋ฌธ์ ์๋ชป ํํํ์ต๋๋ค. ๊ทธ๊ฑด ๋ด ์๋ชป์
๋๋ค. ์, Heap<T>
๋ ๋ด๋ถ์ ์ผ๋ก ๊ตฌํ๋๋ ๋ฐฉ๋ฒ์ ๋งํ์ง ์์ต๋๋ค.
์ ํ์ ์ ํจํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด์ง๋ง ํ != ์ฐ์ ์์ ํ์
๋๋ค. ๋ ๋ค ์๋ก ๋ค๋ฅธ API ํ๋ฉด์ ๋
ธ์ถํ๊ณ ์๋ก ๋ค๋ฅธ ์์ด๋์ด์ ์ฌ์ฉ๋ฉ๋๋ค. Heap<T>
/ IHeap<T>
๋ (์ด๋ก ์ ์ธ ์ด๋ฆ๋ง) PriorityQueue<T>
/ IPriorityQueue<T>
๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ ํ์ด์ด์ผ ํฉ๋๋ค.
@SamuelEnglard
์ปดํจํฐ ๊ณผํ์ ์ธ๊ณ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง์ ๊ดํด์๋ ๊ทธ๋ ์ต๋๋ค. ๋ค์์ ์ถ์ํ ์์ค์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, IHeap
๋ฐ Heap
PriorityQueue
๊ฐ ์์ผ๋ฉด
public class PriorityQueue<T>
{
private readonly IHeap<T> heap;
public PriorityQueue(IHeap<T> heap)
{
this.heap = heap;
}
public void Add<T>(T item) => this.heap.Add(item);
public void Remove<T>(T item) => this.heap.Remove(item);
// etc...
}
์ฌ๊ธฐ์์ ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์ (์ด๋ก ์ ์ผ๋ก) ํ ํ์๊ณผ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ตฌํํ ์๋ ์์ต๋๋ค. ์์ ๊ฒ๊ณผ ๊ฐ์ PriorityQueue
์ ๋์์ธ์ ํ ํจ๋ฐ๋ฆฌ์๋ง ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ณด๊ธฐ ํํฉ๋๋ค. ๋ํ IHeap
์ฃผ์์ ๋งค์ฐ ์์ ๋ํผ์
๋๋ค. ์ด๊ฒ์ _์ ๋จ์ํ ํ ํจ๋ฐ๋ฆฌ๋ฅผ ๋์ ์ฌ์ฉํ์ง ์๋๊ฐ_๋ผ๋ ์ง๋ฌธ์ ๋ณ์ต๋๋ค.
IHeap
์ธํฐํ์ด์ค๋ฅผ ์ํ ๊ณต๊ฐ ์์ด ์ฐ์ ์์ ํ๋ฅผ 4์ฐจ ํ์ ํน์ ๊ตฌํ์ผ๋ก ์์ ํ๋ ํ ๊ฐ์ง ์๋ฃจ์
์ด ๋จ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋๋ฌด ๋ง์ ์ถ์ํ ์์ค์ ํต๊ณผํ๊ณ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ ๋ชจ๋ ๋๋ผ์ด ์ด์ ์ ์ฃฝ์ธ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํ ๋ก ์ ์ค๊ฐ์์ ๋์์ธ ์ ํ์ผ๋ก ๋์์์ต๋๋ค -- PriorityQueue
๋ฐ IPriorityQueue
์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์ ์ํํฉ๋๋ค.
class BinaryHeap : IPriorityQueue {}
class PairingHeap : IPriorityQueue {}
class FibonacciHeap : IPriorityQueue {}
class BinomialHeap : IPriorityQueue {}
๋ณด๊ธฐ ํํ ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ ์ ์ผ๋ก๋ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ์ฐ์ ์์ ๋๊ธฐ์ด ์ ํ์ด ์๋๋ฉฐ ๋์ผํ API๋ฅผ ๊ณต์ ํ์ง ์์ต๋๋ค(
class BinaryHeap : IHeap {}
class PairingHeap : IHeap {}
class FibonacciHeap : IHeap {}
class BinomialHeap : IHeap {}
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ class Heap : IHeap {}
.
BTW, ๋๊ตฐ๊ฐ๋ ๋ค์์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
| ๊ตฌ๊ธ ์ฟผ๋ฆฌ | ๊ฒฐ๊ณผ |
| :----------------------------------------------------: | ::----: |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "์ฐ์ ์์ ํ" | 172,000 |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "ํ" | 430,000 |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "๋๊ธฐ์ด" -"์ฐ์ ์์ ๋๊ธฐ์ด" | 496,000 |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "๋๊ธฐ์ด" | 530,000 |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "์คํ" | 577,000 |
@pgolebiowski ์ฌ๊ธฐ์์ ์๋ค ๊ฐ๋ค ํ๋ ๊ฒ ๊ฐ์์ ์ธ์ ํฉ๋๋ค.
@karelz @safern ์์ ๋ด์ฉ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ํน์ API ์ ์์ ์ ์ํ ์ ์๋๋ก IHeap
+ Heap
์ ๊ทผ ๋ฐฉ์์ ์์ ํ ์ ์์ต๋๊น?
์ฌ๊ธฐ์ ์ธํฐํ์ด์ค๊ฐ ํ์ํ์ง ๊ถ๊ธํฉ๋๋ค( IHeap
๋๋ IPriorityQueue
). ์, ์ด๋ก ์ ์ผ๋ก ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์์ํฌ๊ฐ ๋ ์ด์๊ณผ ํจ๊ป ์ ๊ณต๋ ๊ฒ ๊ฐ์ง๋ ์์ผ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ์ฌ๋ฌ ๋น์ฌ์๊ฐ ์ํธ ํธํ ๊ฐ๋ฅํ ํ ๊ตฌํ์ ์์ฑํ๋ ๋ฐ ์กฐ์ ํ ์ ์๋๋ก ์ ์ ์ธํฐํ์ด์ค๊ฐ ์ค์ ๋ก ํ์ํ๋ค๋ ์๊ฐ์ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ณด์
๋๋ค.
๋ํ ์ธํฐํ์ด์ค๊ฐ ์ถ์๋๋ฉด ํธํ์ฑ์ผ๋ก ์ธํด ์ ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ์ธํฐํ์ด์ค๊ฐ ๊ธฐ๋ฅ ์ธก๋ฉด์์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ณด๋ค ๋ค์ฒ์ง๋ ๊ฒฝํฅ์ด ์์์ ์๋ฏธํฉ๋๋ค(์ค๋๋ IList ๋ฐ IDictionary์ ๋ฌธ์ ). ๋ฐ๋๋ก Heap ํด๋์ค๊ฐ ์ถ์๋๊ณ IHeap ์ธํฐํ์ด์ค์ ๋ํ ์ฌ๊ฐํ ์๊ตฌ๊ฐ ์์๋ค๋ฉด ๋ฌธ์ ์์ด ์ธํฐํ์ด์ค๋ฅผ ๋ผ์ธ์ ์ถ๊ฐํ ์ ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@madelson ํ๋ ์์ํฌ๊ฐ ํ์ ๋จ์ผ ๊ตฌํ ์ด์์ ์ ๊ณตํ ํ์๊ฐ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๋ก ํด๋น ๊ตฌํ์ ์ง์ํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ตฌํ์ ๊ด์ฌ์ด ์๋ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ตฌํ(์์ฒด ์์ฑ ๋๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์)์ผ๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ผ๋ฉฐ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ์ฝ๋์ ์ฌ์ ํ ํธํ๋ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ์ฝ๋ฉ์ ๋ํ ๋ถ์ ์ ์ธ ์ ์ ์ค์ ๋ก ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ ๊ฒฝ์ฐ์ง ์๋ ์ฌ๋์ ๋ฌด์ํ๊ณ ๋ฐ๋ก ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ํ๋ฉด ๋๋ค. ๋๋ณด๋ ์ฌ๋๋ค์ ์์ ์ด ์ ํํ ๋ชจ๋ ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ํ๋ ์ ํ์ ๋๋ค.
@pgolebiowski๊ฐ ๋ฌผ์๋๋ ์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ด ์์ต๋๋ค(๋ช๋ช ์๊ฒฌ์ ํ์ธํ ํ ๋ค๋ฅธ API ๊ฒํ ์/๊ฑด์ถ๊ฐ๊ฐ ์ด๋ฅผ ๊ณต์ ํ ๊ฒ์ด๋ผ๊ณ ์ด๋ ์ ๋ ํ์ ํฉ๋๋ค).
์ด๋ฆ์ PriorityQueue
์ด์ด์ผ ํ๋ฉฐ IHeap
์ธํฐํ์ด์ค๋ฅผ ๋์
ํด์๋ ์ ๋ฉ๋๋ค. ์ ํํ ํ๋์ ๊ตฌํ์ด ์์ด์ผ ํฉ๋๋ค(์ผ๋ถ ํ์ ํตํด).
IHeap
์ธํฐํ์ด์ค๋ ๋งค์ฐ ๊ณ ๊ธ ์ ๋ฌธ๊ฐ ์๋๋ฆฌ์ค์
๋๋ค. PowerCollections ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ต์ข
์์ฑ ์์ ) ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ IHeap
์ธํฐํ์ด์ค๊ฐ ์ ๋ง ์ ๋ช
ํด์ง๋ฉด ๋์ค์ ๋ง์์ ๋ฐ๊ฟ ์์์ ๋ฐ๋ผ IHeap
๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง(์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ํตํด) ์ ์ฉ/์ ๋ ฌ๋์ง๋ ์์ต๋๋ค. BCL์ ๋๋จธ์ง ๋ถ๋ถ์ ์ง๊ธ ์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๋ณต์ก์ฑ์ ์ ๋นํํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ๋จ์ํ๊ฒ ์์ํ์ฌ ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ณต์กํ๊ฒ ํ์ฅํ์ญ์์ค.
... ๋ด 2(๊ฐ์ธ) ์ผํธ
์๊ฒฌ์ ์ฐจ์ด๋ฅผ ๊ฐ์ํ ๋ ์ ์์ ์ง์ ์ํค๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ํฉ๋๋ค(์ด๋ฒ ์ฃผ ์ด์ @ianhays์ ์ ์ํ๊ณ ๋ฐ๋ผ์ ๊ฐ์ ์ ์ผ๋ก @safern์ ์ ์ํ์ต๋๋ค).
... ๋ด ์๊ฒฌ(๊ทํ๊ฐ ์์ฒญํ)์ ๋ํด ์์ ํ ํฌ๋ช ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋๋ดํ๊ฑฐ๋ ๋ฏธ๋ฃจ์ง ๋ง์ญ์์ค. API ์ ์์ด ์ด๋ป๊ฒ ์งํ๋๋์ง ๋ด ์๋ค.
@karelz
์ด๋ฆ์
PriorityQueue
์ฌ์ผ ํฉ๋๋ค.
์ด๋ค ์ฃผ์ฅ? ๊ทธ๋ฅ ์๋์ค ๋ผ๊ณ ๋งํ๋ ๋์ ์์ ๋ด๊ฐ ์ด ๊ฒ์ ํด๊ฒฐํด ์ฃผ์๋ฉด ์ ์ด๋ ์ข์ ๊ฒ์ ๋๋ค .
์ด์ ์ ์ด๋ฆ์ ๊ฝค ์ ์ง์๋ค๊ณ ์๊ฐํฉ๋๋ค. _์ ๋ ฅ์ด ์์ผ๋ฉด ์ ๊ณตํ๊ณ ๋ฐ์ดํฐ์ ์ฆ๊ฑฐ๋ก ๋ท๋ฐ์นจํ์ญ์์ค. ๋ํ ๋ค๋ฅธ ์ฌ๋์ ์ฃผ์ฅ์ ๋ฃ๊ณ ์ธ์ ํ์ญ์์ค. ๋น์ ์ด ๋์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋์ ์๊ฒฌ์ ๋ฐ๋ํ๋ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ์ญ์์ค._
๊ฒ๋ค๊ฐ, ๊ทธ๊ฒ์ ๋จ์ง ์ด๋ฆ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค . ๊ทธ๋ ๊ฒ ์์ง ์์ต๋๋ค. ์ ๊ฐ ์ด ๊ธ์ ์ฝ์ด์ฃผ์ธ์. ์ถ์ํ ์์ค ์ฌ์ด์์ ์์ ํ๊ณ ๊ทธ ์์ ์ฝ๋๋ฅผ ํฅ์/๊ตฌ์ถํ ์ ์๋ ๊ฒ์ ๋๋ค.
์, ์ด ํ ๋ก ์์ ๋ ผ์์ด ์์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ค๊ธ ๊ฐ๋ฐ์๊ฐ (์ฌํ๊ฒ๋) "ํ"์ ๋ณด๊ณ "์ผ๋ฐํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ" ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ(์: ํ ๋ฐ ์คํ)์ผ๋ก ํผ๋ํ ๊ฒ์ ๋๋ค. [...] ๊ทธ๋ค์ ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ์ ํ ๋นํ ์ ์๋์ง ๊ถ๊ธํด ํ ๊ฒ์ ๋๋ค.
๐
์ฐ๋ฆฌ๋
IHeap
์ธํฐํ์ด์ค๋ฅผ ๋์ ํด์๋ ์๋ฉ๋๋ค.IHeap
์ธํฐํ์ด์ค๋ ๋งค์ฐ ๊ณ ๊ธ ์ ๋ฌธ๊ฐ ์๋๋ฆฌ์ค์ ๋๋ค. PowerCollections ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@bendono ๊ฐ ์ด์ ๋ํด ์์ฃผ ์ข์ ๋๊ธ์ ์์ฑํ์ต๋๋ค. @safern ์ ๋ํ ์ธํฐํ์ด์ค๋ก ๊ตฌํ์ ์ง์ํ๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ๋.
๋ ๋ค๋ฅธ ์ฐธ๊ณ ์ฌํญ -- ์ธํฐํ์ด์ค๋ฅผ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ํ๋ ๊ฒ์ ์์ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ป๊ฒ ๊ฐ๋ฐ์๋ ์๋ง๋ ๊ทธ ์ธํฐํ์ด์ค์ ๋ํ ์์ ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฐ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์๊น? ๊ทธ๋ค์ ์ฐ๋ฆฌ์ ๋น ์ธํฐํ์ด์ค ๊ธฐ๋ฅ์ ๊ณ ์ํ๊ฑฐ๋ ์์ ํ ๋ฌด์ํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ์ต์ ์ ์์ผ๋ฉฐ ์ํธ ๋ฐฐํ์ ์ ๋๋ค. ๋ค์ ๋งํด, ์ฐ๋ฆฌ ์๋ฃจ์ ์ ์ ํ ํ์ฅํ ์ ์์ด ์ฌ๋๋ค ์ด ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํ ์ํคํ ์ฒ ์ฝ์ด์ ์์กดํ๋ ๋์ ๋นํ์ฑํ๋ ์๋ฃจ์ ์ด๋ ์ผ๋ถ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ด Java์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฌ ์๋ฃจ์ ์ ์๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ค์, ๋น์ ์ ์ด๊ฒ์ ๋ํด ํ๋ฅญํ๊ฒ ์ธ๊ธํ์ต๋๋ค. ์๋ฌด๋ ๊นจ์ง API๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค.
์๊ฒฌ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์์ ์งํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ํฉ๋๋ค. [...] 2๊ฐ์ ๋์์ ์ ์ํฉ๋๋ค [...] API ๊ฒํ ์ ๊ฐ์ ธ์ค๊ณ ๊ฑฐ๊ธฐ์์ ๋ ผ์ํ๊ณ ๊ฒฐ์ ์ ๋ด๋ฆฌ์. ํด๋น ๊ทธ๋ฃน์์ Heaps ์ ์์ ํฌํํ๋ ์ฌ๋์ด ํ ๋ช ์ด๋ผ๋ ์๋ค๋ฉด ๊ธฐ๊บผ์ด ์ ๊ด์ ์ ์ฌ๊ณ ํ๊ฒ ์ต๋๋ค.
์์์ API์ ๋ค์ํ ๋ถ๋ถ์ ๋ํด ๋ง์ ๋ ผ์๊ฐ ์์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
PriorityQueue
๋ Heap
๋น์ ์ด ์๊ฐํ๋ ์ฌ๋๋ค ์ด ์ด ํ ๋ก ์ ์ฐธ์ฌํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ ๋ค์ ์์ํด์ผ ํฉ๋๊น?
ํ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ค๊ธ ๊ฐ๋ฐ์๊ฐ (์ฌํ๊ฒ๋) "ํ"์ ๋ณด๊ณ "์ผ๋ฐํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ" ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ(์: ํ ๋ฐ ์คํ)์ผ๋ก ํผ๋ํ ๊ฒ์ ๋๋ค.
๊ทธ๋, ๋์ผ. ์ ๋ ํ๋ก๊ทธ๋๋ฐ์ ๋
ํ์ผ๋ก ๋ฐฐ์ ๊ธฐ ๋๋ฌธ์ " Heap
"์ด(๊ฐ) ํ ๋ก ์ ๋ค์ด๊ฐ์ ๋ ๋ฌด์จ ๋ง์ ํ๋์ง ๋ชจ๋ฆ
๋๋ค. ๋งํ ๊ฒ๋ ์์ด ์ปฌ๋ ์
์ ๊ด์ ์์ "์ฌ๋ฌผ ๋๋ฏธ"๊ฐ ๋ชจ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ๋์ง ์์ ๊ฒ์ ๋ ์ง๊ด์ ์ผ๋ก ์์ํ ๊ฒ์
๋๋ค.
์ ๋ง ์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ณ ์๋ค๋๊ฒ ๋ฏฟ๊ธฐ์ง ์์ต๋๋ค...
์ด๋ค ์ฃผ์ฅ? ๊ทธ๋ฅ ์๋์ค๋ผ๊ณ ๋งํ๋ ๋์ ์์ ๋ด๊ฐ ์ด ๊ฒ์ ํด๊ฒฐํ๋ค๋ฉด ์ ์ด๋ ์ข์ ๊ฒ์ ๋๋ค.
๋ด ๋๋ต์ ์ฝ์ผ๋ฉด ๋ด ์ ์ฅ์ ๋ํ ์ฃผ์ ์ฃผ์ฅ์ ์ธ๊ธํ์์ ์ ์ ์์ต๋๋ค.
์ค๋ ๋์์ IMO์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋ ๋์ผํ ์ธ์์ ๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ ์์ฝํ์ ๋ฟ์ด๋ค.
. ์ ๊ฐ ์ด ๊ธ์ ์ฝ์ด์ฃผ์ธ์.
์ด ์ค๋ ๋๋ฅผ ํญ์ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ต๋๋ค. ๋๋ ๋ชจ๋ ์ฃผ์ฅ๊ณผ ์์ ์ ์ฝ์์ต๋๋ค. ์ด๊ฒ์ ๊ทํ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ชจ๋ ์์ ์ ์ฝ๊ณ ์ดํดํ์์๋ ๋ถ๊ตฌํ๊ณ ์์ฝ๋ ์๊ฒฌ์
๋๋ค.
๋น์ ์ ๋ถ๋ช
ํ ๊ทธ ์ฃผ์ ์ ๋ํด ์ด์ ์ ์
๋๋ค. ๊ทธ๊ฑฐ ์ข๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ ์์ชฝ์์ ๋น์ทํ ์ฃผ์ฅ์ ๋ฐ๋ณตํ ๋ ์
์ฅ์ด ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ์ด์ ์งํ๋์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ ๊ฐ 2๊ฐ์ ์ ์์ ์ถ์ฒํ๊ณ ๋ ํฐ ๊ฒฝํ ๊ทธ๋ฃน์์ ๋ ๋ง์ ํผ๋๋ฐฑ์ ๋ฐ๋ ์ด์ ์
๋๋ค. BCL API ๋ฆฌ๋ทฐ์ด(BTW: ์ ๋ ์์ง ๊ฒฝํ์ด ํ๋ถํ API ๋ฆฌ๋ทฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค).
๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ํด๋น ์ธํฐํ์ด์ค์ ๋ํด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฐ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๊น?
IHeap
๊ณ ๊ธ ์๋๋ฆฌ์ค์ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์ฐธ์กฐํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด, ์ธ๊ธฐ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋ช
๋๋ฉด ๋์ค์ CoreFX๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์ข์ ์์์ IHeap
๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์ด ์์ ํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก PriorityQueue
์ ํ๋์ ์์ฑ์ ์ค๋ฒ๋ก๋๋ง ์ถ๊ฐํฉ๋๋ค.
๋ค, ๊ทํ์ ๊ด์ ์์ ์ด์์ ์ด์ง๋ ์์ง๋ง, ๊ทํ๊ฐ ๋ฏธ๋์ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ํ์ ์ ๋ฐฉํดํ์ง๋ ์์ต๋๋ค. ํฉ๋ฆฌ์ ์ธ ์ค๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋น์ ์ด ์๊ฐํ๋ ์ฌ๋๋ค์ด ์ด ํ ๋ก ์ ์ฐธ์ฌํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
API ๊ฒํ ๋ ํ๋ฐํ ํ ๋ก , ๋ธ๋ ์ธ์คํ ๋ฐ, ๋ชจ๋ ๊ฐ๋์ ๊ฐ์ค์น ๋ถ์ฌ๊ฐ ์๋ ํ์์
๋๋ค. ๋ง์ ๊ฒฝ์ฐ GitHub ๋ฌธ์ ์ ๋ํด ์๋ค๋ก ๋
ผ์ํ๋ ๊ฒ๋ณด๋ค ๋ ์์ฐ์ /ํจ์จ์ ์
๋๋ค. dotnet/corefx#14354 ๋ฐ ๊ทธ ์ด์ ๋ฒ์ ์ธ dotnet/corefx#8034๋ฅผ ์ฐธ์กฐํ์ธ์. ๋๋ฌด ๊ธด ํ ๋ก , ์ถ์ ํ๊ธฐ ์ด๋ ค์ด ์์ฒญ๋ ์กฐ์ ์ ๋ํ ์ฌ๋ฌ ๋ค๋ฅธ ์๊ฒฌ, ๊ฒฐ๋ก ์ด ์์ต๋๋ค. ํ๋ฅญํ ํ ๋ก , ๋ํ ๊ฝค ๋ง์ ์ฌ๋๋ค์ ์ฌ์ํ์ง ์์ ๋ญ๋น ์๊ฐ, ์ฐ๋ฆฌ๊ฐ ์์์ ๊ทธ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ํฉ์์ ์ด๋ฅผ ๋๊น์ง.
API ๊ฒํ ์๊ฐ ๋ชจ๋ ๋จ์ผ API ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ๋๋ก ํ๊ฑฐ๋ ์๋ค์ค๋ฌ์ด ๋ฌธ์ ๋ง ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์ ํ์ฅ๋์ง ์์ต๋๋ค.
์ ๋ค์ ์์ํด์ผ ํฉ๋๊น?
์ฐ๋ฆฌ๋ ๋ค์ ์์ํ์ง ์์ ๊ฒ์
๋๋ค. ์ ๊ทธ๋ ๊ฒ ์๊ฐํ ๊น์?
๋ค์ API ๋ฆฌ๋ทฐ ๋ ๋ฒจ๋ก ๊ฐ์ฅ ์ธ๊ธฐ ์๋ 2๊ฐ ์ ์์ ์ฐฌ๋ฐ ์๋ก ์ผ๋ก ๋ณด๋ด ์ฒซ ๋ฒ์งธ ๋ ๋ฒจ(์์ญ ์์ ์ ๋ ๋ฒจ)์์ API ๊ฒํ ๋ฅผ ์๋ฃํฉ๋๋ค.
๊ณ์ธต์ ์น์ธ/๊ฒํ ๋ฐฉ์์
๋๋ค. ๋น์ฆ๋์ค ๊ฒํ ์ ์ ์ฌํฉ๋๋ค. ์์ฌ ๊ฒฐ์ ๊ถํ์ด ์๋ VP/CEO๋ ํ์ฌ์ ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํ ๋ชจ๋ ํ ๋ก ์ ๊ฐ๋
ํ์ง ์์ผ๋ฉฐ ํ/๋ณด๊ณ ์์ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๊ณ ์ ์ผ์ฑ์ด ์๋ ๊ฒฐ์ ์ ๋ํ ์ ์์ ๊ฐ์ ธ์ ์ถ๊ฐ ํ ๋ก ์ ํ๋๋ก ์์ฒญํฉ๋๋ค. ํ/๋ณด๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์์ฝํ๊ณ ๋์ ์๋ฃจ์
์ ์ฅ๋จ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
์์ง ์ด ์ค๋ ๋์์ ์ธ๊ธ๋์ง ์์ ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ ์ฅ๋จ์ ์ด ์๋ ์ต์ข
2๊ฐ์ ์ ์์ ์ ์ํ ์ค๋น๊ฐ ๋์ง ์์๋ค๊ณ ์๊ฐํ์ ๋ค๋ฉด ๋ค์ ์๊ฐ์ ๊ฒํ ํ ์ต๊ณ ํ๋ณด์๊ฐ ๋ช ๋ช
๋จ์ ๋๊น์ง ๊ณ์ ๋
ผ์ํฉ์๋ค. API ๊ฒํ ์์ค.
๋ด๊ฐ ๋งํด์ผ ํ ๋ชจ๋ ๊ฒ์ ๋งํ๋ค๋ ๋๋์ ๋ฐ์์ต๋๋ค.
๋ง๋ ๋ง์ด๋ค?
์ด๋ฆ์
PriorityQueue
์ฌ์ผ ํฉ๋๋ค.์ด๋ค ์ฃผ์ฅ?
๋ด ๋๋ต์ ์ฝ์ผ๋ฉด ๋ด ์ ์ฅ์ ๋ํ ํต์ฌ ์ฃผ์ฅ์ ์ธ๊ธํ์์ ์ ์ ์์ต๋๋ค.
์ด๋ฐ... ๋ด๊ฐ ์ธ์ฉํ ๊ฒ์ ์ธ๊ธํ๊ณ ์์์ต๋๋ค. ( ๋ถ๋ช ํ ) -- ๋น์ ์ ํ ๋์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ๊ทํ์ ๋ต๋ณ์ ์ฝ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ด์ ๋ํ ์ฃผ์ฅ์ ์ ํํ 0%๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ด ์ค๋ ๋๋ฅผ ํญ์ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ต๋๋ค. ๋๋ ๋ชจ๋ ์ฃผ์ฅ๊ณผ ์์ ์ ์ฝ์์ต๋๋ค. ์ด๊ฒ์ ๊ทํ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ชจ๋ ์์ ์ ์ฝ๊ณ ์ดํดํ์์๋ ๋ถ๊ตฌํ๊ณ ์์ฝ๋ ์๊ฒฌ์ ๋๋ค.
๋น์ ์ ์๊ณก์ ์ ์ข์ํฉ๋๋ค, ๋๋ ์ ์ ๊ทธ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ๋น์ ์ ๋จ์ง ํฌ์ธํธ์ ์กด์ฌ๋ฅผ ์ธ์ ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ํด๋น ์ธํฐํ์ด์ค์ ๋ํด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฐ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๊น?
IHeap ๊ณ ๊ธ ์๋๋ฆฌ์ค์ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์ฐธ์กฐํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด, ์ธ๊ธฐ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋ช ๋๋ฉด ๋์ค์ CoreFX๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋น์ ์ ๋น์ ์ด ์์ ๊ฒฐ๊ณผ ๋ก ๋ด๊ฐ ์ ์ํ ๋ฌธ์ ๋ฅผ ์ ํ ๋ค๋ฃจ์ง ์๊ณ ์ฌ๊ธฐ์ ๋ด ๋ง์ ๋ฐ๋ณตํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น? ๋๋ ์ผ๋ค:
๊ทธ๋ค์ ์ฐ๋ฆฌ์ ๋น ์ธํฐํ์ด์ค ๊ธฐ๋ฅ์ ๊ณ ์ํ๊ฑฐ๋ ์์ ํ ๋ฌด์ํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ์ต์ ์ ์์ผ๋ฉฐ ์ํธ ๋ฐฐํ์ ์ ๋๋ค.
๋๋ ๋น์ ์ ์ํด ์ด๊ฒ์ ๋งค์ฐ ๋ช ํํ๊ฒ ํ ๊ฒ์ ๋๋ค. ๋ ๊ฐ์ ๋ถ๋ฆฌ๋ ๊ทธ๋ฃน์ ์ฌ๋๋ค์ด ์์ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด, ๊ทธ๊ฒ๋ค์ด ๋ถ๋ฆฌ๋ ์ฌ๋๋ค์ ๊ทธ๋ฃน์ด๋ผ๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๊ณตํต ์ํคํ ์ฒ ์ฝ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฒ ์ด์ค๊ฐ ํธํ๋์ง ์์ต๋๋ค _. ๋์ค์ ์ทจ์ํ ์ ์์ต๋๋ค.
์ข์ ์์์ ๋์ค์ IHeap์ ์ถ๊ฐํ๋ ๊ฒ์ด ์์ ํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก PriorityQueue์ ํ๋์ ์์ฑ์ ์ค๋ฒ๋ก๋๋ง ์ถ๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ ์ง์ฆ๋๋์ง ์ด๋ฏธ ์ผ์ต๋๋ค: ์ด ํฌ์คํธ๋ฅผ ๋ณด์ธ์.
๋น์ ์ด ์๊ฐํ๋ ์ฌ๋๋ค์ด ์ด ํ ๋ก ์ ์ฐธ์ฌํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
API ๊ฒํ ์๊ฐ ๋ชจ๋ ๋จ์ผ API ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ๋๋ก ํ๊ฑฐ๋ ์๋ค์ค๋ฌ์ด ๋ฌธ์ ๋ง ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์ ํ์ฅ๋์ง ์์ต๋๋ค.
์, API ๊ฒํ ์๊ฐ ๋ชจ๋ ๋จ์ผ API ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์๋ ์ด์ ๋ฅผ ๋ฌป๊ณ ์์์ต๋๋ค. ์ ํํ๊ฒ, ๋น์ ์ ์ค์ ๋ก ๊ทธ์ ๋ฐ๋ผ ์๋ตํ์ต๋๋ค.
๋ง๋ ๋ง์ด๋ค?
์๋์. ์ ๋ ์ด ํ ๋ก ์ด ์ ๋ง ์ง๊ฒน์ต๋๋ค. ์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๋ ๊ทธ๊ฒ์ด ์ฌ๋ฌ๋ถ์ ์ผ์ด๊ณ ์ฌ๋ฌ๋ถ์ด ์ง์๋ฅผ ๋ฐ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ช ํ ์ฐธ์ฌํ๊ณ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๋ ํญ์ ์๋ด๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๋งค์ฐ ํผ๊ณคํฉ๋๋ค. ๋น์ ์ ๋์๊ฒ ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ด ๋ด๋ถ์ ์ผ๋ก ํ์ผ๋ก ๊ตฌํ๋์ด์ผ ํ๋์ง, ๋ถ๋ช ํ ์ปดํจํฐ ๊ณผํ ๋ฐฐ๊ฒฝ ์ง์์ด ๋ถ์กฑํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํด๋ฌ๋ผ๊ณ ์์ฒญํ์ต๋๋ค. ์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๋ ํ์ด ์ค์ ๋ก ๋ฌด์์ธ์ง์กฐ์ฐจ ์ดํดํ์ง ๋ชปํ์ฌ ํ ๋ก ์ ๋์ฑ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์ ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ๋ฅผ ํ์ฉํ์ง ์๋ ๋นํ์ฑํ๋ PriorityQueue๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ฑด์ ํ OO ์ ๊ทผ์ ํ์ฉํ์ง ์๋ ๋์์ธ์ ์ฌ์ฉํ์ญ์์ค. ํ์ฅ์ ์์ฑํ ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฌ์ฉ์ ํ์ฉํ์ง ์๋ ์๋ฃจ์ ์ ์ฌ์ฉํ์ญ์์ค. ์๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์... ์ ๋ง ๋๋์ต๋๋ค.
ํ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ค๊ธ ๊ฐ๋ฐ์๊ฐ (์ฌํ๊ฒ๋) "ํ"์ ๋ณด๊ณ "์ผ๋ฐํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ" ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ(์: ํ ๋ฐ ์คํ)์ผ๋ก ํผ๋ํ ๊ฒ์ ๋๋ค.
๊ทํ์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก API๋ฅผ ์ ์ํ์ญ์์ค. ๊ถ๊ธํด.
์ ๋ง ์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ณ ์๋ค๋๊ฒ ๋ฏฟ๊ธฐ์ง ์์ต๋๋ค...
๊ธ์์, Heap
๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ๊ณผ ๋ค๋ฅธ ์ผ์ข
์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๋ ๊ฒ์ ๋ฐฐ์ฐ๊ธฐ ์ํด ์ ์ ํ ์ปดํจํฐ ๊ณผํ ๊ต์ก์ ๋ฐ์ ๊ธฐํ๊ฐ ์์๋ ๊ฒ์ ๋ํด ์ค๋กํฉ๋๋ค.
๊ทธ๋ฌ๋ ์์ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. ๋ฌด์ธ๊ฐ์ ํ์ ์ด๋ค ์ข
๋ฅ์ ์ฃผ๋ฌธ์ ๋ํด ์๋ฌด ๊ฒ๋ ์๋ฏธ Heap
๋ผ๋ ๊ฒ์ ๊ฒ์ํ์ง ์์ ๊ฒ์
๋๋ค. ๋ฐ๋ฉด์ PriorityQueue
๋ ์ ํํ ๊ทธ๋ ๊ฒ ํ๊ณ ์์์ ์๋ฒฝํ๊ฒ ์ ๋ฌํฉ๋๋ค.
์ง์ ๊ตฌํ์ผ๋ก? ๋ฌผ๋ก ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋ด ๊ด์ฌ์ฌ๊ฐ ์๋๋๋ค.
IHeap
์ถ์ํ? API์ ์ ์์ ๊ทธ๊ฒ์ ์ฌ์ฉ ์๋์ง ์์์ผ ํ CS ์ฃผ์ ์๋์ ๋ช
์ ๋ ํ ์ข์ ์ด์ ๊ฐ ์์ต๋๋ค ์์ต๋๋ค.
์๋๋ฅผ ์ ๋ํ๋ด์ง ์๊ณ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ์ ํํ๋ ๋น๋ฐ์ค๋ฌ์ด ์ด๋ฆ์ ์ง์ ํ์๊ฒ ์ต๋๊น? ๐
๊ธ์, ํ์ด ๋ฉ๋ชจ๋ฆฌ ํ๊ณผ ๋ค๋ฅธ ์ผ์ข ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๋ ๊ฒ์ ๋ฐฐ์ฐ๊ธฐ ์ํด ์ ์ ํ ์ปดํจํฐ ๊ณผํ ๊ต์ก์ ๋ฐ์ ๊ธฐํ๊ฐ ์์๋ ๊ฒ์ ๋ํด ์ค๋กํฉ๋๋ค.
์ด๊ฑด ๋ง๋ ์๋ผ. ๋์์ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ํ ๋ก ์ ์ฐธ์ฌํ๊ณ ์ถ์ต๋๋ค. ๋ง์น ํธ๋กค๋ง์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ฌด์ธ๊ฐ์ ํ์ ์ด๋ค ์ข ๋ฅ์ ์ฃผ๋ฌธ์ ๋ํด ์๋ฌด ๊ฒ๋ ์๋ฏธํ์ง ์์ต๋๋ค.
๋น์ ์ ์๋ชป. ํ์ผ๋ก ์ฃผ๋ฌธ๋ฉ๋๋ค. ๋น์ ์ด ๋งํฌ ํ ์ฌ์ง์์์ฒ๋ผ.
์ง์ ๊ตฌํ์ผ๋ก? ๋ฌผ๋ก ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋ด ๊ด์ฌ์ฌ๊ฐ ์๋๋๋ค.
๋๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ๋ํด ์ธ๊ธํ์ต๋๋ค. ํ ํจ๋ฐ๋ฆฌ๋ ๊ฑฐ๋ํ๋ฉฐ ๊ตฌํ ์์ ๋ ๊ฐ์ง ์์ค์ ์ถ์ํ๊ฐ ์์ต๋๋ค. ์ฐ์ ์์ ํ๋ ์ธ ๋ฒ์งธ ์ถ์ํ ๊ณ์ธต์ ๋๋ค.
๋์ค์ ๋ค์ด์ค๋ ์ผ๋ถ ์ธ์คํด์ค๊ฐ ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ์ฒ๋ฆฌํ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ ์ปฌ๋ ์ ์ด ํ์ํ ๊ฒฝ์ฐ ํ์ด๋ผ๊ณ ํ๋ ๊ฒ์ ๊ฒ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ฉด์ PriorityQueue๋ ์ ํํ ๊ทธ๋ ๊ฒ ํ๊ณ ์์์ ์๋ฒฝํ๊ฒ ์ ๋ฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฐ๊ฒฝ ์์ด ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ํ ๊ธฐ์ฌ๋ฅผ ์ ๊ณตํ๋๋ก Google์ ์์ฒญํ์๊ฒ ์ต๋๊น? ๊ธ์, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์๊ฒฌ์์ ์ด๋ ์ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋์ง ๋ ผ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋งค์ฐ ํ๋ฅญํ๊ฒ ๋งํ๋ฏ์ด :
์ ๋ณด๊ฐ ์์ผ๋ฉด ์ ๊ณตํ๊ณ ๋ฐ์ดํฐ์ ์ฆ๊ฑฐ๋ก ๋ท๋ฐ์นจํ์ญ์์ค. ๋น์ ์ด ๋์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋์ ์๊ฒฌ์ ๋ฐ๋ํ๋ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ์ ๋ฐ๋ฅด๋ฉด ๋น์ ์ ํ๋ ธ์ต๋๋ค.
์ฟผ๋ฆฌ | ์กฐํ์
:----: |:----:|
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "์ฐ์ ์์ ํ" | 172,000 |
| "๋ฐ์ดํฐ ๊ตฌ์กฐ" "ํ" | 430,000 |
๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํด ์ฝ๋ ๋์ ํ์ ์ ํ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ 3๋ฐฐ ๋ ๋์ต๋๋ค. ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ Swift, Go, Rust ๋ฐ Python ๊ฐ๋ฐ์์๊ฒ ์น์ํ ์ด๋ฆ์ ๋๋ค.
์ฟผ๋ฆฌ | ์กฐํ์
:----: |:----:|
| "golang" "์ฐ์ ์์ ํ" | 3.390 |
| "๋
น" "์ฐ์ ์์ ํ" | 8.630 |
| "์ ์ํ" "์ฐ์ ์์ ํ" | 18:600 |
| "ํ์ด์ฌ" "์ฐ์ ์์ ํ" | 72.800 |
| "๊ณจ๋" "ํ" | 79.000 |
| "๋
น" "ํ" | 492.000 |
| "์ ์ํ" "ํ" | 551.000 |
| "ํ์ด์ฌ" "ํ" | 555.000 |
์ค์ ๋ก ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ด์ ์ธ๊ธฐ์ ๋์ ๋์๊ธฐ ๋๋ฌธ์ C++์์๋ ์ ์ฌํฉ๋๋ค.
์๋๋ฅผ ์ ๋ํ๋ด์ง ์๊ณ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ์ ํํ๋ ๋น๋ฐ์ค๋ฌ์ด ์ด๋ฆ์ ์ง์ ํ์๊ฒ ์ต๋๊น? ๐
์๊ฒฌ์ด ์์ต๋๋ค. ๋ฐ์ดํฐ. ์ ์ฐธ์กฐ. ํนํ ๋ฐฐ๊ฒฝ์ด ์๋ ์ฌ๋์ ์๊ฒฌ์ ์์ต๋๋ค. ์ด์ ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํด ์ฝ์ง ์๊ณ ๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฒ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ๋ง์ ๋ฐ์ดํฐ ๊ตฌ์กฐ 101 ์์ ๋ค๋ฃจ์ด์ง๋๋ค.
์ปดํจํฐ ๊ณผํ์ ๊ธฐ์ด์ ๋๋ค. ์ด๊ธ์ ๋๋ค. ์ฌ๋ฌ ํ๊ธฐ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฒ์์ ํ์ด ๋ณด์ ๋๋ค.
ํ์ง๋ง ์ฌ์ ํ:
ํธ์ง: Google ํธ๋ ๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ ๋ค๋ฅธ ๋ ํ ๊ฐ๋ฐ์๋ก์ ์ ๋ _heap_์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํญ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ๊ฐ๋ฐ์๋ก์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์ฐ๊ณ ์ดํดํ๋ ์๊ฐ์ ๊ฐ์ก์ต๋๋ค. ์์ปจ๋, ๋๋ ๋ช ๋ช ๊ท์น์ด ์์ ์ด ์ํ ๋ถ์ผ์ ์ฌ์ ์ ์ดํดํ๋ ๋ฐ ์๊ฐ์ ๋ค์ด์ง ์์ ์ฌ๋๋ค์ ๋์์ผ๋ก ํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋์ํ์ง ์์ต๋๋ค.
๋ํ "์ด๋ฆ ์ PriorityQueue
API ์ด๋ฆ ์ง์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ๋ณด๋ค .NET ํ๋ซํผ ๋ด์์ ์ผ๊ด์ฑ์ ์ ํธํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด๋ API๊ฐ ์น์ํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ณด์ด๋๋ก ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋๋๋ก ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ์ ์ฌ์ฉํ ์ฉ์ด๋ผ๋ฉด ๊ทธ ์ด๋ฆ์ด 100% ์ ํํ์ง ์๋ค๋ ๊ฒ์ ์ธ์ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ๋ ๋ค์ํ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผํ ์ ์๋ ํ๋ซํผ์ ์ค๊ณํ๋ ๊ฒ์ ๋๋ค. ์ด๋ค ์ค ์ผ๋ถ๋ ์ปดํจํฐ ๊ณผํ์ ๋ํ ์ ์ ๊ต์ก์ ๋ฐ์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ .NET์ด ์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ์์ฐ์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๊ฒ์ผ๋ก ์ธ์๋๋ ์ด์ ์ค ์ผ๋ถ๋ ๋ถ๋ถ์ ์ผ๋ก๋ ํด๋น ๋์์ธ ํฌ์ธํธ ๋๋ฌธ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฆ์ด๋ ์ฉ์ด๊ฐ ์ผ๋ง๋ ์ ์๋ ค์ ธ ์๊ณ ํ๋ฆฝ๋์ด ์๋์ง ํ์ธํ ๋ "๊ฒ์ ์์ง ํ ์คํธ"๋ฅผ ์ฌ์ฉํฉ๋๋ค. @pgolebiowski ๊ฐ ์ํํ ์ฐ๊ตฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ์ง์ ์กฐ์ฌ๋ฅผ ํด๋ณด์ง๋ ์์์ง๋ง ๋ด ์ง๊ฐ์ ๋ฐ๋ฅด๋ฉด "ํ"์ ๋๋ฉ์ธ์ด ์๋ ๋ง์ ์ ๋ฌธ๊ฐ๋ค์ด ์ฐพ๋ ์ฉ์ด๊ฐ ์๋๋๋ค.
๋ฐ๋ผ์ PriorityQueue
๊ฐ ๋ ๋์ ์ ํ์ผ๋ก @karelz์ ์๊ฒฌ์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ธฐ์กด ๊ฐ๋
(๋๊ธฐ์ด)์ ๊ฒฐํฉํ๊ณ ์ํ๋ ๊ธฐ๋ฅ์ ํํํ๋ ๋นํ๊ธฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ทธ ์ด๋ฆ์ ํ๋ค๋ฆฌ์ง ์๊ณ ์ง์ฐฉํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ข
์ข
๊ณ ๊ฐ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ๊ธฐ์ ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
์ฌ๋๋ค์ ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ง ์๋ค๋ฉด ๊ทธ๊ฒ์ ์คํ ์์ค๋ก ๋ง๋ค๊ฑฐ๋ ์๊ตฌํ์ง ๋ง์ญ์์ค.
์๋ชป๋ ์ด๋ถ๋ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ํ๊ณ์ ๊ธฐ์ฌ์๋ค๋ก๋ถํฐ ํผ๋๋ฐฑ์ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋๋ค(๋น์ฐํ ๊ทธ๋ ๊ฒ ํฉ๋๋ค). ๊ทธ๋ฌ๋ ๋์์ ์ฐ๋ฆฌ๋ ๊ณ ๊ฐ ๊ธฐ๋ฐ์ด ๋งค์ฐ ๋ค์ํ๊ณ GitHub ๊ธฐ์ฌ์(๋๋ ์ฐ๋ฆฌ ํ์ ๊ฐ๋ฐ์)๊ฐ ํญ์ ๋ชจ๋ ๊ณ ๊ฐ์ ์ํ ์ต๊ณ ์ ๋๋ฆฌ์๊ฐ ์๋๋ผ๋ ์ ์ ์ธ์ํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์ฑ์ ์ด๋ ต๊ณ ํนํ ์ปฌ๋ ์ ๊ณผ ๊ฐ์ด ์ธ๊ธฐ ์๋ ์์ญ์์ .NET์ ์๋ก์ด ๊ฐ๋ ์ ์ถ๊ฐํ๋ ค๋ฉด ์ฝ๊ฐ์ ๋ฐ๋ณต์ด ํ์ํ ๊ฒ์ ๋๋ค.
@pgolebiowski :
๊ทํ์ ํต์ฐฐ๋ ฅ, ๋ฐ์ดํฐ ๋ฐ ์ ์์ ๋์ด ํ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋น์ ์ ๋ ผ์ฆ ์คํ์ผ์ ์ ๋ ๊ฐ์ฌํ์ง ์์ต๋๋ค. ์ด ์ค๋ ๋์ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์๋ฟ๋ง ์๋๋ผ ๋ด ํ ๊ตฌ์ฑ์ ๋ชจ๋์๊ฒ ๊ฐ์ธ์ ์ผ๋ก ๋ํ์ต๋๋ค. ๋น์ ์ด ์ฐ๋ฆฌ์ ๋์ํ์ง ์๋๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด "๊ทธ๋ฅ ์ฐ๋ฆฌ์ ์ผ"์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฌธ ์ง์์ด ์๊ฑฐ๋ ๊ด์ฌ์ด ์๋ค๊ณ ๋น๋ํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๋ฌธ์ ๊ทธ๋๋ก, ์ ์ธ๊ณ ์ด๋ ์ฐ๋ฆฌ๊ฐ์ด ์ผ์ํ๊ณ ์ถ์ด ๋๋ฌธ ๋ค ๊ฐ์กฑ๊ณผ ์น๊ตฌ๋ฅผ ๋ ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๊ทํ์ ๊ฐ์ ์๊ฒฌ์ ๋งค์ฐ ๋ถ๊ณตํํ ๋ฟ๋ง ์๋๋ผ ๋์์ธ์ ๋ฐ์ ์ํค๋ ๋ฐ์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
๊ทธ๋์ ์ ๊ฐ ํผ๋ถ๊ฐ ๋๊บผ์ด ํธ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ถ์ง๋ง ๊ทธ๋ฐ ํ๋์ ๋ณ๋ก ์ฉ๋ฉํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ ๋๋ฉ์ธ์ ์ด๋ฏธ ์ถฉ๋ถํ ๋ณต์กํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋๋ฆฝ ๋ฐ ์ ๋์ ์์ฌ ์ํต์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
์์๋ฅผ ์ง์ผ์ฃผ์ธ์. ์ด์ ์ ์ผ๋ก ์์ด๋์ด๋ฅผ ๋นํํ๋ ๊ฒ์ ๊ณต์ ํ ๊ฒ์์ด์ง๋ง ์ฌ๋๋ค์ ๊ณต๊ฒฉํ๋ ๊ฒ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ง์์ด ์ํ์ ๋ชจ๋ ๋ถ๋ค,
์ ์ ๊ฐํนํ ํ๋๋ก ์ฌ๋ฌ๋ถ์ ํ๋ณต์ง์๋ฅผ ๋ฎ์ถ๊ฒ ๋ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
@karelz
๊ธฐ์ ์ ์ธ ์ค์๋ฅผ ์ ์ง๋ฌ์ ์ค์ค๋ก๋ฅผ ๋ฐ๋ณด๋ก ๋ง๋ค์์ต๋๋ค. ๋๋ ์ฌ๊ณผํ๋ค. ๋ฐ์๋ค์ฌ์ก๋ค. ๊ทธ๋ฌ๋ ๋์ค์ ๋์๊ฒ ๋์ก๋ค. ๋ฉ์ง IMO๊ฐ ์๋๋๋ค.
์ ๊ฐ ์ด ๊ธ์ด ๋น์ ์ ๋ถ์พํ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค. ๋น์ ์ด ๋ฌ์ฌํ ๊ฒ์ฒ๋ผ ๊ทธ๋ ๊ฒ ๋์์ง ๋ ์์์ง๋ง -- ๋๋ ๋จ์ง ํผ๋ก๊ฐ์ ๋๋ผ๊ฒ ํ๋ ๋ง์ ์์ธ ์ค ํ๋๋ก ์ด๊ฒ์ ์ ๊ณตํ์ ๋ฟ์ ๋๋ค. ๋ ์ฌ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ๊ทธ๋๋ ๋ฏธ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ต๋๋ค. ๋๊ตฌ๋ ์ค์๋ฅผ ํฉ๋๋ค. ๊ด์ฐฎ์์. ๋๋, ์๋ฅผ ๋ค์ด ๋๋๋ก ๋์ทจ๋์ด.
๋๋ฅผ ๊ฐ์ฅ ์ฌ๋ก์ก์ ๊ฒ์ "๋น์ ์ ์ด๊ฒ์ ํ๋ผ๋ ๋ง์ ๋ค์์ ๋ฟ์ธ๋ฐ, ๋น์ ์ ๊ทธ๊ฒ์ ๋ฏฟ์ง ์์ต๋๋ค" - ์, ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ์ฃผ๋ง์๋ ๊ทธ๊ฒ์ ํ๋ ์ด์ ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ด์ฌํ ํ๋ ๋ชจ์ต์ ๋ณด๋ ๋๋ฌด ๊ณ ๋ง๊ณ ๊ฐ์ฌํฉ๋๋ค. ๋น์ ์ด 5/10 ์ด์ ํ์ ์ํด ์ผ๋ง๋ ํนํ ํ์ ํ๋์ง ๋๋ ๋์๊ฒ ๋ณด์๋ค.
@terrajobst
๋น์ ์ด ์ฐ๋ฆฌ์ ๋์ํ์ง ์๋๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด "๊ทธ๋ฅ ์ฐ๋ฆฌ์ ์ผ"์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฌธ ์ง์์ด ์๊ฑฐ๋ ๊ด์ฌ์ด ์๋ค๊ณ ๋น๋ํ ์ ์๋ ๊ฒ์ ์๋๋๋ค.
๊ทํ์ ๊ฐ์ ์๊ฒฌ์ ๋งค์ฐ ๋ถ๊ณตํํ๋ฉฐ ๋ํ ๋์์ธ์ ๋ฐ์ ์ํค๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
"๋๋ฅผ ํฅ์"๊ณ ์ถ์ ์ํ ์ฌ๋์ด ์์ผ๋ฉด ๋ถ๋ด์์ด ์ฃผ์ญ์์ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ํด๊ฒฐํ์ต๋๋ค. ๋ชจ๋๊ฐ ๊ทธ๊ฒ์์ ๋ญ๊ฐ๋ฅผ ๋ฐฐ์ ์ต๋๋ค. ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ํ๋ ์์ํฌ์ ํ์ง์ ๋ํด ๊ฑฑ์ ํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ ์ ๋์ ์ผ๋ก ํ๋ฅญํ๊ณ ์ ๊ฐ ๊ธฐ์ฌํ๊ณ ์ถ์ ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค. CoreFX์์ ๊ณ์ํด์ ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ฆ, ๋๋ ์๋ง๋ ๋ด์ผ ๊ทํ์ ์๋ก์ด ๊ธฐ์ ์ ๋ ฅ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
@pgolebiowski
์ธ์ ๊ฐ๋ ์ง์ ๋ง๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ์์งํ ๋ชจ๋ ๊ฒ์ ์จ๋ผ์ธ์ผ๋ก ํ๋ ๋์ ์ ์ผ๋ถ๋ ์ฑ๊ฒฉ์ด ๋๋๋ก ์์ชฝ์ ์๋ ์์ด ๋์ ๋ฐฉ์์ผ๋ก ์์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
CoreFX์์ ๊ณ์ํด์ ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ฆ, ๋๋ ์๋ง๋ ๋ด์ผ ๊ทํ์ ์๋ก์ด ๊ธฐ์ ์ ๋ ฅ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด๊ณณ์ ํฅ๋ฏธ๋ก์ด ๊ณต๊ฐ์ด๊ณ ์ฐ๋ฆฌ๊ฐ ํจ๊ป ํ ์ ์๋ ๋๋ผ์ด ์ผ๋ค์ด ๋ง์ด ์์ต๋๋ค :-)
@pgolebiowski ๋จผ์ ๋ต๋ณํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ๊ด์ฌ์ ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ณ ๋น์ ์ ๋ป์ด ์ข์ต๋๋ค(์ด๊ฒ์ ์ธ์์ ๋ชจ๋ ์ฌ๋/๊ฐ๋ฐ์๊ฐ ํ๊ธฐ๋ฅผ ๋น๋ฐ๋ฆฌ์ ๋ฐ๋ผ๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ๊ฐ๋ฑ์ ๋จ์ง ์คํด/์๋ชป๋ ์์ฌ์ํต์ผ ๋ฟ์
๋๋ค). ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ฅผ ์ ๋ง๋ก ํ๋ณตํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๊ฒ์ ์ ๋ฅผ ๊ณ์ ํฅ๋ถ์ํค๊ณ ํฅ๋ถ์ํต๋๋ค.
๋๋ ์ฐ๋ฆฌ์ ๊ด๊ณ๋ฅผ ๋ค์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋
ผ์๋ฅผ ๊ธฐ์ ๋ก ๋ค์ ๋์๊ฐ์ ์ด ์ค๋ ๋์์ ๋ชจ๋ ๋ฐฐ์ฐ๊ณ ์์ผ๋ก ์ ์ฌํ ์ํฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์๋๋ฐฉ์ด ํ๋ซํผ์ ๋ํ ์ต์ ์ ์ด์ต๋ง์ ์ผ๋์ ๋๊ณ ์๋ค๊ณ ๋ค์ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
BTW: ์ด๊ฒ์ ์ง๋ 9๊ฐ์ ๋์ CoreFX ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ๋ช ๊ฐ์ง ๋ ์ด๋ ค์ด ๋ง๋จ/ํ ๋ก ์ค ํ๋์ด๋ฉฐ, ๋ณด์๋ค์ํผ ์ฐ๋ฆฌ(๋๋ฅผ ํฌํจํ์ฌ)๋ ์ฌ์ ํ ์ด๋ฅผ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ๋ ์ด์ต์ด ๋๊ณ ์์ผ๋ก ๋ ๋์์ง ๊ฒ์ด๋ฉฐ ์ด์ ์ ์ธ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์ ๋ค์ํ ๊ด์ ์ ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค. ์๋ง๋ ๊ธฐ์ฌ ๋ฌธ์์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ํ์ฑํ ๊ฒ์
๋๋ค ...
๋์ ๊ฐํนํ ๋ ผํ์ ์ด ํ ๋ก ์ ๋นํจ์จ์ ์ธ ๊ฒฐ๊ณผ์์ต๋๋ค. ๋นํจ์จ = ๋ ผ์์ ํผ๋์ค๋ฌ์ด ๋ฐฉ์, ๋ฌธ์ ๊ฐ ํด๊ฒฐ/ํด๊ฒฐ๋์ง ์๊ณ ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ ๋์๊ฐ๋ => ์ง๋ฃจํจ.
๋น์ ์ ์ข์ ์ ์ดํดํ์ต๋๋ค! ํฅ๋ฏธ๋กญ๊ฒ๋ ๋น์ทํ ์ข์ ๊ฐ์ด ๊ฐ์ ์ด์ ๋ก ๋ฐ๋ํธ์๋ ์์์ต๋๋ค ๐ ... ์ธ์์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๊ฑฐ์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค. :).
๋ถํํ๋, ์ด๋ ค์ด ํ ๋ก ์ ์ค๊ณ ๊ฒฐ์ ์ ๋ด๋ฆด ๋ ์์
์ ์ผ๋ถ์
๋๋ค. ๋ง์ ์์
์
๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๊ณผ์ํ๊ฐํฉ๋๋ค. ํ์ํ ํต์ฌ ๊ธฐ์ ์ ๋ชจ๋ ์ฌ๋์ ๋ํ ์ธ๋ด์ฌ๊ณผ ์์ ์ ์๊ฒฌ์ ๋ฐ์ด๋๋ ๋ฅ๋ ฅ๊ณผ ๋ป๋๋ก ๋์ง ์๋๋ผ๋ ํฉ์๋ฅผ ์ด๋์ด๋ด๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ๋ฅ๋ ฅ์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 2๊ฐ์ ์ ์์ ๊ฐ๊ณ ๊ธฐ์ ํ ๋ก ์ API ๊ฒํ ์ ๊ทธ๋ฃน์ผ๋ก "์์ค์ปฌ๋ ์ด์
"ํ ๊ฒ์ ์ ์ํ์ต๋๋ค(์ฃผ๋ก ์ ๊ฐ ์ณ๋ค๋ ํ์ ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น๋ก ์ ๊ฐ ๋น๋ฐ๋ฆฌ์ ์ธ๊ณ์ ๋ค๋ฅธ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ํ๋ ๊ฒ์ฒ๋ผ ์ณ๊ธฐ๋ฅผ ํฌ๋งํ์ง๋ง ๐ ).
ํ ์ฃผ์ ์ ๋ํ ์๊ฒฌ์ ๊ฐ๊ณ ๊ฐ์ ์ค๋ ๋์ ๋ํ ํ ๋ก ์ CONSENSUS๋ก ์ด๋๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฐ ๊ด์ ์์ ๋น์ ๊ณผ ๋๋ ์ด ์ค๋ ๋์์ ๊ฐ์ฅ ๊ณตํต์ ์ ๋๋ค. ์ฐ๋ฆฌ ๋ ๋ค ์๊ฒฌ์ด ์์ง๋ง ๋ ๋ค ํ ๋ก ์ ์ข ๊ฒฐ ๋ฐ ๊ฒฐ์ ์ผ๋ก ์ด๋๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธด๋ฐํ ํ๋ ฅํฉ์๋ค.
๋์ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋๋ฅผ ๊ณต๊ฒฉํ๊ณ ์๋ค๊ณ ์๊ฐํ ๋๋ง๋ค, ์ฌ์
ํ๊ฑฐ๋, ๊ฒ์ผ๋ฅด๊ฑฐ๋, ๋๋ฅผ ์ข์ ์ํค๋ ๊ฒ์
๋๋ค. ๋๋ ๋จผ์ ๋ ์์ ๊ณผ ํน์ ์ฌ๋์๊ฒ ๋ฌป์ต๋๋ค. ์? ์ ๊ทธ๋ ๊ฒ ๋งํ์ด? ๋ฌด์จ ๋ป์ด์์ต๋๊น?
์ผ๋ฐ์ ์ผ๋ก ๋๊ธฐ์ ๋ํ ์ดํด/์ปค๋ฎค๋์ผ์ด์
๋ถ์กฑ์ ํ์์
๋๋ค. ๋๋ ์ค ์ฌ์ด๋ฅผ ๋๋ฌด ๋ง์ด ์ฝ๊ณ ๋ชจ์/๊ณ ๋ฐ/๋์ ์๋๊ฐ ์๋ ๊ณณ์์ ๋ณด๋ ์งํ.
์ด์ ๊ธฐ์ ์ ์ธ ์ง๋ฌธ์ ๋ํด ๊ณ์ ํ ๋ก ํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ์์ผ๋ฏ๋ก ์ด์ ์ ๋ฌป๊ณ ์ถ์๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ๋ฅผ ํ์ฉํ์ง ์๋ ๋นํ์ฑํ๋ PriorityQueue๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์
๋๋ค. IHeap
(๋ด / ์๋ ์ ์์์์)๋ฅผ ์๋ตํ๋ฉด ์ ๊ทธ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊น์?
IMO ํด๋์ค ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ ์ ์ ์ฌ์ด์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ -- PriorityQueue(IHeap)
์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ๋์ง ์ฌ๋ถ์
๋๋ค(ํด๋์ค ์ด๋ฆ ๋ถ์์ ํด๊ฒฐํด์ผ ํ ๋
๋ฆฝ์ ์ธ ๋ฌธ์ ๋ก ๋จ๊ฒจ๋ ) .
๋ฉด์ฑ ์กฐํญ(์คํด๋ฅผ ํผํ๊ธฐ ์ํด): ๊ธฐ์ฌ๋ฅผ ์ฝ๊ณ ์กฐ์ฌํ ์๊ฐ์ด ์์ต๋๋ค. ๊ธฐ์ ํ ๋ก ์ ์ฃผ๋ํ๊ณ ์ถ์ ์ฌ๋์ ์๋ฆฌ๋ฒ ์ดํฐ ํผ์น ์ฃผ์ฅ์ ์ ์ํ๋ ์งง์ ๋ต๋ณ์ ๊ธฐ๋ํฉ๋๋ค. ์ฐธ๊ณ : ๋ด๊ฐ ํธ๋กค๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ ์ด ์ฃผ์ฅ์ ํ๋ ํ์ ๋๊ตฌ์๊ฒ๋ ๊ฐ์ ์ง๋ฌธ์ ํ ๊ฒ์ ๋๋ค. ์ค๋ช ํ ํ์ด ์๊ฑฐ๋ ํ ๋ก ์ ์ฃผ๋ํ ํ์ด ์๋ค๋ฉด(๋น์ ์ธก์ ์ด๋ ค์๊ณผ ์๊ฐ ํฌ์๋ฅผ ๊ฐ์ํ ๋ ์์ ํ ์ดํดํ ์ ์์) ๊ทธ๋ฅ ๊ทธ๋ ๊ฒ ๋งํ์ญ์์ค. ํ๋ ๊ฐ์ ์ ์์ต๋๋ค. ์ ๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ์๋ฐ๊ฐ์ ๋๋ผ์ง ๋ง์ญ์์ค. ์ด๋ ํด๋น ์ค๋ ๋์ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ์ฉ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ถํ์ํ ์ค๋ช ์ ํ๋ ๋ ์ถ๊ฐํ๋ ค๊ณ ํ์ง ์์ต๋๋ค. ์ด ์ค๋ ๋๋ ๋๋ฌด ๊ธธ์์ต๋๋ค. ์ธํฐ๋ท ์๋์ ์ 1์์น์ ์ธ๊ฐ๊ด๊ณ๋ฅผ ์ค์ํ๋ค๋ฉด ๋ฌธ์๋ฅผ ํผํ๋ ๊ฒ์ ๋๋ค. (๊ธ์, ๋๋ ๊ทธ๊ฒ์ ๋ง๋ค์์ต๋๋ค). ๋ค๋ฅธ ์คํ ์์ค ์ปค๋ฎค๋ํฐ์์ ์ด๋ฌํ ์ข ๋ฅ์ ํ ๋ก ์ด ํ์ํ๋ค๋ฉด Google ํ์์์ผ๋ก ์ ํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ์ผ๊ตด์ ๋ณผ ๋ "๋ชจ์"ํ๋ ๋ง์ ์ ๋ ํ์ง ์์ผ๋ฉฐ, ์ฌ๋๋ค์ ์๋ก๋ฅผ ๋งค์ฐ ๋นจ๋ฆฌ ์นํด์ง๋๋ค. ์ฐ๋ฆฌ๋ ์๋ํด ๋ณผ ์ ์์ง ์์๊น์?
@karelz ์์ ๋ ผ์๊ฐ
๊ทธ๊ฒ์ด ์๋ฏธ๊ฐ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
์์ ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ๋ฅผ ํ์ฉํ์ง ์๋ PriorityQueue์ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ด ์๋ ์๋ ์ ์์ ๊ดํ ๊ฒ์ด์์ต๋๋ค. ๋ช ํํ ํ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค.
์ค๋ช ํ ํ์ด ์๊ฑฐ๋ ํ ๋ก ์ ์ฃผ๋ํ ํ์ด ์๋ค๋ฉด(๋น์ ์ธก์ ์ด๋ ค์๊ณผ ์๊ฐ ํฌ์๋ฅผ ๊ฐ์ํ ๋ ์์ ํ ์ดํดํ ์ ์์) ๊ทธ๋ฅ ๊ทธ๋ ๊ฒ ๋งํ์ญ์์ค. ํ๋ ๊ฐ์ ์ ์์ต๋๋ค. ์ ๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ์๋ฐ๊ฐ์ ๋๋ผ์ง ๋ง์ญ์์ค. ์ด๋ ํด๋น ์ค๋ ๋์ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ์ฉ๋ฉ๋๋ค.
๋๋ ํฌ๊ธฐํ์ง ์์ ๊ฒ์ด๋ค. ๊ณ ํต ์์ ์ด๋ ์์ xD
@xied75
๋ค๋ฅธ ์คํ ์์ค ์ปค๋ฎค๋ํฐ์์ ์ด๋ฌํ ์ข ๋ฅ์ ํ ๋ก ์ด ํ์ํ๋ค๋ฉด Google ํ์์์ผ๋ก ์ ํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ํด ๋ณผ ์ ์์ง ์์๊น์?
์ข์๋ณด์ด๋ค์ ;)
Heap
/ IHeap
๋๋ PriorityQueue
/ IPriorityQueue
(๋๋ ๋ค๋ฅธ ๊ฒ)๋ฅผ ์ฌ์ฉํ๋ ์๊ด์์ด ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ค๋ ๊ธฐ๋ฅ์ ๋ํด...
_๊ตฌํ๊ณผ ํจ๊ป ์ธํฐํ์ด์ค๋ฅผ ์ํ์ญ๋๊น?_
@๋ฒค๋๋ ธ
์ธํฐํ์ด์ค๋ก ํด๋น ๊ตฌํ์ ์ง์ํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ตฌํ์ ๊ด์ฌ์ด ์๋ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ตฌํ(์์ฒด ์์ฑ ๋๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์)์ผ๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ผ๋ฉฐ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ์ฝ๋์ ์ฌ์ ํ ํธํ๋ ์ ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์ง ์๋ ์ฌ๋์ ๋ฌด์ํ๊ณ ๋ฐ๋ก ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ํ๋ฉด ๋๋ค. ๋๋ณด๋ ์ฌ๋๋ค์ ์์ ์ด ์ ํํ ๋ชจ๋ ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@madelson
์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ด๋ก ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์์ํฌ๊ฐ ๋ ์ด์๊ณผ ํจ๊ป ์ ๊ณต๋ ๊ฒ ๊ฐ์ง๋ ์์ผ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ์ฌ๋ฌ ๋น์ฌ์๊ฐ ์ํธ ํธํ ๊ฐ๋ฅํ ํ ๊ตฌํ์ ์์ฑํ๋ ๋ฐ ์กฐ์ ํ ์ ์๋๋ก ์ ์ ์ธํฐํ์ด์ค๊ฐ ์ค์ ๋ก ํ์ํ๋ค๋ ์๊ฐ์ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ณด์ ๋๋ค.
๋ํ ์ธํฐํ์ด์ค๊ฐ ์ถ์๋๋ฉด ํธํ์ฑ์ผ๋ก ์ธํด ์ ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ์ธํฐํ์ด์ค๊ฐ ๊ธฐ๋ฅ ์ธก๋ฉด์์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ณด๋ค ๋ค์ฒ์ง๋ ๊ฒฝํฅ์ด ์์์ ์๋ฏธํฉ๋๋ค(์ค๋๋ IList ๋ฐ IDictionary์ ๋ฌธ์ ).
@karelz
์ธํฐํ์ด์ค๋ ๋งค์ฐ ๊ณ ๊ธ ์ ๋ฌธ๊ฐ ์๋๋ฆฌ์ค์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์
IHeap
์ธํฐํ์ด์ค๊ฐ ์ ๋ง ์ ๋ช ํด์ง๋ฉด ๋์ค์ ๋ง์์ ๋ฐ๊ฟ์ ์์์ ๋ฐ๋ผIHeap
๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง(์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ํตํด) ์ ์ฉ/์ ๋ ฌ๋์ง๋ ์์ต๋๋ค. BCL์ ๋๋จธ์ง ๋ถ๋ถ์ ์ง๊ธ ์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๋ณต์ก์ฑ์ ์ ๋นํํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ๋จ์ํ๊ฒ ์์ํ์ฌ ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ณต์กํ๊ฒ ํ์ฅํ์ญ์์ค.
๐ ๋ฐ ๐๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํญ๋ชฉ์ ํฌํํ์ธ์(๊ฐ๊ฐ ์ธํฐํ์ด์ค์ ๋ํด ์ฐฌ์ฑ ๋ฐ ๋ฐ๋). ๋๋ ์๊ฒฌ์ ์์ฑํ์ญ์์ค. ์ด์์ ์ผ๋ก๋ API ๊ฒํ ์๊ฐ ์ฐธ์ฌํฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง ํ์ฅ ๋ฉ์๋(๋ฐ ์์ฑ์ด ์ถ๊ฐ๋จ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ ๋ฐ/๋๋ ์์ ํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค(LINQ ์ฐธ์กฐ).
์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง ํ์ฅ ๋ฉ์๋(๋ฐ ์์ฑ์ด ์ถ๊ฐ๋จ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ ๋ฐ/๋๋ ์์ ํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค(LINQ ์ฐธ์กฐ).
์ธํฐํ์ด์ค์์ ๊ณต๊ฐ์ ์ผ๋ก ์ ์๋ ๋ฉ์๋๋ก๋ง ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ์ฒ์์ผ๋ก ๊ทธ๊ฒ์ ๋ฐ๋ก์ก๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํด๋์ค๊ฐ ์ฌ์ฉ ์ค์ด๊ณ ์์ ๋ ๋๊น์ง ์ธํฐํ์ด์ค๋ฅผ ์ ์ ๋ณด๋ฅํ ๋ค์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. (์ธํฐํ์ด์ค์ ํํ์ ๋ํ ๋ ผ์์ ๋ณ๊ฐ์ ๋ฌธ์ ์)
์์งํ ๋งํด์, ๋ด๊ฐ ์ ๊ฒฝ ์ฐ๋ ์ ์ผํ ๊ฒ์ ์ธํฐํ์ด์ค์ ๋๋ค. ๊ฒฌ๊ณ ํ ๊ตฌํ์ด ์ข๊ฒ ์ง๋ง ๋(๋๋ ๋ค๋ฅธ ์ฌ๋)๋ ํญ์ ๋๋ง์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ช ๋
์ HashSet<T>
์ ๋๊ฐ์ ๋ํ๋ฅผ ๋๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. Microsoft๋ HashSet<T>
๋ฅผ ์ํ์ง๋ง ์ปค๋ฎค๋ํฐ๋ ISet<T>
. ์ ๊ธฐ์ต์ด ๋ง๋ค๋ฉด HashSet<T>
๋จผ์ ๋ฐ๊ณ ISet<T>
๋ ๋ฒ์งธ๋ก ๋ฐ์์ต๋๋ค. ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉด HashSet<T>
์ ๊ณต๊ฐ API๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์(์ข
์ข
๋ถ๊ฐ๋ฅํ์ง๋ ์๋๋ผ๋) ์๋นํ ์ ํ์ ์ด์์ต๋๋ค.
SortedSet<T>
์๋ง์ ๋น BCL ๊ตฌํ์ ๋งํ ๊ฒ๋ ์๊ณ ํ์ฌ ISet<T>
์์ต๋๋ค. ๋๋ ๊ณต๊ฐ API์์ ISet<T>
ํ๊ณ ๊ทธ๊ฒ์ ๋ํด ๊ฐ์ฌํฉ๋๋ค. ๋ด ๊ฐ์ธ ๊ตฌํ์ ๋ด๊ฐ ์ณ๋ค๊ณ ์๊ฐํ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์๋ฌด ๊ฒ๋ ์ค๋จํ์ง ์๊ณ ๋ค๋ฅธ ๊ตฌํ์ผ๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ธํฐํ์ด์ค ์์ด๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํญ์ ์ฐ๋ฆฌ ์์ ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ์ ์๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค์ ์ํด ์ด๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ ์ ๋์ BCL์ ISet<T>
๊ฐ ๋ฐ์ํ์ง ์์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด์ ๊ฒฌ๊ณ ํ ๊ตฌํ๋ฟ๋ง ์๋๋ผ ๋๋ง์ ์ธํฐํ์ด์ค IMySet<T>
๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ BCL HashSet<T>
์ด ๋ฆด๋ฆฌ์ค๋ฉ๋๋ค. ISet<T>
๊ตฌํํ๊ฑฐ๋ ๊ตฌํํ์ง ์์ ์ ์์ง๋ง IMySet<T>
๊ตฌํํ์ง ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๋๋์ ๊ตํ ํ ์ HashSet<T>
๋ด์ ๊ตฌํ์ผ๋ก IMySet<T>
.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ์๋ฑํ ์ง์ ๋ค์ ๋ฐ๋ณตํ ๊น๋ด ๋๋ ต์ต๋๋ค.
์ธํฐํ์ด์ค์ ์ปค๋ฐํ ์ค๋น๊ฐ ๋์ง ์์๋ค๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ๋์
ํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค.
๋๋ ์๊ฒฌ์ ์ฐจ์ด๊ฐ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ซ์๋ง ๋ณด๋ฉด ์ธํฐํ์ด์ค์ ๋ํ ์ฌ๋์ด ์ฝ๊ฐ ๋ ๋ง์ง๋ง ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ์ด์ ์ ํ ๋ก ์ ์ฐธ์ฌํ์ง๋ง ์์ง ์ธํฐํ์ด์ค์ ๊ด๋ จํ์ฌ ์๊ฒฌ์ ํ๋ช ํ์ง ์์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋ฌป๊ณ ์ ํฉ๋๋ค.
@ebickle @svick @horaciojcfilho @paulcbetts @justinvp @akoeplinger @mbeidler @SirCmpwn @andrewgmorris @weshaggard @BrannonKing @NKnusperer @danmosemsft @ianhays @safern @VisualMelon @ Joe4evr @75
์๋ฆผ์ ๋ฐ์ ๊ฒฝ์ฐ: _์ฌ๋ฌ๋ถ, ์๊ฒฌ์ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น? :+1:, :-1:์ผ๋ก ํฌํ๋ง ํ์ ๋ ํฐ ๋์์ด ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋๊ธ (์ฌ๊ธฐ ์์ 4๊ฐ์ ๊ฒ์๋ฌผ)์์ ์ฝ๊ธฐ ์์ํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ์์ด๋์ด์ธ์ง ์ฌ๋ถ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค(ํด๊ฒฐ๋ ๋๊น์ง ์ง๊ธ์ ์ด ์ธก๋ฉด๋ง)._
์ด ์ฌ๋๋ค ์ค ์ผ๋ถ๋ API ๊ฒํ ์์ผ ์๋ ์์ง๋ง ์งํํ๊ธฐ ์ ์ ์ด ๊ทผ๋ณธ์ ์ธ ๊ฒฐ์ ์ ๋ํ ์ง์์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. @karelz , @terrajobst , ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์์ฒญํ ์ ์์ต๋๊น? ๊ทธ๋ค์ ์๊ฒฌ์ ๊ฒฐ๊ตญ ๊ฒํ ํ ์ฌ๋์ด๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊ท์คํ ๊ฒ์ ๋๋ค. ํน์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ปค๋ฐํ๊ธฐ ์ ์(๋๋ ์ง๋ฃจํ 1๊ฐ ์ด์์ ์ ์์ ์งํํ๊ธฐ ์ ์ ์ด ์์ ์์ ๊ทธ๊ฒ์ ์๋ ๊ฒ์ด ๋งค์ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.) ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ๊ฒฐ์ ์ ๋ ์ผ์ฐ ์ ์ ์๋ฏ์ด ์ฝ๊ฐ ๋ฌด์๋ฏธํฉ๋๋ค).
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ธํฐํ์ด์ค์ ์ฐฌ์ฑํ์ง๋ง, ๊ฒฐ์ ์ด ๋ค๋ฅด๋ค๋ฉด ๋ค๋ฅธ ๊ธธ์ ๊ฐ๋ ํ๋ณตํฉ๋๋ค.
API ๋ฆฌ๋ทฐ์ด๋ฅผ ํ ๋ก ์ ๋์ด๋ค์ด๊ณ ์ถ์ง ์์ต๋๋ค. ๊ธธ๊ณ ์ง์ ๋ถํฉ๋๋ค. API ๋ฆฌ๋ทฐ์ด๊ฐ ๋ชจ๋ ๊ฒ์ ๋ค์ ์ฝ๊ฑฐ๋ ๋ง์ง๋ง์ผ๋ก ์ค์ํ ๋ต๋ณ์ด ๋ฌด์์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ํจ์จ์ ์ด์ง ์์ ๊ฒ์
๋๋ค. ).
์ ๋ ์ฐ๋ฆฌ๊ฐ 2๊ฐ์ ๊ณต์ API ์ ์์ ์์ฑํ๊ณ ('์ข์' ์์ ์ฐธ์กฐ) ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ๊ฐ์กฐํ ์ ์๋ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ API ๊ฒํ ํ์์์ ๊ฒํ ํ๊ณ ํฌํ๋ฅผ ๊ณ ๋ คํ์ฌ ๊ถ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๊ณณ์ ํ ๋ก ์ ๋ฐ๋ผ(์ฌ๋ฌ ์๊ฒฌ์ด ์๋ ๊ฒฝ์ฐ) ๋ค์ ๋์์ Twitter ํฌํ/์ถ๊ฐ GH ํฌํ ๋ฑ์ ์์ํ ์ ์์ต๋๋ค.
BTW: API ๊ฒํ ํ์๋ ๊ฑฐ์ ๋งค์ฃผ ํ์์ผ์ ์ด๋ฆฝ๋๋ค.
์์ํ๋ ๋ฐ ๋์์ด ๋๋๋ก ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
```c#
๋ค์์คํ์ด์ค System.Collections.Generic
{
๊ณต๊ฐ ํด๋์ค PriorityQueue
: IEnumerable
{
๊ณต๊ฐ ์ฐ์ ์์ ํ();
๊ณต๊ฐ PriorityQueue(int ์ฉ๋);
๊ณต๊ฐ PriorityQueue(IComparer
๊ณต๊ฐ PriorityQueue(IEnumerable
๊ณต๊ฐ PriorityQueue(IEnumerable
๊ณต๊ฐ PriorityQueue(int ์ฉ๋, IComparer
public IComparer<T> Comparer { get; }
public int Count { get; }
public void Enqueue(T item);
public T Dequeue();
public T Peek();
public void Clear();
public bool Contains(T item);
// Sets the capacity to the actual number of elements
public void TrimExcess();
public void CopyTo(T[] array, int arrayIndex);
void ICollection.CopyTo(Array array, int index);
public T[] ToArray();
public Enumerator GetEnumerator();
IEnumerator<T> IEnumerable<T>.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
bool ICollection.IsSynchronized { get; }
object ICollection.SyncRoot { get; }
public struct Enumerator : IEnumerator<T>
{
public T Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext();
public void Reset();
public void Dispose();
}
}
}
```
ํ ๊ฒ:
UpdatePriority
์๋๋ฆฌ์ค ๋๋ฝ@karelz ์ข์, ๋ด์ค ! :์๋ค:
๊ด์ฐฎ์. ๋ด๊ฐ ๋งํ ์ ์๋ ํ ์ธํฐํ์ด์ค๋ ํ์ API ๊ฒํ ๋ฅผ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด 4์ฐจ ํ์ ์์ด๋ฒ๋ฆฌ๊ณ ์ฝ๊ฐ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ์๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ Python , Java , C++ , Go , Swift ๋ฐ Rust (์ ์ด๋ ํด๋น)์์ ์ฐพ์ ์ ์๋ ๊ฒ๊ณผ ๋ช ๊ฐ์ง ๋ฉด์์ ๋ค๋ฆ ๋๋ค.
์ฃผ์ ์ด์ ์ ์ต์ ์ ๋ณต์ก์ฑ๊ณผ ๋ฐ์ด๋ ์ค์ ์ฑ๋ฅ์ ์ ์งํ๋ฉด์ ์ ํ์ฑ, ๊ธฐ๋ฅ ์ธก๋ฉด์ ์์ ์ฑ ๋ฐ ์ง๊ด์ฑ์ ์์ต๋๋ค.
@karelz @terrajobst
์ฌ์ฉ์์๊ฒ ๋ง์ ์์๊ฐ ์๊ณ ๊ทธ ์ค ์ผ๋ถ๋ ๋ค๋ฅธ ์์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ ๋์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ฒฐ๊ตญ, ๊ทธ๋ค์ ๋ค์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋๋ก ์ด ์์ ๋ฌถ์์ ํน์ ์์๋ก ์ ์งํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๋จผ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ง๋๋ ๋ฐ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค(์์ ์ถ๊ฐ๋ง). ์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
TKey
๋ฐ TValue
๋ ๋ณ๋์ ๊ฐ์ฒด์
๋๋ค.TKey
๋ ๋น์ทํฉ๋๋ค.var queue = new PriorityQueue<int, string>();
queue.Enqueue(5, "five");
queue.Enqueue(1, "one");
queue.Enqueue(3, "three");
TKey
๋ฐ TValue
๋ ๋ณ๋์ ๊ฐ์ฒด์
๋๋ค.TKey
๋ ๋น๊ตํ ์ ์์ต๋๋ค .var comparer = Comparer<MyKey>.Create(/* custom logic */);
var queue = new PriorityQueue<MyKey, string>(comparer);
queue.Enqueue(new MyKey(5), "five");
queue.Enqueue(new MyKey(1), "one");
queue.Enqueue(new MyKey(3), "three");
TKey
์ TValue
๋ด์ ํฌํจ๋ฉ๋๋ค.TKey
๋ ๋น๊ตํ ์ ์์ต๋๋ค .public class MyClass
{
public MyKey Key { get; set; }
}
ํค ๋น๊ต๊ธฐ ์ธ์๋ ํค ์ ํ๊ธฐ๊ฐ ํ์ํฉ๋๋ค.
var selector = new Func<MyClass, MyKey>(item => item.Key);
var queue = new PriorityQueue<MyKey, MyClass>(selector, comparer);
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
Enqueue
๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฒ์๋ ํ๋์ ์ธ์( TValue
)๋ง ์ฌ์ฉํฉ๋๋ค.Enqueue(TKey, TValue)
์ฌ๋ก์ฐ ํ ํ์๊ฐ InvalidOperationException
.Enqueue(TValue)
์ฌ๋ก์ฐ ํ ํ์๊ฐ InvalidOperationException
.TKey
์ TValue
๋ด์ ํฌํจ๋ฉ๋๋ค.TKey
๋ ๋น์ทํฉ๋๋ค.var queue = new PriorityQueue<MyKey, MyClass>(selector);
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
TKey
๋ํ ๋น๊ต์๋ ์๋๋ฆฌ์ค 1 ์์์ ๊ฐ์ด Comparer<TKey>.Default
๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.TKey
๋ฐ TValue
๋ ๋ณ๊ฐ์ ๊ฐ์ฒด์ด์ง๋ง ๋์ผํ ์ ํ์
๋๋ค.TKey
๋ ๋น์ทํฉ๋๋ค.var queue = new PriorityQueue<int, int>();
queue.Enqueue(5, 50);
queue.Enqueue(1, 10);
queue.Enqueue(3, 30);
public class MyClass : IComparable<MyClass>
{
public int CompareTo(MyClass other) => /* custom logic */
}
var queue = new PriorityQueue<MyClass, MyClass>();
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
queue.Enqueue(new MyClass( /* args */ ));
์ฒ์์๋ ๋ชจํธํจ์ด ์์ต๋๋ค.
MyClass
๋ ๋ณ๋์ ๊ฐ์ฒด์ด๊ณ ์ฌ์ฉ์๋ ์๋๋ฆฌ์ค 5 ์์์ ๊ฐ์ด ๋จ์ํ ํค์ ๊ฐ์ ๋ถ๋ฆฌํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค.PriorityQueue
์ด ๋ชจํธ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Enqueue(TValue)
๋ง ํ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋๋ฆฌ์ค 6์ ๋ํ ๋์ฒด ์๋ฃจ์
์ ์ ํ๊ธฐ๋ฅผ ์ ์ํ๊ณ ์์ฑ์์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.Enqueue
๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ผ๋ก ๋ชจํธ์ฑ์ด ํด๊ฒฐ๋ฉ๋๋ค.Enqueue(TKey, TValue)
๊ฐ ์ฒ์ ํธ์ถ๋๋ฉด ํค์ ๊ฐ์ด ๋ณ๋์ ๊ฐ์ฒด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค( ์๋๋ฆฌ์ค 5 ). ๊ทธ๋๋ถํฐ Enqueue(TValue)
๋ฉ์๋๋ InvalidOperationException
throwํด์ผ ํฉ๋๋ค.Enqueue(TValue)
๊ฐ ์ฒ์ ํธ์ถ๋๋ฉด ํค์ ๊ฐ์ด ๋์ผํ ๊ฐ์ฒด๋ก ๊ฐ์ฃผ๋์ด ํค ์ ํ๊ธฐ๊ฐ ์ ์ถ๋ฉ๋๋ค( ์๋๋ฆฌ์ค 6 ). ๊ทธ๋๋ถํฐ Enqueue(TKey, TValue)
๋ฉ์๋๋ InvalidOperationException
throwํด์ผ ํฉ๋๋ค.์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฐ์ ์์ ํ ์์ฑ์ ๋ค๋ฃจ์์ต๋๋ค. ๋ํ ์ปฌ๋ ์ ์ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ ์์ต๋๋ค. ์ด์ ๋๋จธ์ง ๊ธฐ๋ฅ์ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค.
์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์์์ ๋ํด ์ํํ ์ ์๋ ๋ ๊ฐ์ง ์์ ์ด ์์ต๋๋ค. ๋ฐ๋ก ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค.
var queue = new PriorityQueue<int, string>();
queue.Enqueue(5, "five");
queue.Enqueue(1, "one");
queue.Enqueue(3, "three");
// retrieve the element with the highest priority
var element = queue.Peek();
// remove that element
queue.Dequeue();
Peek
๋ฐ Dequeue
๋ฉ์๋์์ ์ ํํ ๋ฌด์์ ๋ฐํํ๋์ง ๋์ค์ ์ค๋ช
ํฉ๋๋ค.
์์์ ์์์ ๋ํด ์์ ํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋น์ค์ ์ ์ฒด ์๋ช ๋์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๋๋๊ฒ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ Python , Java , C++ , Go , Swift ๋ฐ Rust ์์ ๋์ผํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ ๊ณต๋์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค๋ ์์ ์ ์์ง๋ง, ๋๋ ๊ทธ๊ฒ๋ค๋ง ํ์ธํ๋ค. ๊ฒฐ๊ณผ? ์ค๋งํ ๊ฐ๋ฐ์:
์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ฐ์ ์์ ํ์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ํธ๋ค์ด ์ ๊ณต๋ฉ๋๋ค.
var handle = queue.Enqueue(42, "forty two");
ํธ๋ค์ ๋ค์ ๊ณต๊ฐ API๊ฐ ์๋ ํด๋์ค์ ๋๋ค.
public class PriorityQueueHandle<TKey, TValue>
{
public TKey Key { get; }
public TValue Value { get; }
}
์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ณ ์ ์์์ ๋ํ ์ฐธ์กฐ์ ๋๋ค. ํจ์จ์ฑ์ด ๊ฑฑ์ ๋๋ค๋ฉด FAQ ๋ฅผ ์ฐธ์กฐํ์ธ์(๋ ์ด์ ๊ฑฑ์ ํ์ง ์์ผ์ ๋ ๋ฉ๋๋ค).
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ณ ์ ํ ์์๋ฅผ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค.
/*
* User wants to retrieve a server that at any given moment
* has the lowest average response time.
* He doesn't want to maintain a separate key object (it is
* inside his type) and the key is already comparable.
*/
var queue = new PriorityQueue<double, ServerStats>(selector);
/* adding some elements */
var handle = queue.Enqueue(server);
/*
* Server stats are kept along with handles (e.g. in a dictionary).
* Whenever there is a need of updating the priority of a certain
* server, the user simply updates the appropriate ServerStats object
* and then simply uses the handle associated with it:
*/
queue.Update(handle);
์์ ์์์๋ ํน์ ์ ํ์๊ฐ ์ ์๋์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋จ์ํ ์์ฒด ์ฌ์ ๋ ฌ์ ์ํด ์๋ฆผ์ ๋ฐ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(๊ด์ฐฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์ง๋ ์์).
์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ํ์ด ์ฐ์ ์์ ๋๊ธฐ์ด์ด ๊ตฌ์ฑ๋๊ณ ์์๋ก ์ฑ์์ง๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ฐ์ดํธ ๋ฐฉ์๋ ๋ค์ํฉ๋๋ค. ๋ด๊ฐ ๋ฌด์์ ์ธ์ง ์ด๋ฏธ ์๊ณ ์์ ๊ฒ์ด๋ฏ๋ก ์ด๋ฒ์๋ ์๋๋ฆฌ์ค๋ฅผ ๋ ์งง๊ฒ ๋ง๋ค๊ฒ ์ต๋๋ค.
TKey
๋ฐ TValue
๋ ๋ณ๋์ ๊ฐ์ฒด์
๋๋ค.var queue = new PriorityQueue<int, string>();
var handle = queue.Enqueue(1, "three");
queue.Enqueue(1, "three");
queue.Enqueue(2, "three");
queue.Update(handle, 3);
๋ณด์๋ค์ํผ, ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ง๋ฌธ ์์ด ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ณ ์ ํ ์์๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํค๊ฐ ์ค๋ณต๋ ์ ์๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค. ๋ํ ์ด๊ฒ์ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ O(1)์์ ์ ๋ฐ์ดํธํ ์์๋ฅผ ์๊ณ ์์ผ๋ฉฐ O(log n)์์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋๋ ์ฌ์ฉ์๋ O(n)์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ฒ์ํ ๋ค์ ์ธ์์ ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ถ๊ฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด Java์์ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ ํ ์ ํํ์ง๋ ํจ์จ์ ์ด์ง๋ ์์ง๋ง ๋๋ก๋ ๋ ๊ฐ๋จํฉ๋๋ค.
var queue = new PriorityQueue<int, string>();
queue.Enqueue(1, "one");
queue.Enqueue(2, "three");
queue.Enqueue(3, "three");
queue.Update("three", 30);
์์ ๋ฐฉ๋ฒ์ ๊ฐ์ด "three"
์ ๊ฐ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฐพ์ต๋๋ค. ํด๋น ํค๋ 30
๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ํญ๋ชฉ์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ ์
๋ฐ์ดํธ๋๋ ํญ๋ชฉ์ด ๋ฌด์์ธ์ง ์ ์ ์์ต๋๋ค.
Update(TKey oldKey, TValue, TKey newKey)
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฐ ๋ ์์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ ๋ค๋ฅธ ์กฐ๊ฑด์ ์ถ๊ฐํฉ๋๋ค. ์ด์ ํค๋ ์ผ์นํด์ผ ํฉ๋๋ค. ๋ ์๋ฃจ์
๋ชจ๋ ๋ ๊ฐ๋จํ์ง๋ง 100% ์์ ํ์ง ์๊ณ ์ฑ๋ฅ์ด ๋จ์ด์ง๋๋ค(O(1 + log n) vs O(n + log n)).
TKey
์ TValue
๋ด์ ํฌํจ๋ฉ๋๋ค.var queue = new PriorityQueue<int, MyClass>(selector);
/* adding some elements */
queue.Update(handle);
์ด ์๋๋ฆฌ์ค๋ ํธ๋ค ์น์ ์์ ์๋ก ์ ๊ณต๋ ๊ฒ์ ๋๋ค.
์๋ O(log n)์์ ๋ฌ์ฑ๋ฉ๋๋ค. ๋๋ ์ฌ์ฉ์๋ ์ง์ ๋ ๊ฒ๊ณผ ๋์ผํ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฐพ๊ณ ๋ด๋ถ ์ฌ์ ๋ ฌ์ ์ํํ๋ Update(TValue)
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ O(n)์
๋๋ค.
TKey
๋ฐ TValue
๋ ๋ณ๊ฐ์ ๊ฐ์ฒด์ด์ง๋ง ๋์ผํ ์ ํ์
๋๋ค.ํธ๋ค์ ์ฌ์ฉํ๋ฉด ํญ์ ๊ทธ๋ ๋ฏ์ด ๋ชจํธํจ์ด ์์ต๋๋ค. ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ โ ๋ฌผ๋ก ์์ต๋๋ค. ์ด๋ ๋จ์์ฑ, ์ฑ๋ฅ ๋ฐ ์ ํ์ฑ(๋ฐ์ดํฐ ๋ณต์ ๊ฐ๋ฅ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ) ๊ฐ์ ์ ์ถฉ์ ์ ๋๋ค.
ํธ๋ค์ด ์์ผ๋ฉด ๋ค์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํตํ ์ ๋ฐ์ดํธ๋ ๋ ๊ฐ๋จํ ์ ์์ง๋ง ๋ค์ ๋งํ์ง๋ง ์ฑ๋ฅ์ด ๋จ์ด์ง๊ณ ํญ์ ์ ํํ์ง๋ ์์ต๋๋ค(ํญ๋ชฉ์ด ๋์ผ).
์์ก์ด๋ฅผ ํตํด ๊ฐ๋จํ๊ณ ์ ํํ๊ฒ ํ ์ ์์ต๋๋ค. ๋๋ Remove(TValue)
๋ฐ Remove(TKey, TValue)
๋ฉ์๋๋ฅผ ํตํด. ์ด์ ์ ์ค๋ช
ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ์
๋๋ค.
var queue1 = new PriorityQueue<int, string>();
var queue2 = new PriorityQueue<int, string>();
/* add some elements to both */
queue1.Merge(queue2);
InvalidOperationException
์
๋๋ค.InvalidOperationException
์
๋๋ค.public class PriorityQueue<TKey, TValue>
: IEnumerable,
IEnumerable<PriorityQueueHandle<TKey, TValue>>,
IReadOnlyCollection<PriorityQueueHandle<TKey, TValue>>
// ICollection not included on purpose
{
public PriorityQueue();
public PriorityQueue(IComparer<TKey> comparer);
public PriorityQueue(Func<TValue, TKey> keySelector);
public PriorityQueue(Func<TValue, TKey> keySelector, IComparer<TKey> comparer);
IComparer<TKey> Comparer { get; }
Func<TValue, TKey> KeySelector { get; }
public int Count { get; }
public void Clear();
public bool Contains(PriorityQueueHandle<TKey, TValue> handle); // O(log n)
public bool Contains(TValue value); // O(n)
public bool Contains(TKey key, TValue value); // O(n)
public PriorityQueueHandle<TKey, TValue> Enqueue(TKey key, TValue value); // O(log n)
public PriorityQueueHandle<TKey, TValue> Enqueue(TValue value); // O(log n)
public PriorityQueueHandle<TKey, TValue> Peek(); // O(1)
public PriorityQueueHandle<TKey, TValue> Dequeue(); // O(log n)
public void Update(PriorityQueueHandle<TKey, TValue> handle); // O(log n)
public void Update(PriorityQueueHandle<TKey, TValue> handle, TKey newKey); // O(log n)
public void Update(TValue value, TKey newKey); // O(n)
public void Update(TKey oldKey, TValue value, TKey newKey); // O(n)
public void Remove(PriorityQueueHandle<TKey, TValue> handle); // O(log n)
public void Remove(TValue value); // O(n)
public void Remove(TKey key, TValue value); // O(n)
public void Merge(PriorityQueue<TKey, TValue> other); // O(1)
public IEnumerator<PriorityQueueHandle<TKey, TValue>> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
}
public class PriorityQueueHandle<TKey, TValue>
{
public TKey Key { get; }
public TValue Value { get; }
}
๋๋ ํจ์จ์ ์ด๊ณ ์ง๊ด์ ์ด๋ฉฐ ์์ ํ ์ ํ ํ๊ธฐ ๋๋ฌธ์ ํธ๋ค์ด ์๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ ฅํ ์ง์ง
UpdateFirst(Func<PriorityQueueHandle<TKey, TValue>, bool> predicate)
UpdateAll(Func<PriorityQueueHandle<TKey, TValue>, bool> predicate)
์ฌ์ฉ๋ฒ์ ๊ฝค ๋ฌ์ฝคํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ง ์ง๊ด์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ์ ์ ์์ต๋๋ค(๋งค์ฐ ํํ ๊ฐ๋ฅ). ๋๋ ๊ทธ ์ฌ๋์์ํ ๊ฒ์ ๋๋ค.
var queue = new PriorityQueue<int, string>();
/* add some elements */
queue.UpdateAll(x => x.Key < 15, 0);
// or for example
queue.UpdateFirst(x => x.Value.State == State.Idle, 100);
์ ํค๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์ด์ ํค๋ฅผ ๊ฐ์ ธ์ ์ด๋ป๊ฒ๋ ๋ณํํ๋ ๊ธฐ๋ฅ์ผ ์๋ ์์ต๋๋ค.
Contains
๋ฐ Remove
ํฉ๋๋ค.
ํค ์ ํ๊ธฐ๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ(๋ฐ๋ผ์ ํค์ ๊ฐ์ด ๋ณ๋๋ก ์ ์ง๋จ) ๋ฉ์๋ ์ด๋ฆ์ UpdateKey
์์ต๋๋ค. ๋ ํํ์ด ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํค ์ ํ๊ธฐ๊ฐ ์ ์๋๋ฉด Update
๊ฐ ๋ ์ข์ต๋๋ค. ํค๊ฐ ์ด๋ฏธ ์
๋ฐ์ดํธ๋์๊ณ ์ํํด์ผ ํ๋ ์์
์ ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์ ์ผ๋ถ ์์๋ฅผ ์ฌ์ ๋ ฌํ๋ ๊ฒ์
๋๋ค.
ํธ๋ค์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ํจ์จ์ฑ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋๋ ค์์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ํ ๋น์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ค์ํ์ง ๋ง์ญ์์ค. ์ฝ์ด.
์ฐ์ ์์ ๋๊ธฐ์ด์ ์ ๊ณตํ๋ ์์ ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๊ฒ์ ๋๋ค. ์ฒ์์ผ๋ก ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ ๋ฐฐ์ด๋ก ํ์๋๋ ์ด์ง ํ์ผ๋ก ๊ตฌํ๋ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ค๊ณ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๋ ํ์ด๋ง ํ ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ๋จ์ํ ํธ๋ฆฌ๋ฅผ ๋์ ๋ํ๋ ๋๋ค.
BTW, ์ฒซ ๋ฒ์งธ API ๊ฒํ ๋ฐ๋ณต์ ๋๋ค. _์ด๋ ค ์๋ ์ง๋ฌธ_์ด ์๋ ์น์ ์ ํด๊ฒฐํด์ผ ํฉ๋๋ค(์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ด ํ์ํ๋ฉฐ [๊ฐ๋ฅํ ๊ฒฝ์ฐ API ๊ฒํ ์์ ์๊ฒฌ์ด ํ์ํฉ๋๋ค]). ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ด ์ ์ด๋ ๋ถ๋ถ์ ์ผ๋ก ํต๊ณผํ๋ฉด ๋๋จธ์ง ํ ๋ก ์ ๋ํด ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค(์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ์ฐธ์กฐ).
๋ด๊ฐ ๋งํ ์ ์๋ ํ ์ธํฐํ์ด์ค๋ ํ์ API ๊ฒํ ๋ฅผ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค.
@pgolebiowski : ๊ทธ๋ผ ๊ทธ๋ฅ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ์ง ์๊ฒ ์ต๋๊น? ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉด ์ด ํด๋์ค๋ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ์ฅ์๋ ๋น๊ณต๊ฐ ๊ตฌํ์ ๋๋ค. ์ด ์์ ์์ ํ์ํ ๋ ๋๋ง์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์ฑ(๋๋ ์ฌ์ฌ์ฉ)ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ตฌํ์ผ๋ก ๊ต์ฒดํด์ผ ํ๋ ์ฆ์ ์ค๋จ๋๋ฏ๋ก ์๋ช ์ ์ด ์ ํ์ด ์๋ ๋ด ์ฝ๋์์ ๊ณต๊ฐ API๋ฅผ ๋ ธ์ถํ ์ ์์ต๋๋ค.
@๋ฒค๋๋
ธ
๊ธ์, Microsoft๋ ์ค๋ ๋์ ๋ํด ์ธ๊ธํ๋ ์์์ ์ฌ๋๋ค์ด ์๋๋ผ ์ฌ๊ธฐ์ ์ต์ข
๋จ์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ค์์ ์๊ณ ์์ต๋๋ค.
๋๋ ๋ค๋ฅธ API ๋ฆฌ๋ทฐ์ด/์ํคํ ํธ๊ฐ ๊ทธ๊ฒ์ ๊ณต์ ํ ๊ฒ์ด๋ผ๊ณ ์ด๋ ์ ๋ ํ์ ํฉ๋๋ค. ๋ช ์ฌ๋๊ณผ ์๊ฒฌ์ ํ์ธํ ๋ฐ ์์ต๋๋ค. ์ด๋ฆ์ PriorityQueue์ฌ์ผ ํ๊ณ IHeap ์ธํฐํ์ด์ค๋ฅผ ๋์ ํด์๋ ์ ๋ฉ๋๋ค. ์ ํํ ํ๋์ ๊ตฌํ์ด ์์ด์ผ ํฉ๋๋ค(์ผ๋ถ ํ์ ํตํด).
์ด๊ฒ์ @karelz, ์ํํธ์จ์ด ์์ง๋์ด ๊ด๋ฆฌ์ ๋ฐ @terrajobst, ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ์ ๋ฐ์ด ์ ์ฅ์ + ์ผ๋ถ API ๋ฆฌ๋ทฐ์ด์ ์์ ์๊ฐ ๊ณต์ ๋ฉ๋๋ค.
์ด์ ๊ฒ์๋ฌผ์์ ๋ถ๋ช ํ ์ธ๊ธํ๋ฏ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ๊ทผ ๋ฐฉ์์ ๋ถ๋ช ํ ์ข์ํ์ง๋ง ์ด ํ ๋ก ์์ ๋ง์ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ ์๋นํ ์ด๋ ต๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์์ ์ ์ ์ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋จ์ง ์ผ๋ถ ๋ ผํ์์ผ ๋ฟ์ ๋๋ค. ์ฝ๋๋ ์ด์จ๋ ์ฐ๋ฆฌ์ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌด์์ ๋ ํ ์ ์์ต๋๊น?
๊ทธ๋ ๋ค๋ฉด ์ ๋ฌธ์ ๋ฅผ ๋ซ์ง ์์ต๋๊น? ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉด ์ด ํด๋์ค๋ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
๋๋ ํ ๋งํผ ํ๋ค -- ๋ด ์ผ์ ๋ฏธ์ํ๋ ๋์ ์ ๋ญ๊ฐ๋ฅผ ํด๋ผ. ์ค์ ์์ ์ ์ํํฉ๋๋ค. ์ ์๋ฌด๋ ๊ฒ๋ ๋ ํํ๋ ค ํ์ง? ๋ค๋ฅธ ์ฌ๋๋ค์ ๋น์ ์ ๊ด์ ์ผ๋ก ์ค๋ํ๋ ๋ฐ ์ฑ๊ณตํ์ง ๋ชปํ ์์ ์ ๋น๋ํ์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ฐ, ์ ์๊ฒ ๊ทธ๋ฐ ์์ฌํ์ ์๋ผ์ง ๋ง์ญ์์ค. ์ ๋ง ์ ์นํฉ๋๋ค. ๋ ์ํ์ญ์์ค.
BTW, ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ๋์ง ์ฌ๋ถ ๋๋ ํด๋์ค ์ด๋ฆ์ด PriorityQueue
๋๋ Heap
์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ผ๋ฐ์ ์ธ ์ฌํญ์ ์ค์ ์ ๋ก๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์์ ์ ๋ง๋ก ์ค์ํ ๊ฒ์ ์ง์คํ๊ณ ์ํ๋ ๊ฒ์ด ์์ผ๋ฉด ํ๋์ ๋ํ ํธ๊ฒฌ์ ๋ณด์ฌ์ฃผ์ญ์์ค.
@pgolebiowski ๋ฌผ๋ก Microsoft์ ๊ฒฐ์ ์ ๋๋ค. ํ์ง๋ง ์์ ์ ํ์์ ๋ง๋ ์ฌ์ฉํ๊ณ ์ ํ๋ API๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฑฐ๋ถ๋๋ฉด ๊ทธ๋ ๊ฒ ๋ฉ๋๋ค. ์ ์์ ํํํ ํ์๊ฐ ์๋ค๊ณ ๋ด ๋๋ค.
์ ๋๊ธ์ ๋ ํ์ผ๋ก ํด์ํ์ จ๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ ํ์คํ ๋ด ์๋๊ฐ ์๋์๋ค.
@pgolebiowski ํธ๋ค์ KeyValuePair<TKey,TValue>
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@SamuelEnglard
ํธ๋ค์
KeyValuePair<TKey,TValue>
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
PriorityQueueHandle
๋ ์ฌ์ค _ ํ์ด๋ง ํ ๋
ธ๋ _์
๋๋ค. TKey Key
๋ฐ TValue Value
๋ ๊ฐ์ง ์์ฑ์ ๋
ธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๋ถ์ ํจ์ฌ ๋ ๋ง์ ๋
ผ๋ฆฌ๊ฐ ์์ต๋๋ค. ์ด ๊ตฌํ์ ์ฐธ์กฐํ์ญ์์ค. ์๋ฅผ ๋ค์ด ํธ๋ฆฌ์ ๋ค๋ฅธ ๋
ธ๋์ ๋ํ ํฌ์ธํฐ๋ ํฌํจํฉ๋๋ค(๋ชจ๋ ๊ฒ์ด CoreFX ๋ด๋ถ์ ์์).KeyValuePair
๋ ๊ตฌ์กฐ์ฒด์ด๋ฏ๋ก ๋งค๋ฒ ๋ณต์ฌ๋๊ณ ์์๋ ์ ์์ต๋๋ค.PriorityQueueHandle
๊ฐ KeyValuePair
์ ๋์ผํ ๊ณต๊ฐ API๋ฅผ ๋
ธ์ถํ๋ ๋ค์ ๋ณต์กํ ํด๋์ค๋ผ๋ ๊ฒ์
๋๋ค.@๋ฒค๋๋ ธ
ํ์ง๋ง ์์ ์ ํ์์ ๋ง๋ ์ฌ์ฉํ๊ณ ์ ํ๋ API๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฑฐ๋ถ๋๋ฉด ๊ทธ๋ ๊ฒ ๋ฉ๋๋ค. ์ ์์ ํํํ ํ์๊ฐ ์๋ค๊ณ ๋ด ๋๋ค.
TKey
๋ฐ TValue
๋ณ๋๋ก ๊ฐ์ง ์ ์์) ์ด ํด๋์ค๋ ์ค์ ๋ก ์ธ๋ชจ๊ฐ ์์ต๋๋ค. - ํ์ฌ Java์์์ ๊ฐ์ด.๊ทธ๊ฒ์ ํ์คํ ๋ด ์๋๊ฐ ์๋์๋ค.
๋ฏธ์, ๊ทธ๋ผ ๋ด ์ค์.
๋์์ธ์ ๋ํ ๋ด ์ง๋ฌธ(๋ฉด์ฑ ์กฐํญ: ์ด๋ฌํ ์ง๋ฌธ ๋ฐ ์ค๋ช , ํ๋ ํธ์๋ฐฑ ์์(์์ง)):
PriorityQueueHandle
ํฉ๋๊น? ๋๊ธฐ์ด์์ ๊ณ ์ ํ ๊ฐ์ ๊ธฐ๋ํ๊ธฐ๋ง ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?Merge
๊ฐ ํ์ํฉ๋๊น? ๋ค๋ฅธ ์ปฌ๋ ์
์๋ ์๋์? ๊ตฌํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ API๋ฅผ ์ถ๊ฐํด์๋ ์ ๋ฉ๋๋ค. API์ ๋ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ด์ผ ํฉ๋๋ค.IEnumerable<KeyValuePair<TKey, TValue>>
์์ ์ด๊ธฐํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ๊น์? + Linq์ ์์กดcomparer
๊ณผ๋ถํ๊ฐ ํ์ํฉ๋๊น? ํญ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๊น? (๋ฉด์ฑ
์กฐํญ: ์ด ๊ฒฝ์ฐ ์ง์/์ ๋ฌธ ์ง์์ด ๋ถ์กฑํ๋ฏ๋ก ์ง๋ฌธ๋ง ํฉ๋๋ค.)keySelector
์ค๋ฒ๋ก๋๊ฐ ํ์ํฉ๋๊น? ์ฐ๋ฆฌ๊ฐ ๊ฐ์น์ ์ผ๋ถ๋ก ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ฒ์ธ์ง, ์๋๋ฉด ๋ณ๋์ ๊ฒ์ผ๋ก ๊ฒฐ์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ถ๋ฆฌ ์ฐ์ ์์๊ฐ ์ข ๋ ์์ฐ์ค๋ฌ์ด ๊ฒ ๊ฐ์ง๋ง ๊ฐํ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฅ๋จ์ ์ ์๊ณ ์์ต๋๊น?๊ฐ๋ณ/๋ณ๋ ฌ ๊ฒฐ์ ์ฌํญ:
PriorityQueue
๋ Heap
IHeap
๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ๋์
ํ์๊ฒ ์ต๋๊น?IHeap ๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ๋์ ํ์๊ฒ ์ต๋๊น?
2์ผํธ๋ฅผ ํฌ์ํ ์ ์์ ๋งํผ ์ํฉ์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ธํฐํ์ด์ค๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ด ์๊ฒฌ์ผ๋ก๋ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ณ ์ฌ์ฉ์ฑ์ ์ต๋ํ ๋์ด๋ ๋ฐฉ์์ผ๋ก API(๋ฐ ํด๋น API์์ ์ค๋ช ํ๋ ํต์ฌ ๊ธฐ๋ฅ)์์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ถ์ํํฉ๋๋ค.
๋ด๊ฐ PQueue/Heap/ILikeThisItemMoreThanThisItemList์ ๋์์ ์ธํฐํ์ด์ค๋ฅผ ์ํํ ์ง ์๋๋ฉด ๋์ค์ ์ถ๊ฐํ ์ง ์ฌ๋ถ์ ๋ํ ์๊ฒฌ์ด ๊ฐ๋ ฅํ์ง ์์ต๋๋ค. API๊ฐ "์ ๋์ "์ผ ์ ์์ผ๋ฏ๋ก ํผ๋๋ฐฑ์ ๋ฐ์ ๋๊น์ง ๋จผ์ ํด๋์ค๋ก ๋ฆด๋ฆฌ์คํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ ๋์ํ์ง ์๋ ์ ํจํ ์ฃผ์ฅ์
๋๋ค. ๋ฌธ์ ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๊ธฐ์ ์ถฉ๋ถํ "์์ ์ "์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ๋ ๋ ์
๋๋ค. ์์ ์ค๋ ๋ IList
๋ฐ IDictionary
๋ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ค๋์ ์ ์ถ๊ฐํ ํ์ค ๊ตฌํ์ API๋ณด๋ค ๋ค์ฒ์ง๋ ๊ฒ์ผ๋ก ์ธ๊ธ๋์์ผ๋ฏ๋ก ํ์ฉ ๊ฐ๋ฅํ ํด์ ๊ธฐ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋๋ ๊ธฐ๊ฐ์ ๋ฌด์์
๋๊น?
ํฉ๋ฆฌ์ ์ธ ํ์ ์ ๊ฐ์ง๊ณ ๊ทธ ๊ธฐ๊ฐ์ ์ ์ํ ์ ์๊ณ ๊ทธ๊ฒ์ด ํ์ฉํ ์ ์์ ์ ๋๋ก ์ฐจ๋จ๋์ง ์๋๋ค๋ ๊ฒ์ ํ์ ํ ์ ์๋ค๋ฉด ์ธํฐํ์ด์ค ์์ด ์ด ๋ฐฉ๋ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ด ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ์ฌ์ฉ๋ฒ์ ๊ฒํ ํ๊ณ ์ธํฐํ์ด์ค ์ถ๊ฐ๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด Microsoft์์ ๋จ์ ์ผ๋ก ์ธ์๋๋ค๋ ๊ฒ์ ์ ๋ง ๋๋ผ์ด ์ผ์ ๋๋ค.
์ฌ๋ฌ๋ชจ๋ก ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ ์ด๋ค . ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉด ๊ฑฐ์ ์๋ฃ๋ ๊ฒ์ ๋๋ค. ํด๋น API๋ฅผ ๋ฐ๋ณตํ ์ ์๋ ์ฌ์ง๊ฐ ๋ง์ง ์์ผ๋ฏ๋ก ์ฒ์์๋ ๊ทธ๊ฒ์ด ์ณ๊ณ ์์ผ๋ก ๋ช ๋ ๋์ ๊ณ์ ์ณ์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฉ์ง--์์ด ๊ธฐ๋ฅ์ ๋๋ฝํ๋ฉด ๋ชจ๋ ๋ ์ ๋ง๋ค ๊ฒ ๊ทธ๋ฅ์ด ํ๋์ ์์ ๋ณํ๋ฅผ ๊ฐ์ง๊ณ ์ค - ๊ทธ๋์ - ์ข์ ๊ฒ์ ๋๋ค ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ๋ถ์ ์ ํ ์ธํฐํ์ด์ค ๋ถ์ด ๊ฒ๋ณด๋ค ๋ ์์๋ ๋ฐฉ๋ฒ ์ข์ ์ฅ์์ ๋๋ค.
@karelz ์ @ianhays๋ฅผ ์ ๋ ฅํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ ๋ง
PriorityQueueHandle
ํฉ๋๊น? ๋๊ธฐ์ด์์ ๊ณ ์ ํ ๊ฐ์ ๊ธฐ๋ํ๊ธฐ๋ง ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?๋๊ธฐ: ๋ค์ ๋ณต์กํ ๊ฐ๋ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ ํ์ํ์ง ์ดํดํ๊ณ ์ถ์ต๋๋ค. ์ด๋ป๊ฒ ๋์์ด ๋ฉ๋๊น? ์๋๋ฉด API ํ๋ฉด์ผ๋ก ๋์ถ๋๋ ํน์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด์ ๋๊น? API์ ๋ณต์ก์ฑ์ ๋ํ ๋น์ฉ์ ์ง๋ถํ๊ธฐ ์ํด ๊ทธ๋ ๊ฒ ๋ง์ ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๊น?
์๋์, ์ฐ๋ฆฌ๋ ํ์ํ์ง ์์ต๋๋ค. ์์์ ์ ์ํ ์ฐ์ ์์ ํ API๋ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. ์์์ ์ฐ์ ์์๊ฐ ์ค๋ณต๋ ์ ์๋ค๋ ๊ฐ์ ์ ๊ธฐ๋ฐํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ๋๋ฌธ์ ํธ๋ค์ด ์์ด์ผ ์ฌ๋ฐ๋ฅธ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์๊ฐ ๊ณ ์ ํด์ผ ํ๋ค๋ ์ ํ์ ๋๋ฉด ๋ด๋ถ ํด๋์ค( PriorityQueueHandle
)๋ฅผ ๋
ธ์ถํ์ง ์๊ณ ๋ ๊ฐ๋จํ API๋ก ์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋๋ฐ ์ด๋ ์ค์ ๋ก ์ด์์ ์ด์ง ์์ต๋๋ค.
๊ณ ์ ํ ์์๋ง ํ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ชจ๋ ์ด์ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๊ณ ์ต์ ์ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค. ๋ ๊ฐ๋จํ API:
public class PriorityQueue<TElement, TPriority>
: IEnumerable,
IEnumerable<(TElement element, TPriority priority)>,
IReadOnlyCollection<(TElement element, TPriority priority)>
// ICollection not included on purpose
{
public PriorityQueue();
public PriorityQueue(IComparer<TPriority> comparer);
public PriorityQueue(Func<TElement, TPriority> prioritySelector);
public PriorityQueue(Func<TElement, TPriority> prioritySelector, IComparer<TPriority> comparer);
IComparer<TPriority> Comparer { get; }
Func<TElement, TPriority> PrioritySelector { get; }
public int Count { get; }
public void Clear();
public bool Contains(TElement element); // O(1)
public (TElement element, TPriority priority) Peek(); // O(1)
public (TElement element, TPriority priority) Dequeue(); // O(log n)
public void Enqueue(TElement element, TPriority priority); // O(log n)
public void Enqueue(TElement element); // O(log n)
public void Update(TElement element); // O(log n)
public void Update(TElement element, TPriority priority); // O(log n)
public void Remove(TElement element); // O(log n)
public IEnumerator<(TElement element, TPriority priority)> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
}
๊ณง, ๊ธฐ๋ณธ Dictionary<TElement, InternalNode>
๊ฐ ์์ ๊ฒ์
๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์๊ฐ ํฌํจ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ
์คํธํ๋ ๊ฒ์ ์ด์ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค. ํญ์ ๋๊ธฐ์ด์ ์ง์ ์์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ผ๋ฏ๋ก ์์ ์
๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ๊ฐ ํฌ๊ฒ ๊ฐ์ํ๋ฉ๋๋ค.
์๋ง๋ ์ค๋ณต์ ํ์ฉํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด ์๋๋ฉฐ ์์ ๋ด์ฉ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ข์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ๋์?
Merge
๊ฐ ํ์ํฉ๋๊น? ๋ค๋ฅธ ์ปฌ๋ ์ ์๋ ์๋์? ๊ตฌํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ API๋ฅผ ์ถ๊ฐํด์๋ ์ ๋ฉ๋๋ค. API์ ๋ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋์ํ๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํ์๋กํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ API๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ์ ๊ฑฐํ ์๋ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ ๊ฑฐํ๊ณ (์ ์ฌ์ ์ผ๋ก) ๋์ค์ (ํ์ํ ๊ฒฝ์ฐ) ์ถ๊ฐํด๋ ๊ด์ฐฎ์ต๋๋ค.
๋น๊ต์ ๊ณผ๋ถํ๊ฐ ํ์ํฉ๋๊น? ํญ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๊น? (๋ฉด์ฑ ์กฐํญ: ์ด ๊ฒฝ์ฐ ์ง์/์ ๋ฌธ ์ง์์ด ๋ถ์กฑํ๋ฏ๋ก ์ง๋ฌธ๋ง ํฉ๋๋ค.)
์ด๊ฒ์ ๋ ๊ฐ์ง ์ด์ ๋ก ๋งค์ฐ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
IComparable
๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ ๋ฌํ๋๋ก ๊ฐ์ ํฉ๋๋ค.๋ํ ๊ธฐ์กด API์ ์ผ์นํฉ๋๋ค. SortedDictionary ๋ฅผ ์ดํด๋ณด์ญ์์ค.
keySelector ์ค๋ฒ๋ก๋๊ฐ ํ์ํฉ๋๊น? ์ฐ๋ฆฌ๊ฐ ๊ฐ์น์ ์ผ๋ถ๋ก ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ฒ์ธ์ง, ์๋๋ฉด ๋ณ๋์ ๊ฒ์ผ๋ก ๊ฒฐ์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ถ๋ฆฌ ์ฐ์ ์์๊ฐ ์ข ๋ ์์ฐ์ค๋ฌ์ด ๊ฒ ๊ฐ์ง๋ง ๊ฐํ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฅ๋จ์ ์ ์๊ณ ์์ต๋๊น?
๋๋ ๋ํ ๋ณ๋์ ์ฐ์ ์์๋ฅผ ์ข์ํฉ๋๋ค. ๊ทธ ์ธ์๋ ์ด๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ์ฝ๊ณ ์ฑ๋ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ ์ข๊ณ API๊ฐ ๋ ์ง๊ด์ ์ด๋ฉฐ ์ฌ์ฉ์์ ์์
๋์ด ์ ์ต๋๋ค( IComparable
๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์).
์ ๋ ํฐ์ ๋ํด ์ง๊ธ...
์ด๊ฒ์ด ์ด ์ฐ์ ์์ ํ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
IComparable
๋ฅผ ๊ตฌํํ๋ ์์๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ตฌ์ฑ์ ํ์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "ํ๋ฌ๊ทธ ์ค ํ๋ ์ด"๋ง ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๋ค์ ์ง๊ด์ ์ ๋๋ค.
Enqueue
๋ฐ Update
๋ฉ์๋.ํด๋์ค ์ด๋ฆ
PriorityQueue
๋Heap
IHeap
๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ์๊ฐํฉ๋๋ค.
PriorityQueue
๋ Heap
์๋๋ผ CoreFX์ ์ผ๋ถ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.IHeap
์ธํฐํ์ด์ค์ ๊ด๋ จํ์ฌ โ ์ฐ์ ์์ ํ๋ ํ๊ณผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ตฌํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋
ธ์ถํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ IPriorityQueue
๊ฐ ํ์ํ ์ ์์ต๋๋ค.์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉด ๊ฑฐ์ ์๋ฃ๋ ๊ฒ์ ๋๋ค. ํด๋น API๋ฅผ ๋ฐ๋ณตํ ์ ์๋ ์ฌ์ง๊ฐ ๋ง์ง ์์ผ๋ฏ๋ก ์ฒ์์๋ ๊ทธ๊ฒ์ด ์ณ๊ณ ์์ผ๋ก ๋ช ๋ ๋์ ๊ณ์ ์ณ์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ผ๋ฉด ์ข์ ๊ธฐ๋ฅ์ ๋์น๋ ๊ฒ์ด ์ ์ฌ์ ์ผ๋ก ๋ถ์ ์ ํ ์ ์๋ ์ธํฐํ์ด์ค์ ๊ฐํ๊ฒ ๋๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋์ ์์น์ ์๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ๋ ์ข๊ฒ ๋ง๋๋ ์ด ์์ ๋ณํ๋ง ์์ผ๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค.
์ ์ ์ผ๋ก ๋์ํฉ๋๋ค!
์์๊ฐ ๋น๊ต ๊ฐ๋ฅํด์ผ ํ๋ค๋ ๋ ๋ค๋ฅธ ๊ฐ์ ์ ์ถ๊ฐํ๋ฉด API๊ฐ ํจ์ฌ ๋ ๊ฐ๋จํด์ง๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ๋งํ์ง๋ง ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋๋ค.
IComparer
ํ์ ์์ต๋๋ค.Enqueue
๋ฐ Update
๋ฐฉ๋ฒ.IComparable
๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.<TElement, InternalNode>
๊ณผ InternalNode
์ TPriority
.public class PriorityQueue<T> : IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>
where T : IComparable<T>
// ICollection not included on purpose
{
public PriorityQueue();
// some other constructors like building it from a collection, or initial capacity if we have an array beneath
public int Count { get; }
public void Clear();
public bool Contains(T element);
public T Peek();
public T Dequeue();
public void Enqueue(T element);
public void Update(T element);
public void Remove(T element);
public IEnumerator<T> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
}
๋ชจ๋ ๊ฒ์ ์ ์ถฉ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๊ณ ์ผ๋ถ ์ ์ฐ์ฑ์ ์์คํ์ง๋ง ์ฌ์ฉ์์ 95%๋ฅผ ๋ง์กฑ์ํค๊ธฐ ์ํด ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค.
๋ํ ์ธํฐํ์ด์ค ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ ์ฐํ๊ณ ๋ ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ง์์ ๋ค์ง๋ง @karelz ๋ฐ @ianhays ๋ ์ ํด๋์ค API๊ฐ ์ฌ์ฉ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ณ ์ค์ ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ถ์ํ ๋๊น์ง ํผ๋๋ฐฑ์
๋ํ ๋น๊ต๊ธฐ์ ๊ดํด์๋ ๋ค๋ฅธ BCL API๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ์๊ฐํ๋ฉฐ ์ฌ์ฉ์๊ฐ ์๋ก์ด ๋ํผ ํด๋์ค๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๋ ์ฌ์ค์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๋๋ ๋น๊ต์ ์ ๊ทผ ๋ฐฉ์์ ์์ ํ๊ณ ๋ด๋ถ์ ์ผ๋ก ์ํํด์ผ ํ๋ ๋ชจ๋ ๋น๊ต ๋ด์์ ํด๋น ๋น๊ต์๋ฅผ ์ฌ์ฉํ๋ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ์ ๋ง ์ข์ํฉ๋๋ค. ๋น๊ต์๊ฐ ์ ๊ณต๋์ง ์๊ฑฐ๋ ๋น๊ต์๊ฐ null์ธ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋น๊ต์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@pgolebiowski ์์ธํ๊ณ ์ค๋ช ์ ์ธ API ์ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด API๋ฅผ ์น์ธํ๊ณ CoreFX์ ์ถ๊ฐํ๋ ๋ฐ ๋งค์ฐ ์ ๊ทน์ ์ด๊ณ ์ ๊ทน์ ์ ๋๋ค ๐ ์ด ๋ ผ์๊ฐ ์๋ฃ๋๊ณ ๊ฒํ ํ ์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ฉด ๋ชจ๋ ์ ๋ ฅ๊ณผ ์ต์ข API ํ๋ฉด์ ๋ณํฉํ ๊ฒ์ ๋๋ค ํ๋์ ๋๊ธ๋ก ๋ง๋ค๊ณ ์๋จ์ ์ฃผ์ ์ด์ ๋๊ธ์ ์ ๋ฐ์ดํธํ๋ฉด ๋ฆฌ๋ทฐ์ด์ ์ถ์ด ๋ ์ฌ์์ง๋๋ค.
์ข์, ๋๋ ๋น๊ต๊ธฐ์ ๋ํด ํ์ ํ๋ค. ๊ทธ๊ฒ์ ๋ง์ด ๋๊ณ ์ผ๊ด์ฑ์ด ์๋ค.
๋๋ ์ฌ์ ํ ์ ํ๊ธฐ์ ๋ํด ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. IMO ์์ด ์ ํํด์ผ ํฉ๋๋ค. ๋ ๊ฐ์ง ๋ณํ์ผ๋ก ๋๋๊ฒ ์ต๋๋ค.
```c#
๊ณต๊ฐ ํด๋์ค PriorityQueue
: IE์ซ์ ๊ฐ๋ฅ,
IEnumerable<(TElement ์์, Tpriority ์ฐ์ ์์)>,
IReadOnlyCollection<(TElement ์์, Tpriority ์ฐ์ ์์)>
// ICollection์ ์๋์ ์ผ๋ก ํฌํจ๋์ง ์์
{
๊ณต๊ฐ ์ฐ์ ์์ ํ();
๊ณต๊ฐ PriorityQueue(IComparer
public IComparer<TPriority> Comparer { get; }
public int Count { get; }
public void Clear();
public bool Contains(TElement element); // O(1)
public (TElement element, TPriority priority) Peek(); // O(1)
public (TElement element, TPriority priority) Dequeue(); // O(log n)
public void Enqueue(TElement element, TPriority priority); // O(log n)
public void Update(TElement element, TPriority priority); // O(log n)
public void Remove(TElement element); // O(log n)
public IEnumerator<(TElement element, TPriority priority)> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
//
// ์
๋ ํฐ ๋ถ๋ถ
//
๊ณต๊ฐ PriorityQueue(Func
๊ณต๊ฐ PriorityQueue(Func
public Func<TElement, TPriority> PrioritySelector { get; }
public void Enqueue(TElement element); // O(log n)
public void Update(TElement element); // O(log n)
}
````
์ด๋ฆฐ ์ง๋ฌธ:
PriorityQueue
๋ Heap
IHeap
๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ๋์
ํ์๊ฒ ์ต๋๊น? (๋์ค์ ๊ธฐ๋ค๋ ค์ผ ํ๋?)IPriorityQueue
์๊ฐ ? (๋์ค์ ๊ธฐ๋ค๋ ค์ผ ํ ๊น์ - IDictionary
์์)(TElement element, TPriority priority)
๋ KeyValuePair<TPriority, TElement>
ํํ ์ฌ์ฉPeek
๋ฐ Dequeue
์๋ ํํ ๋์ out
์ธ์๊ฐ ์์ด์ผ ํฉ๋๊น?๋น ๋ฅธ ํผ๋๋ฐฑ์ ์ํด ๋ด์ผ API ๊ฒํ ๊ทธ๋ฃน์์ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
Peek
๋ฐ Dequeue
ํํ ํ๋ ์ด๋ฆ์ priority
(์ด๋ฅผ ์ง์ ํด ์ฃผ์ @pgolebiowski ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค).
์๋จ ๊ฒ์๋ฌผ์ ์์ ์ต์ ์ ์์ผ๋ก ์
๋ฐ์ดํธ๋์์ต๋๋ค.
๋๋ @safern ์ ์ฝ๋ฉํธ๋ฅผ ๋ ๋ฒ์งธ๋ก - ์์ผ๋ก ์ถ์งํด ์ค @pgolebiowski ์๊ฒ
์ด๋ฆฐ ์ง๋ฌธ:
์ฌ๊ธฐ์ ํ๋ ๋ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฆฐ ์ง๋ฌธ์ด ์๋ ์์ ๊ฒ์๋ฌผ์ '๊ฐ์ '์ผ๋ก ์บก์ฒ๋ ์ข์ ์ ์ ๋๋ค. ๊ทธ ๋ฐ๋๋ API๋ฅผ ์๋นํ ์ถํ๊ฒ ๋ง๋ญ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฐํํด์ผํฉ๋๋ค bool
์์ Remove
? ๋ํ out priority
์ธ์๋ก ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๊น? (์ต๊ทผ์ ๋น์ทํ ์ค๋ฒ๋ก๋๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
Contains
์ ์ ์ฌ - ๋๊ตฐ๊ฐ๊ฐ ์ฐ์ ์์๋ฅผ ์ํ ๊ฒ์
๋๋ค. out priority
ํ์ฌ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋๋ ํ์ด ๊ตฌํ์ ์๋ฏธํ๊ณ ์ด๊ฒ์ PriorityQueue
ํธ์ถํ๋ ๊ฒ์ ์ ๋นํ๊ฒ ์ง์ํ ๊ฒ์ด๋ผ๋ ์๊ฒฌ(์์ง ๋ชฉ์๋ฆฌ๋ฅผ ๋ด์ง๋ ์์์ง๋ง)์ ์ ์งํฉ๋๋ค. (๋๋ ์ค๋ณต ์์๋ฅผ ํ์ฉํ๊ณ ์
๋ฐ์ดํธ ๋ฑ์ ํ์ฉํ์ง ์๋ ๋ ์ฌ๋ฆผํ Heap
ํด๋์ค์ ๋ํ ์ ์์ ์ง์งํ ์๋ ์์ต๋๋ค. (์๋ ์ ์์ ๋ ๋ง์ด ๋ถํฉํจ) ๋ฐ์).
์ค๋ณต ์ฐ์ ์์๊ฐ ์์๋๋ฏ๋ก KeyValuePair<TPriority, TElement>
์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ๋ํ KeyValuePair<TElement, TPriority>
๋ ํผ๋์ค๋ฌ์ธ ์ ์์ผ๋ฏ๋ก KeyValuePair
๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค KeyValuePair<TElement, TPriority>
์ผ๋ฐ ํํ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฐ์ ์์์ ๋ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค(๊ฐ์ธ์ ์ผ๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ์ ํธํ์ง๋ง ์๋์ค๋ฝ์ง๋ ์์ต๋๋ค).
์ค๋ณต์ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ๋ค๋ฅด๊ฑฐ๋ ๋ณ๊ฒฝ๋ ํญ๋ชฉ์ ๋ค์ ์ถ๊ฐํ๋ ค๋ ๋์์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๋๋ ์ ํ์ ์ ์์ ์ง์งํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ค๋ณต์ฑ์ ์๋ฏธํ๊ณ ์ ๋นํ๊ฒ ํผ๋์ ์ฌ์ฐฝ์กฐํ ๊ฒ์ด๋ผ๋ ๋จ์ํ ์ด์ ๋๋ฌธ์
๋๋ค. ์์์ ์ฐ์ ์์๊ฐ ํจ๊ป ์ ์ฅ๋๋ฉด ๋ ๊ณณ์ ์ ์ฅ๋๊ณ ๋๊ธฐํ๋์ง ์์ผ๋ฉด(์ฆ, ๋๊ตฐ๊ฐ ์ธ๋ชจ ์์ด ๋ณด์ด๋ Update(TElement)
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์์) ๋ง์ ๊ณ ํต์ ๊ฒช์ต๋๋ค. ๋ณด์ฅํฉ๋๋ค. ์ ํ๊ธฐ๊ฐ ์ปดํจํฐ์ธ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ์์๋ฅผ ์ถ๊ฐํ ๋ค์ ๊ณ์ฐ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฌ๋๋ค์๊ฒ ์ด๋ ค ์์ต๋๋ค. ์ด์ ๋ค์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด ๋ค์์ ๋ฐ๋ผ ์๋ชป๋ ์ ์๋ ๋ง์ ๊ฒ๋ค์ด ์์ต๋๋ค. ์ด๊ฒ์ด ์ผ์ด๋ ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง์ ๋ํ ๊ฒฐ์ ์. ์ฝ๊ฐ ๋ ๋์ ์์ค์์ ์๋ํ๋ฉด ๋ ์ด์ ์ด์ ๊ณผ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์์์ ๋ณ๊ฒฝ๋ ๋ณต์ฌ๋ณธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค(์ด๊ฒ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ํค์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ด์ง๋ง ์ฐ์ ์์์ ์์๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค).
์ ํ๊ธฐ ์์ฒด๋ ํ๋์ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์๊ฐ ์์ด ๋ชจ๋ ๊ฒ์ ๊นจ๋จ๋ฆด ์ ์๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์ฐ์ ์์๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๊ณตํ๋๋ก ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๋ณผ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์์๊ฐ ์๋ ์์ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต ํญ๋ชฉ์ด ํ์ฉ๋๋ค๋ ๊ฒ์ ์ ๋ฌํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋, ์ฌ์น์๋ ์ธ๋ผ์ธ ๋ฌธ์์ bool
์์ต ๊ฐ์น Enqueue
ํ์ฐฎ๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ค. Boolean๋ณด๋ค ๋ ๋์ ๊ฒ์ ์์์ ์ด์ /์ ์ฐ์ ์์๋ฅผ ๋ฐํํ๋ ๊ฒ์
๋๋ค(์: Enqueue
๊ฐ ์๋ก ์ ๊ณต๋ ์ฐ์ ์์, ๋๋ ๋ ์ค ์ต์๊ฐ ๋๋ ์ด์ ์ฐ์ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ). ๊ทธ๋ฌ๋ Enqueue
๋ ๋ค์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด ์คํจํด์ผ ํ๋ฏ๋ก ์ฑ๊ณต์ ๋ํ๋ด๋ bool
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Enqueue
๋ฐ Update
์์ ํ ๋ถ๋ฆฌ๋๊ณ ์ ์ ์๋ฉ๋๋ค.
KeyValuePair๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค.
๋๋ ๋น์ ๊ณผ ํจ๊ป ํํ์ ์์ต๋๋ค.
์ค๋ณต์ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ๋ค๋ฅด๊ฑฐ๋ ๋ณ๊ฒฝ๋ ํญ๋ชฉ์ ๋ค์ ์ถ๊ฐํ๋ ค๋ ๋์์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
Dictionary
๋ด์์ ์ธ๋ฑ์์ ์ ์ฌ์ฑ์ ๋ด
๋๋ค. ๊ฑฐ๊ธฐ์์ dictionary["something"] = 5
๋ฅผ ์ํํ๋ฉด "something"
๊ฐ ์ด์ ์ ํค์๋ ๊ฒฝ์ฐ ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์์ผ๋ฉด ๊ทธ๋ฅ ์ถ๊ฐ๋ฉ๋๋ค.Enqueue
๋ฉ์๋๋ ์ฌ์ ์ ์๋ Add
๋ฉ์๋์ ์ ์ฌํฉ๋๋ค. ์ฆ, ์์ธ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.Enqueue
๋ฉ์๋๋ ๋๊ตฐ๊ฐ๊ฐ ์ค๋ณต๋ ์์๋ฅผ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ throwํด์ผ ํ๋ค๋ ๊ฒฐ๋ก ์ผ๋ก โโ์ด์ด์ง๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Update
๋ฉ์๋๋ ์กด์ฌํ์ง ์๋ ์์์ ์ฐ์ ์์๋ฅผ ์
๋ฐ์ดํธํ๋ ค๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ throwํด์ผ ํฉ๋๋ค.bool
๋ฐํํ๋ TryUpdate
๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ญ์์ค.๋๋ ๊ทธ๊ฒ์ด ์ค๋ณต์ฑ์ ์๋ฏธํ๋ค๋ ๋จ์ํ ์ด์ ๋ก ์ ํ์ ์ ์์ ์ง์งํ์ง ์์ต๋๋ค.
ํค๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ณต์ฌ๋์ง ์๊ณ (์กด์ฌํ๋ ๊ฒฝ์ฐ) ์ ํ๊ธฐ๋ ์ฐ์ ์์๋ฅผ ํ๊ฐํด์ผ ํ ๋ ํธ์ถ๋๋ ํจ์๋ก ๋จ์ ์์ง ์์ต๋๊น? ์ค๋ณต์ ์ด๋์ ์์ต๋๊น?
์ฐ์ ์์์ ์์๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์ผํ ๋ฌธ์ ๋ ๊ณ ๊ฐ์๊ฒ ๋ฌผ๋ฆฌ์ ์ฐ์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ๋ ๋ง์ ๊ฒ์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ฐ์ ์์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ๊ณตํ๋๋ก ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๋ณผ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์์๊ฐ ์๋ ์์ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต ํญ๋ชฉ์ด ํ์ฉ๋๋ค๋ ๊ฒ์ ์ ๋ฌํ๋ค๋ ๊ฒ์ ๋๋ค.
ํด๋น ์๋ฃจ์
์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ง๋ง ์ค๋ณต ํญ๋ชฉ์ด ํ์ฉ๋๋ ์ด์ ๊ฐ ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. "์ค๋ณต ์์" ๋
ผ๋ฆฌ๋ TElement
์๋ง ์ ์ฉ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ์ ์์๋ ์ฌ๊ธฐ์ ๊ฐ์ผ ๋ฟ์
๋๋ค.
var queue = new PriorityQueue<string, double>();
queue.Enqueue("first", 0.1);
queue.Enqueue("first", 0.5); // should be unsuccessful IMO
@VisualMelon ๊ทธ๊ฒ ๋ง์ด ๋๋์?
@pgolebiowski
TryUpdate
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋์ํ๋ฉฐ Update
๋์ง๋ ๊ฒ์ด ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋๋ Enqueue
( IDictionary
๋ณด๋ค๋)์ ๊ด๋ จํ์ฌ ISet
๋ผ์ธ์ ๋ฐ๋ผ ๋ ๋ง์ด ์๊ฐํ๊ณ ์์์ต๋๋ค. ๋์ง๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์์ ๊ฒ์
๋๋ค. ์ ๋ ๊ทธ ์ ์ ๋์ณค์์ ํ๋ฆผ์์ง bool
๋ฐํ์ด ์ ํ์ 'ํ์ ์ฑ'์ ์ ๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ TryEnqueue
๋ ( Add
๋์ง๊ธฐ์ ํจ๊ป) ์์๊ฐ ๋ ๊น์? TryRemove
๋ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค(๋น์ด ์์ผ๋ฉด ์คํจ). ๋น์ ์ ๋ง์ง๋ง ์์ ์ ๊ดํด์๋, ๋ค, ์ ๋ ์ผ๋์ ๋ ํ๋์
๋๋ค. ๋๋ IDictionary
์ ์ ์ถํ๋ ๊ฒ์ด ISet
๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ๋ฉฐ ์ถฉ๋ถํ ๋ช
ํํด์ผ ํฉ๋๋ค. (์์ฝํ์๋ฉด: ๋๋ ๋น์ ์ ์ ์์ ๋ฐ๋ผ ๋์ง๋ ๋ชจ๋ ๊ฒ์ ์ง์งํ์ง๋ง, ๊ทธ๋ด ๊ฒฝ์ฐ Try*
๋ฅผ ๊ฐ๋ ๊ฒ์ด ํ์์
๋๋ค. ๋ํ ์คํจ ์กฐ๊ฑด์ ๊ดํ ๋น์ ์ ์ง์ ์ ๋์ํฉ๋๋ค).
์ธ๋ฑ์์ ๊ด๋ จํ์ฌ ๋๊ธฐ์ด ๊ฐ๋ ์ ์ค์ ๋ก '์ ํฉ'ํ์ง ์๋ค๋ ๊ทํ์ ์๊ฐ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๊ทธ๊ฒ์ ์ง์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ง์ฝ ์๋ค๋ฉด Queue ๋๋ Update์ ๋ํ ์ ๋ช ๋ช ๋ ๋ฉ์๋๊ฐ ์์๋๋ก ์์ ๊ฒ์ ๋๋ค.
ํค๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ณต์ฌ๋์ง ์๊ณ (์กด์ฌํ๋ ๊ฒฝ์ฐ) ์ ํ๊ธฐ๋ ์ฐ์ ์์๋ฅผ ํ๊ฐํด์ผ ํ ๋ ํธ์ถ๋๋ ํจ์๋ก ๋จ์ ์์ง ์์ต๋๊น? ์ค๋ณต์ ์ด๋์ ์์ต๋๊น?
๋ง์์. ์ ์ ์
๋ฐ์ดํธ๋ฅผ ์๋ชป ์ฝ์์ต๋๋ค(์์์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋นํธ). Selector๊ฐ ์์ฒญ ์ ํธ์ถ๋๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด(์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ๋ฌธ์์์ ๋ช
ํํ๊ฒ ์ค๋ช
ํด์ผ ํจ) ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๋ตํ์ง ์๊ณ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. Update
๊ฐ ํธ์ถ๋์ง ์๋ ํ ๋ ๊ฐ๋ ๋๊ธฐํ๋์ง ์์ต๋๋ค. ์ค์๊ฐ์์ผ๋ก ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์์์ ์ ํจ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ทธ ์ค ํ๋๋ง ์
๋ฐ์ดํธํ๋ฉด '์
๋ฐ์ดํธ๋์ง ์์' ์์์์ ์ ํ๋ ๋ '์ปค๋ฐ๋์ง ์์' ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ข
๋ฃ๋ฉ๋๋ค. ์ ์๋ DataStructure ๊ตฌํ์ ๋ํด ์์ธํ ์ค๋ช
ํ๊ณ ์์ง๋ง ์ด๊ฒ์ ๋ชจ๋ ์
๋ฐ์ดํธ O(<n)
ํ์ฐ์ ์ผ๋ก ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฐ์ ์์๋ฅผ ๋ช
์์ ์ผ๋ก ์
๋ฐ์ดํธํ๋๋ก ํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ๋ฐ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ผ๊ด๋ ์ํ์์ ๋ค๋ฅธ ์ํ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
์ง๊ธ๊น์ง ์ ํ๊ธฐ ์ ์์ ๋ํด ์ธ๊ธํ ๋ชจ๋ ๋ถ๋ง ์ฌํญ์ API์ ๊ฒฌ๊ณ ์ฑ์ ๊ดํ ๊ฒ์
๋๋ค. ์ ํ๊ธฐ๋ ์๋ชป ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์ฑ์ ์ ์ณ๋๊ณ ๊ฐ๋
์ ์ผ๋ก ๋๊ธฐ์ด์ ์์๋ ์ฐ์ ์์๋ฅผ ์ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ์ฌ์ ์ผ๋ก ๊ทธ๋ค๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ struct Queable<T>{}
๋๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์์ ์ ์์๋ฅผ ๋ํํ๋ฉด ๋ง์ฐฐ ์๋ API ์ ๊ณต์ ์คํจํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค(์ด ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์๊ฒ ์์ฒ๋ฅผ ์ฃผ๋ ๋งํผ).
๋ฌผ๋ก ์ ํ๊ธฐ๊ฐ ์์ผ๋ฉด ์ฌ์ฉ์๊ฐ ์ ํ๊ธฐ๋ฅผ ํธ์ถํด์ผ ํ๋ ๋ถ๋ด์ด ์๋ค๊ณ ์ฃผ์ฅํ ์ ์์ง๋ง ์์๊ฐ ์ฐ์ ์์๋ฅผ ์๋ฉด (๋ฐ๋์งํ๊ฒ๋) ๊น๋ํ๊ฒ(์ฆ, ์์ฑ) ๋ ธ์ถ๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด t, ๊ทธ๋ฌ๋ฉด ๊ฑฑ์ ํ ์ ํ๊ธฐ๊ฐ ์์ต๋๋ค(์ฆ์์์ ์ฐ์ ์์ ์์ฑ ๋ฑ). ์ ํ๊ธฐ๋ฅผ ์ง์ํ์ง ์์ผ๋ ค๋ฉด ์ง์ํ๊ณ ์ด๋ฏธ ์ ์ ์๋ '์ ํ๊ธฐ'๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๋ฅผ ์ ๋ฌํ๋ ๋ฐ ํจ์ฌ ๋ ๋ฌด์๋ฏธํ ๋ฐฐ๊ด์ด ํ์ํฉ๋๋ค. ์ ํ๊ธฐ๋ ์ฌ์ฉ์๊ฐ ์ด ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋๋ก ์ ๋ํ๊ณ (์๋ง๋ ๋์์ด ๋์ง ์์ ์ ์์), ๋ณ๋์ ์ฐ์ ์์๋ ๋์์ธ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์๋ ๋งค์ฐ ํฌ๋ช ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ํ๊ธฐ์ ๋ํด ๋ด๊ฐ ์ ๋ง๋ก ์๊ฐํ ์ ์๋ ์ ์ผํ ์ฃผ์ฅ์ PriorityQueue
์ ๋ฌ์ ์ฌ์ฉํ ์ ์๊ณ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ด ์ฐ์ ์์๊ฐ ๊ณ์ฐ๋๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅธ ์ฑ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ์๊ฐํด์ผ ํ ๊ฒ์ด์ง๋ง, 'ํ์' ์ ํฉ์ฑ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ ๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ํฉ๋ฆฌ์ ์ผ๋ก ๋ฌด๊ฑฐ์ด ์ค๋ฒํค๋์ ๋ํ ์์ ๋ณด์์ผ๋ก ์๊ฐํฉ๋๋ค.
_ํธ์ง: ๊ทธ๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ์๊ณ ์์ผ๋ฉด, Elements๋ฅผ ๋์ง ์ ์๋ ์์ฒด ํฌํจ๋ PriorityQueue
๊ฐ ์์ผ๋ฉด ๋งค์ฐ ์ข๊ฒ ์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋๋ ๋น์ฉ์ด ํด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์
๋น์ฉ์ ์๋นํ ๋ฎ์ ๊ฒ์
๋๋ค._
์ ๋ ์ฐ์ ์์ ํ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง์ ๋ํ ์ค์ ์ฌ๋ก๋ฅผ ๋ณด๊ธฐ ์ํด ์คํ ์์ค .NET ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉฐ ์ฝ๊ฐ์ ์์ ์ ํ์ต๋๋ค. ๊น๋ค๋ก์ด ๋ฌธ์ ๋ ํ์ ํ๋ก์ ํธ ๋ฐ ๊ต์ก ์์ค ์ฝ๋๋ฅผ ํํฐ๋งํ๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ๋ฒ 1: Roslyn ์๋ฆผ ์๋น์ค
https://github.com/dotnet/roslyn/
Roslyn ์ปดํ์ผ๋ฌ์๋ "PriorityQueue"๋ผ๋ ๊ฐ์ธ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ตฌํ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ๋๊ธฐ์ด์๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์ต์ ํ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์ฆ, ๋๊ธฐ์ด์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง ์์ง๋์ง ์๋๋ก ํ๋ ๊ฐ์ฒด ๋๊ธฐ์ด์
๋๋ค. Enqueue_NoLock ๋ฉ์๋๋ current.Value.MinimumRunPointInMS < entry.Value.MinimumRunPointInMS์ ๋ํ ํ๊ฐ๋ฅผ ์ํํ์ฌ ํ์์ ์ ๋
ธ๋๋ฅผ ๋ฐฐ์นํ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ฐ์ ์์ ๋๊ธฐ์ด ๋์์ธ(๋น๊ต ๊ธฐ๋ฅ/๋๋ฆฌ์ ๋ ๋ช
์์ ์ฐ์ ์์) ์ค ํ๋๊ฐ ์ด ์ฌ์ฉ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
์ฌ์ฉ๋ฒ 2: Lucene.net
https://github.com/apache/lucenenet
์ด๊ฒ์ ํ๋ฆผ์์ด .NET์์ ์ฐพ์ ์ ์๋ PriorityQueue์ ๊ฐ์ฅ ํฐ ์ฌ์ฉ ์์
๋๋ค. Apache Lucene.net์ ์ธ๊ธฐ ์๋ Lucene ๊ฒ์ ์์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฒด .net ํฌํธ์
๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ํ์ฌ์์ Java ๋ฒ์ ์ ์ฌ์ฉํ๊ณ Apache์ ์น ์ฌ์ดํธ์ ๋ฐ๋ฅด๋ฉด ๋ช ๊ฐ์ง ํฐ ์ด๋ฆ์ด .NET ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. Github์๋ .NET ํ๋ก์ ํธ์ ๋ง์ ํฌํฌ๊ฐ ์์ต๋๋ค.
Lucene์๋ HitQueue, TopOrdAndFloatQueue, PhraseQueue ๋ฐ SuggestWordQueue์ ๊ฐ์ ์ฌ๋ฌ "ํน์" ์ฐ์ ์์ ๋๊ธฐ์ด๋ก ํ์ ๋ถ๋ฅ๋๋ ์์ฒด PriorityQueue ๊ตฌํ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ํ ํ๋ก์ ํธ๋ ์ฌ๋ฌ ์์น์์ PriorityQueue๋ฅผ ์ง์ ์ธ์คํด์คํํฉ๋๋ค.
์์ ๋งํฌ๋ Lucene์ PriorityQueue ๊ตฌํ์ ์ด๋ฒ ํธ์ ๊ฒ์๋ ์๋ ์ฐ์ ์์ ๋๊ธฐ์ด API์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. "PriorityQueue
Lucene์ PriorityQueue์์ ์ฐ์ ์์๋ ์์ฑ์์ ์ ๋ฌ๋ ๋น๊ต์์ ์ํด ๊ฒฐ์ ๋๋ฉฐ, ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ ๋น๊ต๋ ๊ฐ์ฒด๊ฐ IComparable์ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ฝ๋ ๊ธฐ๋ฐ์ ํตํด ๋ง์ ์ฌ์ฉ ์๊ฐ ์์ผ๋ฉฐ SloppyPhraseScorer ๊ฐ ๊ทธ ์ค ํ๋์ ๋๋ค.
SloppyPhraseScorer์ ์์ฑ์๋ ์๋ก์ด PhraseQueue(pq)๋ฅผ ์ธ์คํด์คํํฉ๋๋ค. ์ด๋ PriorityQueue์ ๊ณ ์ ํ ์ฌ์ฉ์ ์ ์ ํ์ ํด๋์ค ์ค ํ๋์ ๋๋ค. PhrasePositions ์ปฌ๋ ์ ์ด ์์ฑ๋๋ฉฐ, ์ด๋ ๊ฒ์๋ฌผ ์งํฉ, ์์น ๋ฐ ์ฉ์ด ์งํฉ์ ๋ํ ๋ํผ๋ก ํ์๋ฉ๋๋ค. FillQueue ๋ฉ์๋๋ ๊ตฌ ์์น๋ฅผ ์ด๊ฑฐํ๊ณ ๋๊ธฐ์ด์ ๋ฃ์ต๋๋ค. PharseFreq()๋ AdvancePP ํจ์๋ฅผ ํธ์ถํ๊ณ ๋์ ์์ค์์ ๋๊ธฐ์ด์์ ๋นผ๋ด๊ณ ํญ๋ชฉ์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ๋ค์ ๋ค์ ๋๊ธฐ์ด์ ๋ฃ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ฐ์ ์์๋ ๋ช ์์ ์ผ๋ก(์ฐ์ ์์๊ฐ ๋๊ธฐ์ด์ ๋ฃ๋ ๋์ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก "์ ๋ฌ"๋์ง ์์) ์๋์ ์ผ๋ก(๋น๊ต์๋ฅผ ์ฌ์ฉํ์ฌ) ๊ฒฐ์ ๋ฉ๋๋ค.
PhraseQueue ์ ๊ตฌํ์ ๋ฐ๋ผ ์์ฑ์๋ฅผ ํตํด ์ ๋ฌ๋ ๋น๊ต ๊ฐ(์: ์ ์)์ด ์๋ฆฌ์ง ์์ ์ ์์์ ์ ์ ์์ต๋๋ค. ๋น๊ต ๊ธฐ๋ฅ("LessThan")์ PhrasePositions.doc, PhrasePositions.position ๋ฐ PhrasePositions.offset์ ์ธ ๊ฐ์ง ํ๋๋ฅผ ํ๊ฐํฉ๋๋ค.
์ฉ๋ฒ 3: ๊ฒ์ ๊ฐ๋ฐ
์ด ๊ณต๊ฐ์์ ์ฌ์ฉ ์์ ๊ฒ์์ ์๋ฃํ์ง๋ ์์์ง๋ง ๊ฒ์ ๊ฐ๋ฐ์์ ์ฌ์ฉ์ ์ง์ .NET PriorityQueue๊ฐ ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง ์์ ๋ฅผ ๋ณด์์ต๋๋ค. ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์๋ฏธ์์ ์ด๋ค์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก(Dijkstra's)๋ก ๊ฒฝ๋ก ์ฐพ๊ธฐ๋ฅผ ์ค์ฌ์ผ๋ก ํด๋ฌ์คํฐ๋ง๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. Unity 3D ๋ก ์ธํด .NET์์ ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฌป๋ ๋ง์ ์ฌ๋๋ค์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฌ์ ํ ์ด ์์ญ์ ํํค์ณ์ผ ํฉ๋๋ค. ๋ช ์์ ์ฐ์ ์์๊ฐ ๋๊ธฐ์ด์ ํฌํจ๋ ๋ช ๊ฐ์ง ์์ Comparer/IComparable์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์๋ฅผ ๋ณด์์ต๋๋ค.
๋ณ๋์ ๋ฉ๋ชจ์์ ๊ณ ์ ์์, ๋ช ์์ ์์ ์ ๊ฑฐ ๋ฐ ํน์ ์์์ ์กด์ฌ ์ฌ๋ถ ํ์ธ์ ๋ํ ๋ ผ์๊ฐ ์์์ต๋๋ค.
ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก์ ์ผ๋ฐ์ ์ผ๋ก Enqueuing ๋ฐ Dequeuing์ ์ง์ํฉ๋๋ค. ๋ค๋ฅธ ์งํฉ/๋ชฉ๋ก๊ณผ ๊ฐ์ ์์ ์ ์ ๊ณตํ๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด ์ค์ ๋ก ํํ์ ์ ๋ ฌ๋ ๋ชฉ๋ก๊ณผ ์ ์ฌํ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ ํ ๋์์ธํ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ํธ์ถ์๊ฐ Enqueue, Dequeue, Peek ์ด์ธ์ ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์ ํ ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ด ํ์ํ ์ ์์ต๋๊น? ๋๊ธฐ์ด์ ์ ์์ ๋ฐ๋ผ ๋๊ธฐ์ด์ ์ฝ์ ํ๊ณ ๋๊ธฐ์ด์์ ์์๋๋ก ์ ๊ฑฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณ๋ก.
@์๋นํด
๋ค๋ฅธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์ ๋ฌ๋์๋์ง ํ์ธํ๋ ๊ทํ์ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ IMO์์ ์ด ๋ ผ์๋ ํน์ ์ค๊ณ ์ ์ ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด์ต์ ์ป์ ๊ฒ์ ๋๋ค. ์ด ์ค๋ ๋๋ ์ด๋ฏธ ๋ฐ๋ผํ๊ธฐ ์ด๋ ต๊ณ ๊ฒฐ๋ก ์์ด ๊ธด ์ด์ผ๊ธฐ๋ฅผ ํ๋ฉด ๋ ์ด๋ ต์ต๋๋ค.
๋๊ธฐ์ด [...]์ ์ผ๋ฐ์ ์ผ๋ก Enqueuing ๋ฐ Dequeuing์ ์ง์ํฉ๋๋ค. [...] ํธ์ถ์๊ฐ Enqueue, Dequeue, Peek ์ด์ธ์ ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์ ํ ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ด ํ์ํ ๊น์? ๋๊ธฐ์ด์ ์ ์์ ๋ฐ๋ผ ๋๊ธฐ์ด์ ์ฝ์ ํ๊ณ ๋๊ธฐ์ด์์ ์์๋๋ก ์ ๊ฑฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณ๋ก.
ํ๋ฅญํ ํ ๋ก ์
๋๋ค. @ebickle ์ ์ฐ๊ตฌ๋ ๋งค์ฐ ์ ์ฉํ IMO์
๋๋ค!
@ebickle [2] lucene.net์ ๋ํ ๊ฒฐ๋ก ์ด ์์ต๋๊น - ์ฐ๋ฆฌ์ ์ต์ ์ ์์ด ์ฉ๋์ ๋ง๋์ง ์๋์ง? (์์ธํ ์ค๋ช
์์ ๋๋ฝ๋์ง ์์์ผ๋ฉด ํฉ๋๋ค.)
์์ Try*
๋ณํ + IsEmpty
+ TryPeek
/ TryDequeue
+ EnqueueOrUpdate
? ์๊ฐ?
```c#
๊ณต๊ฐ ๋ถ์ธ IsEmpty();
public bool TryPeek(ref TElement element, ref TPriority priority); // false if empty
public bool TryDequeue(ref TElement element, ref TPriority priority); // false if empty
public bool TryEnqueue(TElement element, TPriority priority); // false if it is duplicate (doe NOT update it)
public void EnqueueOrUpdate(TElement element, TPriority priority); // TODO: Should return bool status for enqueued vs. updated?
public bool TryUpdate(TElement element, TPriority priority); // false if element does not exist (does NOT add it)
public bool TryRemove(TElement element); // false if element does not exist
```
@karelz
์์ Try* ๋ณํ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค, ๋ง์ต๋๋ค.
enqueued vs. updated์ ๋ํด bool ์ํ๋ฅผ ๋ฐํํด์ผ ํฉ๋๊น?
๋ชจ๋ ๊ณณ์์ ์ํ๋ฅผ ๋ฐํํ๋ ค๋ฉด ๋ชจ๋ ๊ณณ์์. ์ด ํน์ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ ๋ ์์
์ค ํ๋๊ฐ ์ฑ๊ณตํ๋ฉด( Enqueue
๋๋ Update
) ์ฌ์ค์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋จธ์ง๋ -- ์ ๋ ๋จ์ํ ๋์ํฉ๋๋ค :์ค๋ง์ผ:
๊ทธ๋ฅ ํ๋ ๊ฐ์ ์ง๋ฌธ - ์ ref
๋์ out
? ์ ๋ชจ๋ฅด๊ฒ ๋ค:
๋ชจ๋ ๊ณณ์์ ์ํ๋ฅผ ๋ฐํํ๋ ค๋ฉด ๋ชจ๋ ๊ณณ์์. ์ด ํน์ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ ๋ ์์ ์ค ํ๋๊ฐ ์ฑ๊ณตํ๋ฉด(
Enqueue
๋๋Update
) ์ฌ์ค์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํญ์ true๋ฅผ ๋ฐํํฉ๋๋ค. ์ข์ ์๊ฐ์ด ์๋๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ IMO์์ void
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๋๋ค์ด ํผ๋์ค๋ฌ์ ํ๊ณ ๋ฐํ ๊ฐ์ ํ์ธํ๊ณ ์ธ๋ชจ์๋ ์ ๋ ์คํ๋์ง ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ ๊ฒ์
๋๋ค. (์ ๊ฐ ๋์น ๊ฒ์ด ์๋ค๋ฉด)
ref vs. out ๋์, ๋ด๊ฐ ์ง์ ํ ๋ก ํ์ต๋๋ค. ๋๋ ๊ฐํ ์๊ฒฌ์ด ์๋ค / ์ค์ค๋ก ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ์ ์ถฉ๋ถํ ๊ฒฝํ์ด ์๋ค. API ๊ฒํ ์์๊ฒ ์ง๋ฌธํ ์ ์์ต๋๋ค. / ๋ ๋ง์ ์๊ฒฌ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
ํญ์ true๋ฅผ ๋ฐํํฉ๋๋ค.
๋น์ ๋ง์ด ๋ง์, ๋ด ๋์. ์ฃ์กํฉ๋๋ค.
๋๋ ๊ฐํ ์๊ฒฌ์ด ์๋ค / ์ค์ค๋ก ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ์ ์ถฉ๋ถํ ๊ฒฝํ์ด ์๋ค.
์ด์ฉ๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์์ง๋ ๋ชจ๋ฅด์ง๋ง ๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ref
์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก Peek
๋ฐ Dequeue
๊ฐ TElement
๋ฐ TPriority
์ ๋ฌ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๋งํฉ๋๋ค( ๋๋ ๊ทธ ํ๋๋ฅผ ์ฝ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค). ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๋ฉ์๋๋ ํด๋น ๋ณ์์๋ง ๊ฐ์ ํ ๋นํด์ผ ํฉ๋๋ค(์ค์ ๋ก ์ปดํ์ผ๋ฌ์์ ํ ๋นํด์ผ ํจ).
๋ด Try*
API๋ก ์
๋ฐ์ดํธ๋ ์ธ๊ธฐ ๊ฒ์๋ฌผ
2๊ฐ์ ๊ณต๊ฐ ์ง๋ฌธ์ ์ถ๊ฐํ์ต๋๋ค.
Peek
๋ฐ Dequeue
๋์ง๊ธฐ๊ฐ ์ ํ ์ ์ฉํฉ๋๊น?TryPeek
๋ฐ TryDequeue
- ref
๋๋ out
์ธ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น?ref ๋ out - ๋น์ ์ด ์ณ์ต๋๋ค. false๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ด๊ธฐํ๋ฅผ ํผํ๋๋ก ์ต์ ํํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋ฆฌ ์๊ณ ๋์ด ๋ฉ์์ต๋๋ค - ์กฐ๊ธฐ ์ต์ ํ. ๋๋ ๊ทธ๊ฒ์ out์ผ๋ก ๋ฐ๊พธ๊ณ ์ง๋ฌธ์ ์ ๊ฑฐํ ๊ฒ์ด๋ค.
6: ๋๋ฝ๋ ๊ฒ์ด ์์ ์ ์์ง๋ง ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ๋๊ธฐ์ด์ด ๋น์ด ์๋ ๊ฒฝ์ฐ Peek
๋๋ Dequeue
๋ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ๋๋ ์ด๊ฒ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ null
๋ฐ์๋ค์ฌ์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ์ง๋ฌธ์ ๋์ง๊ธฐ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. null
ํ์ฉํ๋๋ผ๋ ๊ฐ ์ ํ์๋ null
( default
ํ์คํ ๊ณ์ฐ๋์ง ์์)๊ฐ ์์ผ๋ฏ๋ก Peek
๋ฐ Dequeue
๋ ์๋ฏธ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๋น์ฐํ ์์ธ๋ฅผ throwํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(๋ฐ๋ผ์ out
๋งค๊ฐ๋ณ์์ ๋ํ ์ฐ๋ ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค!). ๊ธฐ์กด Queue.Dequeue
์ ์๋ฅผ ๋ฐ๋ฅด์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค.
Dijkstra(ํด๋ฆฌ์คํฑ์ด ์๋ ํด๋ฆฌ์คํฑ ๊ฒ์์ด๋ผ๊ณ ๋ ํจ)์๋ ์ฐ์ ์์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์์ต๋๋ค. ๋๋ ์ด๋ค ๊ฒ์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ถ์ง ์์์ผ๋ฉฐ ํญ์ ํด๋ฆฌ์คํฑ ๊ฒ์์ ๊ฐํํ์ต๋๋ค. (์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ์ผ๋จ ์ํ๋ฅผ ํ์ํ ํ์๋ ์ต์์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ ์ด ์๋ ์ํ์ด ์์ผ๋ฏ๋ก ์ฐ์ ์์๋ฅผ ๊ฒฐ์ฝ ํฅ์์ํฌ ์ ์์ผ๋ฉฐ ํ์คํ (์ฆ, ๋ ๋์ ๊ฒฝ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.) _์๋์ ์ผ๋ก ํด๋ฆฌ์คํฑ์ ์ ํํ์ฌ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฌด์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฌผ๋ก ์ต์ ์ด ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ง๋ง ์ฌ์ ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ_)
์์ธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ๋๊ธฐ์ด์ด ๋น์ด ์๋ ๊ฒฝ์ฐ Peek ๋๋ Dequeue๋ ๋ฌด์์ ํด์ผ ํฉ๋๊น?
์ง์ค.
๋ฐ๋ผ์ out ๋งค๊ฐ๋ณ์์ ๋ํ ์ฐ๋ ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค!
์ด๋ป๊ฒ? out
๋งค๊ฐ๋ณ์๋ TryPeek
๋ฐ TryDequeue
๋ฉ์๋์ฉ์
๋๋ค. ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ Peek
๋ฐ Dequeue
์
๋๋ค.
Dijkstra๋ ์ฐ์ ์์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์๋ค๊ณ ๋ง๋ถ์์ต๋๋ค.
๋ด๊ฐ ํ๋ฆด ์๋ ์์ง๋ง ๋ด๊ฐ ์๋ ํ Dijkstra์ ์๊ณ ๋ฆฌ์ฆ์ DecreaseKey
์ฐ์ฐ์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๊ฒ์ ์ฐธ์กฐํ์ญ์์ค. ์ด๊ฒ์ด ํจ์จ์ ์ธ์ง ์๋์ง๋ ๋ค๋ฅธ ์ธก๋ฉด์
๋๋ค. ์ฌ์ค, ํผ๋ณด๋์น ํ์ O(1)์์ DecreaseKey
์ฐ์ฐ์ ์ ๊ทผ์ ์ผ๋ก ๋ฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์์ต๋๋ค(Dijkstra๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด).
๊ทธ๋ฌ๋ ์ฌ์ ํ ํ ๋ก ์์ ์ค์ํ ๊ฒ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค๋ ์ ์์ ๋งค์ฐ ์ ์ฉํ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ฒ์ํ๋ ์ฌ๋๋ค์ด ์๋ค๋ ๊ฒ์ ๋๋ค(StackOverflow์์ ์ด์ ์ ๋งํฌ๋ ์ง๋ฌธ ์ฐธ์กฐ). ์ ๋ ๋ช๋ฒ ์ฌ์ฉํด๋ดค๋๋ฐ์.
์ฃ์กํฉ๋๋ค. ์, ์ด์ out
๋งค๊ฐ๋ณ์์ ๋ฌธ์ ๊ฐ ์์ด ๋ค์ ์๋ชป ์ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Dijkstra์ ๋ณํ(๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ๋ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉ๋๋ ์ด๋ฆ...)์ด ์๋ง๋ ๋ ํจ์จ์ ์ผ๋ก ๊ตฌํ๋ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค(๋๊ธฐ์ด์ ์ด๋ฏธ ์์๊ฐ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฒ์์ ๋ํ ์ด์ ์ด ์์ ์ ์์). ์
๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์. ๊ธด ๋จ์ด์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ป์ ๊ฒฐ๊ณผ์
๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ Update
์ ๋จ์ด๋จ๋ฆด ๊ฒ์ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ด ๊ธฐ๋ฅ์ด ๋ถ๊ณผํ๋ ์ ํ ์์ด ๋ ์์ Heap
๋๋ ๋ค๋ฅธ ๊ฒ(์ฆ, ์๋ ์ ์)์ ๊ฐ๋ ๊ฒ๋ ์ข์ ๊ฒ์
๋๋ค. ๋ด๊ฐ ํ๊ฐํ๋ ๋ฅ๋ ฅ).
7: out
์ด์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ์
๋ ฅ์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ์กด์ฌํ์ง ์์์ผ ํฉ๋๋ค(์ฆ, ref
์ ํจ๊ป ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค). out
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด default
๊ฐ ๋ฐํ์ ๊ฐ์ ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด Dictionary.TryGetValue
๊ฐ ํ๋ ์ผ์ด๋ฉฐ ๋ฌ๋ฆฌ ํ ์ด์ ๊ฐ ์์ต๋๋ค. _์ฆ, ref
๋ฅผ ๊ฐ์ด๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์์ง๋ง ์๋ฏธ ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ์ข์ ์ํต๋๋ค._
API ๊ฒํ ํ ๋ก :
๋ค์์ ์ฃผ์ ์์ ๋ฉ๋ชจ์ ๋๋ค.
ImmutableCollections
์ ๋ํด ์ ์ฌํ ์์
์ ์ํํ์ต๋๋ค(๋น ๋ฅธ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๊ฐ ํต์ฌ์ด๋ฉฐ API๋ฅผ ํ์ฑํ๋ ๋ฐ ๋์์ด ๋จ).MultiValueDictionary
์ ํจ๊ป ๋ฌถ์ ์ ์์ต๋๋ค. TODO: ํ๋ณด์๊ฐ ๋ ์๋์ง ํ์ธํ์ญ์์ค. ๊ฐ๋ณ์ ์ผ๋ก ๋ธ๋ก๊ทธ์ ๊ฒ์ํ๊ณ ์ถ์ง ์์ต๋๋ค.TElement
์์ Peek
& Dequeue
, ๋ฐํํ์ง ์๋ TPriority
(์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์์๋ Try*
๊ทธ ๋ฐฉ๋ฒ).Update
- ์ฌ์ฉ์๋ Remove
ํ ๋ค์ ๋ค๋ฅธ ์ฐ์ ์์๋ก ๋ค์ Enqueue
ํญ๋ชฉ์ ํ ์ ์์ต๋๋ค.Remove
๋ ์ฒซ ๋ฒ์งธ ๋ฐ๊ฒฌ ํญ๋ชฉ๋ง ์ ๊ฑฐํด์ผ ํฉ๋๋ค( List
์ฒ๋ผ).IQueue
์ธํฐํ์ด์ค ์ถ์์ ์ Queue
๋ฐ PriorityQueue
( Peek
๋ฐ Dequeue
๋ฐํ์ TElement
๋ฐ ๋์์ด ์ฌ๊ธฐ)์ฐ๋ฆฌ๋ ์ ํ๊ธฐ์ ๋ํด ์ค๋ซ๋์ ๋
ผ์ํ์ต๋๋ค. ์์ง ๊ฒฐ์ ๋์ง ์์์ต๋๋ค(์์ IQueue
์๊ตฌํ ์ ์์ต๋๊น?). ๋๋ค์๊ฐ ์ ํ๊ธฐ๋ฅผ ์ข์ํ์ง ์์์ง๋ง ํฅํ API ๊ฒํ ํ์์์ ์ํฉ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ด๋ฆฐ ์ง๋ฌธ์ ๋ ผ์๋์ง ์์์ต๋๋ค.
์ต์ ์ ์์ ๋์๊ฒ ๊ฝค ์ข์ ๋ณด์ธ๋ค. ๋ด ์๊ฒฌ/์ง๋ฌธ:
Peek
๋ฐ Dequeue
๊ฐ priority
๋ํด out
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฐ์ ์์๋ฅผ ์ ํ ๋ฐํํ์ง ์๋ ์ค๋ฒ๋ก๋๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ๋จ์ํํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ. ์ฐ์ ์์๋ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌด์ํ ์๋ ์์ผ๋ฏ๋ก ๋ ์ค์ํฉ๋๋ค.PriorityQueue<T>
๊ฐ ์์ด์ผ ํฉ๋๊น? ๋๋ PriorityQueue<T, T>
์ ํจ๊ป ์๋ํ๋ ์ ์ ๋ฐ ํ์ฅ ๋ฉ์๋ ์ธํธ?priorityQueue.Select(t => t.element)
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๊น?Dictionary
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ IEqualityComparer<TElement>
๋ฅผ ์ ๋ฌํ๋ ์ต์
์ด ์์ด์ผ ํฉ๋๊น?Dictionary
์ฌ์ฉํ์ฌ ์์๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ๋ถํ์ํ ์ค๋ฒํค๋์
๋๋ค. ๋นํ์ฑํํ๋ ์ต์
์ด ์์ด์ผ ํฉ๋๊น? ๋์ค์ ์ถ๊ฐํ ์ ์์ง๋ง ์ ์ฉํ๋ค๊ณ ํ๋ช
๋๋ฉด.@karelz
์์ ์ฑ(๋์ผํ ์ฐ์ ์์์ ๊ฒฝ์ฐ) - ์ฐ์ ์์๊ฐ ๋์ผํ ํญ๋ชฉ์ ๋๊ธฐ์ด์ ์ฝ์ ๋ ์์๋๋ก ๋ฐํ๋์ด์ผ ํฉ๋๋ค(์ผ๋ฐ ๋๊ธฐ์ด ๋์).
์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ฐ์ ์์๊ฐ (priority, version)
์๊ณผ ๊ฐ์์ผ ํจ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ version
๋ ์ถ๊ฐํ ๋๋ง๋ค ์ฆ๊ฐํฉ๋๋ค. ํนํ version
๊ฐ 64๋นํธ์ฌ์ผ ํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๊ฒ ๋์ด๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ด๋งํ ๊ฐ์น๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ค๋ณต ๊ฐ์ ๋ฐฉ์งํ๊ณ ์ถ์ง ์์ต๋๋ค(๋ค๋ฅธ ์ปฌ๋ ์ ๊ณผ ์ ์ฌ).
Update
- ์ฌ์ฉ์๋Remove
ํ ๋ค์ ๋ค๋ฅธ ์ฐ์ ์์๋ก ๋ค์Enqueue
ํญ๋ชฉ์ ํ ์ ์์ต๋๋ค.
๊ตฌํ์ ๋ฐ๋ผ Update
๋ Remove
๋ค์์ Enqueue
์ค๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํจ์จ์ ์ผ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ด๋๋ฆฌ ํ, (๋๋ ๊ธ ํ์ด ๋์์ ๋ณต์กํ ๊ฒ ๊ฐ์์) Update
(๊ณ ์ ๊ฐ๊ณผ ์ฌ์ ) O (๋ก๊ทธ n์ด)์
๋๋ค ๋์ Remove
์ค๋ณต ๊ฐ ( ์ฌ์ ์์)์ O( n )์
๋๋ค.
@pgolebiowski
์ฌ๊ธฐ์์ ์ ์์ ์ง์คํด์ผ ํ๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์๋ API ์ ์๊ณผ ์๋ ๊ฒ์๋ฌผ์ ๋ง๋ค์์ต๋๋ค. 1์์ @karelz ๋ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์๋ฅผ ์์ฒญํ์ต๋๋ค. PriorityQueue API์ ํน์ ํ์์ฑ๊ณผ ์ฌ์ฉ๋ฒ์ ๊ดํ ํจ์ฌ ๋ ๊ด๋ฒ์ํ ์ง๋ฌธ์ ๋์ก์ต๋๋ค. ๋๋ ๋๋ง์ PriorityQueue ๊ตฌํ์ ๊ฐ์ง๊ณ ์๊ณ ๋ช๋ช ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ BCL์์๋ ๋น์ทํ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋๊ผ์ต๋๋ค.
์๋ ๊ฒ์๋ฌผ์์ ๋ด๊ฐ ๋ถ์กฑํ ๊ฒ์ ๊ธฐ์กด ๋๊ธฐ์ด ์ฌ์ฉ์ ๋ํ ๊ด๋ฒ์ํ ์กฐ์ฌ์์ต๋๋ค. ์ค์ ์ฌ๋ก๋ ์ค๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์งํ๊ณ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
@karelz
Lucene.net์๋ ํ๋ ์ด์์ ์ฐ์ ์์ ๋๊ธฐ์ด ๋น๊ต ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค(๋น๊ต์ ์ ์ฌ).
์ ์:
1) ์ฐ์ ์์ ํ
2) ์ฐ์ ์์ ํ
๋ ์ ํ ๋ชจ๋ ์ค๋ณต ์์๋ฅผ ์ง์ํฉ๋๋ค. ๋์ผํ ์ฐ์ ์์์ ์์์ ๋ํด FIFO๋ฅผ ๋ณด์ฅํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค.
@karelz๊ฐ ์ ์ํ ๋๋ก
์ง๋ฌธ:
public void Enqueue(TElement element, TPriority priority); // Throws if it is duplicate`
public bool TryEnqueue(TElement element, TPriority priority); // Returns false if it is duplicate (does NOT update it)
์ ์ค๋ณต์ด ์๋์?
public (TElement element, TPriority priority) Peek(); // Throws if empty
public (TElement element, TPriority priority) Dequeue(); // Throws if empty
public void Remove(TElement element); // Throws if element does not exist
์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๋ฐ๋์งํ๋ค๋ฉด ํ์ฅ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๊น?
public void Enqueue(TElement element);
public void Update(TElement element);
๋์ ธ์ผ ํ๋ค; ํ์ง๋ง ์ Try ๋ณํ์ด ์๊ณ ํ์ฅ ๋ฐฉ๋ฒ๋ ์์ต๋๊น?
๊ตฌ์กฐ ๊ธฐ๋ฐ ์ด๊ฑฐ์?
@benaadams throw on
๋ฉ์๋๋ฅผ ์ ํ์ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ ํ์ฅ ๋ฉ์๋๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์๋ ์๋ฉ๋๋ค. ํ์ฅ ๋ฉ์๋๋ ์ ํ์ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ ๋ฐฑ์ ์ ๋๋ค(์: ์ธํฐํ์ด์ค์ด๊ฑฐ๋ .NET Framework์ ๋ ๋น ๋ฅด๊ฒ ์ ๋ฌํ๋ ค๋ ๊ฒฝ์ฐ).
Dupes: ๋์ผํ ํญ๋ชฉ์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋๋ง ์ ๋ฐ์ดํธํ๋ฉด ๋ฉ๋๊น? ๊ทธ๋ฌ๋ฉด ๊ทธ๋ค์ ๋ฌ๋ผ์ง๋๋ค?
๋์ง๋ ๋ฐฉ๋ฒ: ๊ธฐ๋ณธ์ ์ผ๋ก ๋ํผ์ด๊ณ ๊ทธ๋ด๊น์?
public void Remove(TElement element)
{
if (!TryRemove(element))
{
throw new Exception();
}
}
์์ธ๋ฅผ ํตํ ์ ์ด ํ๋ฆ์ด์ง๋ง?
@benaadams API ๋ฆฌ๋ทฐ ๋ ธํธ๋ก ๋ด ๋ต์ฅ์ ํ์ธ ํ์ธ์ :
Update
- ์ฌ์ฉ์๋ Remove
ํ ๋ค์ ๋ค๋ฅธ ์ฐ์ ์์๋ก ๋ค์ Enqueue
ํญ๋ชฉ์ ํ ์ ์์ต๋๋ค.Remove
๋ ์ฒซ ๋ฒ์งธ ๋ฐ๊ฒฌ ํญ๋ชฉ๋ง ์ ๊ฑฐํด์ผ ํฉ๋๋ค( List
์ฒ๋ผ).์์ธ๋ฅผ ํตํ ์ ์ด ํ๋ฆ์ด์ง๋ง?
๋น์ ์ด ๋ฌด์จ ๋ป์ธ์ง ํ์คํ์ง. BCL์์ ๊ฝค ํํ ํจํด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์์ธ๋ฅผ ํตํ ์ ์ด ํ๋ฆ์ด์ง๋ง?
๋น์ ์ด ๋ฌด์จ ๋ป์ธ์ง ํ์คํ์ง.
TryX ๋ฉ์๋๋ง ์๋ ๊ฒฝ์ฐ
์์ธ ๊ฐ์ ์์; ๊ทธ๋ฌ๋ ์ด๋ฆ์ ๋ฐํ์ ๋ฒ๋ฆฌ๊ธฐ๋ก ๊ฒฐ์ ํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
Try๊ฐ ์๋ ์์ธ ๋ฐ์ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒฝ์ฐ
๋ฐ๋ผ์ ํ๋ฆ ์ ์ด์ ๋ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉ ํ๋ ์ํฐ ํจํด์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ์ฝ๊ฐ ๋ถํ์ํด ๋ณด์ ๋๋ค. ๋ค์ ์์ฑํ๊ธฐ ์ํด false์ธ ๊ฒฝ์ฐ ํญ์ throw๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
BCL์์ ๊ฝค ํํ ํจํด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
TryX ๋ฉ์๋๋ ์๋ BCL์์ ์ผ๋ฐ์ ์ธ ํจํด์ด ์๋์์ต๋๋ค. Concurrent ์ ํ๊น์ง (2.0์ Dictionary.TryGetValue
๊ฐ ์ฒซ ๋ฒ์งธ ์์ผ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?)
์๋ฅผ ๋ค์ด TryX ๋ฉ์๋๋ Queue ๋ฐ Stack์ฉ Core์๋ง ์ถ๊ฐ๋์์ผ๋ฉฐ ์์ง Framework์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
IComparer
๋
ธ์ถํฉ๋๋ค. ๊ณ ๊ฐ์ด ์์ ์ฑ์ ์ํ๋ฉด ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ตฌํ ์์ StablePriorityQueue
๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ฌ์ธ ๊ฒ์
๋๋ค. ์์์ "๋์ด"๋ฅผ ์ ์ฅํ๊ณ ๋น๊ตํ๋ ๋์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.๊ทธ๋ฌ๋ฉด API ์ถฉ๋์ด ์์ต๋๋ค. ์ด์ ๊ธฐ์กด Queue<T>
์ ํจ๊ป ์๋ํ๋๋ก ๊ฐ๋จํ IQueue<T>
๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
public interface IQueue<T> :
IEnumerable,
IEnumerable<T>,
IReadOnlyCollection<T>
{
void Enqueue(T element);
T Peek();
T Dequeue();
bool TryPeek(out T element);
bool TryDequeue(out T element);
}
์ฐ์ ์์ ๋๊ธฐ์ด์๋ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
IQueue<TElement>
๊ตฌํํฉ๋๋ค.IQueue<(TElement, TPriority)>
๊ตฌํํฉ๋๋ค.๋๋ ๋จ์ํ ์ซ์ (1)๊ณผ (2)๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฒฝ๋ก์ ์๋ฏธ๋ฅผ ์ธ ๊ฒ์ ๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์์ ์์์ ์ฐ์ ์์(ํ์ฌ ์๋ฃจ์ )๋ฅผ ๋ชจ๋ ๋๊ธฐ์ด์ ๋ฃ์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ ํ์์๋ ํ๋์ ์์๋ง ์ถ๊ฐํฉ๋๋ค.
Enqueue(TElement)
๋
ธ์ถํฉ๋๋ค. ์ด๋ ์ฐ์ ์์๊ฐ ์๋ ์์๋ฅผ ์ฝ์
ํ๋ ๊ฒฝ์ฐ ์ฐ์ ์์ ํ์ ๋ํด ๋งค์ฐ ์ด์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ์ด์ฉ ์ ์์ด... ๋ฌด์์ ํด์ผ ํฉ๋๊น? default(TPriority)
? ์๋...Enqueue((TElement, TPriority) element)
๋
ธ์ถํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ณธ์ง์ ์ผ๋ก ๊ทธ๋ค๋ก๋ถํฐ ์์ฑ๋ ํํ์ ๋ฐ์ ๋ ๊ฐ์ ์ธ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ง๋ ์ด์์ ์ธ API๊ฐ ์๋๋๋ค.์ด๋ฌํ ๋ฉ์๋๊ฐ TElement
๋ง ๋ฐํํ๊ธฐ๋ฅผ ์ํ์ต๋๋ค.
(TElement, TPriority)
๋ฐํํฉ๋๋ค.๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ณ๋์ ์ฐ์ ์์๊ฐ ์๋ PriorityQueue<T>
๋ฅผ ์ ๊ณตํ์ฌ ์ผ๋ถ ๋ฌธ์ ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
IComparable
๋ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋นํ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์์ค ์ฝ๋์ ์ ํ์ผ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋์).๋ ๊ฐ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ ๊ณตํ๋ฉด ์ ์ฒด ์๋ฃจ์ ์ด ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํด์ง ๊ฒ์ ๋๋ค. ๋ช ๊ฐ์ง ์ฐธ๊ณ ์ฌํญ์ด ์์ต๋๋ค.
PriorityQueue<T>
๋ ์ ์ฌ์ ์ผ๋ก IQueue<T>
๊ตฌํํ ์ ์์ต๋๋ค.PriorityQueue<TElement, TPriority>
๋ IQueue
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ๋ฉด ์ด์ํ API๋ฅผ ๋
ธ์ถํฉ๋๋ค.๊ธ์์... ํจ๊ณผ ๊ฐ ์์ ๊ฒ ์ ๋๋ค. ์ด์์ ์ด์ง๋ ์์ต๋๋ค.
์ค๋ณต์ ํ์ฉํ๊ณ ํธ๋ค ๊ฐ๋ ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์ ๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋งค๋ฒ ์ ์ฒด ์ปฌ๋ ์ ์ ์์งํ๊ฒ ๋ฐ๋ณตํ์ง ์๊ณ ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์์ฒด ๊ตฌํ์ ์ ๊ณตํด์ผ ํ๋ Java์ ์๋ ๊ฒ์ผ๋ก ์ด์ด์ง๋๋ค.
์๋ก์ด ํธ๋ค ์ ํ์ ์ถ๊ฐํ๊ณ ์ถ์ง ์๋ค๋ ๊ฐ์ ํ์, ์์ ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐ๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๊ธฐ ์ํด(๋ํ ํจ์จ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด) ๋ค๋ฅด๊ฒ ํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ๋์ฒด ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
void Enqueue(TElement element, TPriority priority, out object handle);
void Update(object handle, TPriority priority);
void Remove(object handle);
์ด ๊ทธ๊ฒ์ด ๊ฒ์ฒ๋ผ, ์
๋ฐ์ดํธ ๋ฐ ์์๋ฅผ ์ ๊ฑฐ (์ ์ ์ ํ ์ ์ด๋ฅผ ํ ๋ฐ O (N)์์ ๊ทธ๊ฒ์ํ์ง ์๋ ์ฌ๋๋ค์์ํ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์
๋๋ค List
stuck_out_tongue_winking_eye : :).
๊ทธ๋ฌ๋ ๋ ๋์ ์ ์ ๊ณ ๋ คํด ๋ด ์๋ค ...
๋๋ ์ฐ์ ์์ ๋๊ธฐ์ด ์์ ์ด ๊ธฐ๋ฅ์ ์์ ํ ์ ๊ฑฐํ๊ณ ๋์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ง์ ์ด์ ์ด ์์ต๋๋ค.
Heap
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์์
์ ์ํํ ์ ์์ต๋๋ค.PriorityQueue
๋ฐ๋ก ์์
์ ์์ ์ ์ฝ๋๋ฅผ ์ํ๋ ์ฌ๋๋ค์ ์ํด -.PriorityQueue
์์ ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๋ ์ด์ ์ ์ถฉ์์ด ์๋๋๋ค.Heap
์ ์กด์ฌ๋ฅผ ์ธ์ํ ๊ฒ์ด๋ผ๋ ๋๋๊ณผ ์กฐํ๋ฅผ ์ด๋ฃน๋๋ค. ๊ทธ๋ค์ ๋ํ PriorityQueue
์ ์ ํ ์ฌํญ์ ์๊ณ ์์ผ๋ฏ๋ก ๋์ Heap
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(์๋ฅผ ๋ค์ด ์์ ์
๋ฐ์ดํธ/์ ๊ฑฐ์ ๋ํด ๋ ๋ง์ ์ ์ด ๊ถํ์ ์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ). ์๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํฌ์ํ์ฌ ์์ ์ ์ธ ๊ตฌ์กฐ).IQueue
์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ํ๊ณผ ๊ธฐ๋ฅ์ด ํ ํ๋์ ๋์ ธ์ง๊ธฐ ๋๋ฌธ์
๋๋ค. PriorityQueue
์ API๋ ์ถ์ํ๋ฅผ ํตํด Queue
์ ํธํ๋๋๋ก ํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.IPriorityQueue
์ด์ ์ธํฐํ์ด์ค๋ฅผ (์ฐ๋ฆฌ๋ ์คํ๋ ค์ ๊ธฐ๋ฅ ์ ์ง์ ์ด์ PriorityQueue
๋ฐ Queue
์ ์ฌํ). ๋์ ํ ์์ญ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฑฐ๊ธฐ์ IHeap
๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์ด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๊ฒ ์์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ณ๊ฒ ๋๊ปด์ง๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ฐ๋ฆฌ๋ ํ ์ ์ฐ์ ์์ ๋๊ธฐ์ด ๋ณด๋ค ๋ ๋ฐ์ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ฏ๋ก ํด๋น ์์ญ์์ ํ์ฅ์ด ์ ๊ณต๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ํ์ฅ์ PriorityQueue
์์ ์ํํ ์ ํ๊ณผ ๋ณ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.PriorityQueue
๋ํ IHeap
์์ฑ์๋ฅผ ๊ณ ๋ คํ ํ์๊ฐ ์์ต๋๋ค.Heap
๊ฐ ์ฐ๋ฆฌ์ ๋ช
๋ น์ ๋ฐ๋ผ ์์ ๊ฒ์
๋๋ค!๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฑ๋ฅ, ์ฑ๋ฅ ๋ฐ ์ ์ฐ์ฑ์ ํฌ์ํ๋ฉด์ ์ฃผ๋ก ์ฌ์ฉ ํธ์์ฑ์ ์ค์ ์ ๋ก๋๋ค. ํ์ ์ฐ์ ์์ ๋๊ธฐ์ด์์ ๊ฒฐ์ ์ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ์๋ฏธ๋ฅผ ์๊ณ ์๋ ์ฌ๋๋ค์ ์ํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ถฉ์์ผ๋ก ๋ง์ ๋ฌธ์ ๋ฅผ ์ํํฉ๋๋ค.
์คํ์ ์ํ ๊ฒ์ด๋ผ๋ฉด ์ง๊ธ์ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ปค๋ฎค๋ํฐ์ ๋ฌผ์ด๋ณด์. ๋ชจ๋ ์ฌ๋์ด ์ด ์ค๋ ๋๋ฅผ ์ฝ๋ ๊ฒ์ ์๋๋๋ค. ๋ค๋ฅธ ๊ท์คํ ์๊ฒฌ๊ณผ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ๋์? ๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ๋ฌํ ์๋ฃจ์ ์ ์ข์ํฉ๋๋ค. ๋ชจ๋๊ฐ ํ๋ณตํ ๊ฒ ๊ฐ์์.
์ค์ ์ฐธ๊ณ ์ฌํญ: ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ํ๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด๊ณผ ํ์ ํจ๊ป ์ค๊ณํด์ผ
์์ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด์ด IQueue<T>
๋ฅผ ๊ตฌํํ๊ณ ์ ํ๊ธฐ์ ๋ํ ์ง์์ ์ค๋จํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ํ๋์ ์ ๋ค๋ฆญ ์ ํ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ (user data, priority)
๋ณ๋๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ ๋ํผ๋ฅผ ์ ๊ณตํด์ผ ํจ์ ์๋ฏธํ์ง๋ง ์ด๋ฌํ ์๋ฃจ์
์ ์ฌ์ ํ โโ์ง๊ด์ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ชจ๋ ์
๋ ฅ ํ์์ ํ์ฉํ๋ค๋ ๊ฒ์
๋๋ค(๊ทธ๋์ ์ ํ๊ธฐ๋ฅผ ๋์ผ๋ฉด ์ด๋ฐ ์์ผ๋ก ์ํ๋์ด์ผ ํจ). ์ ํ๊ธฐ๊ฐ ์์ผ๋ฉด Enqueue(TElement, TPriority)
๋ ์ด๋ฏธ ๋น๊ต ๊ฐ๋ฅํ ์ ํ์ ํ์ฉํ์ง ์์ต๋๋ค. ๋จ์ผ ์ ๋ค๋ฆญ ํ์์ ์ด๊ฑฐ์๋ ์ค์ํ๋ฏ๋ก ์ด ๋ฉ์๋๋ฅผ IQueue<T>
ํฌํจํ ์ ์์ต๋๋ค.
@svic
์ด๊ฑฐํ ๋ ์์๊ฐ ์ด๋ค ์์๋ก ๋ฐํ๋๋์ง ์ ์๋์ด ์์ต๋๊น? ๋ด ์๊ฐ ์ ํจ์จ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์ ์๋์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฑฐํ๋ ๋์ ์์๋ฅผ ๊ฐ์ง๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ปฌ๋ ์
์ ์ ๋ ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ์ด ๋จ์ํ OrderBy
๋ฅผ ์คํํ๊ณ ๊ฑฐ์ ๋์ผํ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์์ผ๋ฏ๋ก ์ ์๋์ง ์์์ผ ํฉ๋๋ค(๊ทธ๋ฌ๋ ์ผ๋ถ ์ฌ๋๋ค์ ํ์ํ์ง ์์).
์์ด๋์ด: ์ฐ์ ์์ ํ์์ ์ด๊ฒ์ ์ ๋ ฌ๋์ง ์์ ํ์์ ์ ๋ ฌ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ถ์ด ์ข์์ง๋ค. ์ด๋ป๊ฒ ๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์์๋๋ก ๋ฐ๋ณตํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํ์ ํ์คํ ์๋๋๋ค. ์ ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ค๋ฅธ ์ด์ ์ ๋๋ค.
@pgolebiowski
๊ทธ ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. Delivering IQueue then
์น์
์์ ์ค๋ณต ์์๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ ์ ํ๊ธฐ์ ๋์์ผ๋ก "ํ๋์ ์ผ๋ฐ ์ ํ"์ ๋ํด T : IComparable<T>
๋ฅผ ์ ์ํ์๊ฒ ์ต๋๊น?
๋๋ ๋ ๊ฐ์ง ๋ณ๋์ ์ ํ์ ๊ฐ๋ ๊ฒ์ ์ง์งํ ๊ฒ์ ๋๋ค.
object
๋ฅผ ํธ๋ค ์ ํ์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ์ ์ ํ์ ์์ฑํ์ง ์๊ธฐ ์ํ ๊ฒ์
๋๊น? ์ ์ ํ์ ์ ์ํ๋ฉด ๊ตฌํ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ฉด์ API๋ฅผ ์ค์ฉํ๊ธฐ ๋ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ( string
๋ฅผ Remove(object)
๋ก ์ ๋ฌํ๋ ค๊ณ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?) ์์ ์์ฒด๋ฅผ Remove(object)
์ ์ ๋ฌํ๊ณ ์๋ํ ๊ฒ์ ๋ํด ๋๊ฐ ๋๋ฅผ ๋น๋ํ ์ ์์ต๋๊น?).
๋ณด๋ค ํํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ํด ํธ๋ค ๋ฉ์๋์์ object
๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ์ ์ ํ๊ฒ ๋ช
๋ช
๋ ๋๋ฏธ ์ ํ์ ์ถ๊ฐ๋ฅผ ์ ์ํฉ๋๋ค.
๋๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ์ด ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ๋ฅ๊ฐํ๋ ๊ฒฝ์ฐ ํธ๋ค ์ ํ์ ์ํ๋ ํ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ(์ธํฐํ์ด์ค์ ์ ํ ์์ ์ฑ์ ํฅ์์ํค๋ Generic์ด์ด์ผ ํจ) ("Handle ๊ณต๊ธ์ด ์์ฑ๋์์ต๋๋ค. ๋ค๋ฅธ ๋๊ธฐ์ด์ ์ํด") ๋๋ ์ด๋ฏธ ์ฌ์ฉ๋์๋์ง ์ฌ๋ถ("Handle์์ ์ฐธ์กฐํ๋ ์์๊ฐ ์ด๋ฏธ ์ ๊ฑฐ๋์์ต๋๋ค").
ํธ๋ค ์์ด๋์ด๊ฐ ๊ณ์ ์งํ๋๋ฉด ์ด ์ ๋ณด๊ฐ ์ ์ฉํ๋ค๊ณ ์๊ฐ๋๋ฉด ์ด๋ฌํ ์์ธ์ ํ์ ์งํฉ๋ ํด๋น TryRemove
๋ฐ TryUpdate
๋ฉ์๋์ ์ํด throw๋ฉ๋๋ค. ์์๊ฐ ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋์๊ฑฐ๋ ํธ๋ค์ ์ํด ์ ๊ฑฐ๋์๊ธฐ ๋๋ฌธ์ ์์๊ฐ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ ์ง๋ฃจํ๊ณ ์ผ๋ฐ์ ์ด๋ฉฐ ์ ์ ํ๊ฒ ๋ช
๋ช
๋ ํธ๋ค ์ ํ์ ์๋ฐํฉ๋๋ค.
@๋น์ฃผ์ผ๋ฉ๋ก
Delivering IQueue then
์น์ ์์ ์ค๋ณต ์์๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ ์ ํ๊ธฐ์ ๋์์ผ๋ก "ํ๋์ ์ผ๋ฐ ์ ํ"์ ๋ํดT : IComparable<T>
๋ฅผ ์ ์ํ์๊ฒ ์ต๋๊น?
์ด๋ฅผ ๋ช ํํ ํ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค.
T
์ ๋ํ ์ ์ฝ ์์ด PriorityQueue<T>
์ ๋ฌํ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค.IComparer<T>
ํฉ๋๋ค.T
๊ฐ ์ด๋ฏธ ๋น๊ต ๊ฐ๋ฅํ ๊ฒฝ์ฐ Comparer<T>.Default
๊ฐ ๊ฐ์ ๋ฉ๋๋ค(์ธ์ ์์ด ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์์).์ ํ๊ธฐ๋ ๋ชจ๋ ์ ํ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ก์ต๋๋ค. ๋ช ๊ฐ์ง ๊ตฌ์ฑ์ด ์์ต๋๋ค.
๋๋ฌธ ๊ฒฝ์ฐ๋ PriorityQueue<T>
์์๋ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ์ค์ํ ๊ฒ์ ์ด์ (1), (2), (3)์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ์ ๋ค๋ฆญ ์ ํ์ด ์๋ ๊ฒฝ์ฐ Enqueue(TElement, TPrioriity)
์ ๊ฐ์ ๋ฉ์๋๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ (1)์ผ๋ก ์ ํํฉ๋๋ค. (2) ์ค๋ณต์ผ๋ก ์ด์ด์ง ๊ฒ์
๋๋ค. (3) ์์ฒญ๋๊ฒ ๋ชป์๊ฒผ์ ๊ฒ์ด๋ค. ์์ IQueue > Enqueue
์น์
(๋ ๋ฒ์งธ Enqueue
๋ฉ์๋ ๋ฐ default(TPriority
)์ ์ด์ ๋ํ ์ถ๊ฐ ์ ๋ณด๊ฐ ์์ต๋๋ค.
์ด์ ๋ ๋ช ํํด์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
BTW ์ด๋ฌํ ์๋ฃจ์
์ ๊ฐ์ ํ๋ฉด PriorityQueue<T>
๋ฐ IQueue<T>
์ API๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. Queue<T>
์ ๋ฉ์๋ ์ค ์ผ๋ถ๋ฅผ IQueue<T>
์ง์ด๋ฃ๊ณ PriorityQueue<T>
๊ตฌํํ๋๋ก ํ์ญ์์ค. ํ๋ค! ๐
object
๋ฅผ ํธ๋ค ์ ํ์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ์ ์ ํ์ ์์ฑํ์ง ์๊ธฐ ์ํ ๊ฒ์ ๋๊น?
PriorityQueue<T>
๋ System.Collections.Generic
์ ์๊ณ ํ ๊ธฐ๋ฅ์ System.Collections.Specialized
์์ต๋๋ค. ๊ฑฐ๊ธฐ์์ ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ์ ํ์ ๋์
ํ ๋ ๋์ ๊ธฐํ๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ๊ฒฐ๊ตญ ํ๋ฅญํ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ ๊ฐ์ง๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์
๋๋ค.๋๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ์ด ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ๋ฅ๊ฐํ๋ ๊ฒฝ์ฐ ํธ๋ค ์ ํ์ ์ํ๋ ํ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ(์ธํฐํ์ด์ค์ ์ ํ ์์ ์ฑ์ ํฅ์์ํค๋ Generic์ด์ด์ผ ํจ) ("Handle ๊ณต๊ธ์ด ์์ฑ๋์์ต๋๋ค. ๋ค๋ฅธ ๋๊ธฐ์ด์ ์ํด") ๋๋ ์ด๋ฏธ ์ฌ์ฉ๋์๋์ง ์ฌ๋ถ("Handle์์ ์ฐธ์กฐํ๋ ์์๊ฐ ์ด๋ฏธ ์ ๊ฑฐ๋์์ต๋๋ค").
ํธ๋ค ์์ด๋์ด๊ฐ ๊ณ์ ์งํ๋๋ค๋ฉด ์ด ์ ๋ณด๊ฐ ์ ์ฉํ๋ค๊ณ ์๊ฐ๋๋ฉด...
ํ์คํ ๋ ๋ง์ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค : ์ํฌ :. ํนํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปค๋ฎค๋ํฐ์์ ์ด ๋ชจ๋ ๊ฒ์ ํ์ฅํฉ๋๋ค.
๋ ๊ฐ์ ํด๋์ค๋ฅผ ๋ง๋๋ ์์ด๋์ด๋ ๋ง์ ์๋ฏธ๊ฐ ์๊ณ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๊ฐ์ง๊ณ ์์ง๋ง PriorityQueue<T>
๊ฐ ๋ด๋ถ์ ์ผ๋ก Heap<T>
๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ ๊ธ ๊ธฐ๋ฅ์ "์จ๊ธฐ๊ธฐ"ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก...
IQueue<T>
public interface IQueue<T> :
IEnumerable,
IEnumerable<T>,
IReadOnlyCollection<T>
{
int Count { get; }
void Clear();
bool Contains(T element);
bool IsEmpty();
void Enqueue(T element);
T Peek();
T Dequeue();
bool TryPeek(out T element);
bool TryDequeue(out T element);
}
System.Collections.Generic
.Remove
๋ฐ TryRemove
). ํ์ง๋ง Queue<T>
์์ต๋๋ค. ํ์ง๋ง ํ์ํ์ง ์์ต๋๋ค.PriorityQueue<T>
public class PriorityQueue<T> : IQueue<T>
{
public PriorityQueue();
public PriorityQueue(IComparer<T> comparer);
public PriorityQueue(IEnumerable<T> collection);
public PriorityQueue(IEnumerable<T> collection, IComparer<T> comparer);
public IComparer<T> Comparer { get; }
public int Count { get; }
public bool IsEmpty();
public void Clear();
public bool Contains(T element);
public void Enqueue(T element);
public T Peek();
public T Dequeue();
public bool TryPeek(out T element);
public bool TryDequeue(out T element);
public void Remove(T element);
public bool TryRemove(T element);
public IEnumerator<T> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
}
System.Collections.Generic
.IComparer<T>
๊ฐ ๋ฐฐ๋ฌ๋์ง ์์ผ๋ฉด Comparer<T>.Default
๊ฐ ์ํ๋ฉ๋๋ค.Remove
๋ฐ TryRemove
๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๋ง ์ ๊ฑฐํฉ๋๋ค(์ฐพ๋ ๊ฒฝ์ฐ).์ง๊ธ ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ์ฐ๋ ๊ฒ์ ์๋์ง๋ง:
System.Collections.Specialized
.IQueue์ ๋์
IQueue์ ์ฌ์
IQueue์ "int Count { get; }" ์ถ๊ฐ ๊ณ ๋ ค
IQueue์ TryPeek, TryDequeue์ ๊ดํ ์ธํ๋ฆฌ์์
IsEmpty๋ ์ด์์น์ฒ๋ผ ๋ณด์
๋๋ค. BCL์ ๋ค๋ฅธ ์ปฌ๋ ์
์ ํ์๋ ๋ง์ง ์์ต๋๋ค. ์ธํฐํ์ด์ค์ ์ถ๊ฐํ๋ ค๋ฉด Queue์ ์ถ๊ฐ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
TryRemove๋ฅผ ์ญ์ ํ๊ณ Remove๋ฅผ "bool Remove"๋ก ๋ณ๊ฒฝํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ปฌ๋ ์ ํด๋์ค์ ์ ๋ ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ "์ปฌ๋ ์ ์ remove()๋ throwํ์ง ์์ต๋๋ค"๋ผ๋ ๋ง์ ๊ทผ์ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ ํ ์คํธํ์ง ์๋ ์์ญ์ด๋ฉฐ ์ ์์ ์ธ ๋์์ด ๋ณ๊ฒฝ๋๋ฉด ๋ง์ ๋๋ผ์์ ์ ๋ฐํ ๊ฒ์ ๋๋ค.
์ด์ ์ธ์ฉ์์ @pgolebiowski
- ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ์ฐ์ ์์์ ๋ณ๊ฐ์ ๋๋ค(๋ฌผ๋ฆฌ์ ์ธ์คํด์ค 2๊ฐ).
- ์ฌ์ฉ์ ๋ฐ์ดํฐ์๋ ์ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
- ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ ์ ๋๋ค.
- ๋๋ฌธ ๊ฒฝ์ฐ: ์ฐ์ ์์๋ ๋ค๋ฅธ ๋ ผ๋ฆฌ๋ฅผ ํตํด ์ป์ ์ ์์ต๋๋ค(์ฌ์ฉ์ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์).
๋ํ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ต๋๋ค. 5. ์ฌ์ฉ์ ๋ฐ์ดํฐ์๋ ์ฌ๋ฌ ํ๋์ ์ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค(Lucene.net์์ ๋ณธ ๊ฒ์ฒ๋ผ).
TryPeek์ ๊ดํ ์ธํ๋ฆฌ์์ IQueue์ TryDequeue๋ ๋๊ธฐ์ด์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
๊ทธ๋ค์ System/Collections/Generic/Queue.cs#L253-L295์ ๋๋ค.
๋ฐ๋ฉด Queue์๋
c#
public void Remove(T element);
public bool TryRemove(T element);
IReadOnlyCollection์์ ์์ํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด Count๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ํ๊ธฐ ์ํด IQueue์ "int Count { get; }"์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์ข์์. ์์ ํฉ๋๋ค.
IsEmpty๋ ์ด์์น์ฒ๋ผ ๋ณด์ ๋๋ค. BCL์ ๋ค๋ฅธ ์ปฌ๋ ์ ์ ํ์๋ ๋ง์ง ์์ต๋๋ค.
์ด๊ฒ์ @karelz ์ ์ํด ์ถ๊ฐ๋์์ผ๋ฉฐ ๋ฐฉ๊ธ ๋ณต์ฌํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ข์ํ์ง๋ง API ๊ฒํ ์์ ๊ณ ๋ คํ ์ ์์ต๋๋ค :)
TryRemove๋ฅผ ์ญ์ ํ๊ณ Remove๋ฅผ "bool Remove"๋ก ๋ณ๊ฒฝํฉ๋๋ค.
Remove
๋ฐ TryRemove
๋ ์ด์ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ๊ณผ ์ผ์นํ๋ค๊ณ ์๊ฐํฉ๋๋ค( Peek
๋ฐ TryPeek
๋๋ Dequeue
๋ฐ TryDequeue
).
- ์ฌ์ฉ์ ๋ฐ์ดํฐ์๋ ์ฌ๋ฌ ํ๋์ ์ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด๊ฒ์ ์ ํจํ ์ ์ด์ง๋ง ์ฌ์ค ์ด๊ฒ์ ์ ํ๊ธฐ๋ก๋ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค(๊ฒฐ๊ตญ ๋ชจ๋ ํจ์์) -- ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํ์ ๋ํ ๊ฒ์ ๋๋ค.
IsEmpty๋ ์ด์์น์ฒ๋ผ ๋ณด์ ๋๋ค. BCL์ ๋ค๋ฅธ ์ปฌ๋ ์ ์ ํ์๋ ๋ง์ง ์์ต๋๋ค.
FWIW, bool IsEmpty { get; }
๋ IProducerConsumerCollection<T>
์ถ๊ฐํ์ผ๋ฉด ํ๋ ๊ฒ์
๋๋ค. ๊ทธ ์ดํ๋ก ์ฌ๋ฌ ๋ฒ ์กด์ฌํ์ง ์๋ ๊ฒ์ด ์์ฌ์ ์ต๋๋ค. ๊ทธ๊ฒ์ด ์์ผ๋ฉด ๋ํผ๋ ์ข
์ข
Count == 0
์ ๋๋ฑํ ์์
์ ์ํํด์ผ ํ๋ฉฐ, ์ด๋ ์ผ๋ถ ์ปฌ๋ ์
, ํนํ ๋๋ถ๋ถ์ ๋์ ์ปฌ๋ ์
์์ ๊ตฌํํ๋ ๊ฒ์ด ํจ์ฌ ๋นํจ์จ์ ์
๋๋ค.
@pgolebiowski ํ์ฌ API ๊ณ์ฝ๊ณผ ๋์์ธ ๊ทผ๊ฑฐ๊ฐ ํฌํจ๋ .md ํ์ผ ํ๋ ๊ฐ๋ฅผ ํธ์คํ ํ github ์ ์ฅ์๋ฅผ ๋ง๋๋ ์์ด๋์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ผ๋จ ์์ ํ๋๋ฉด ์ค๋น๊ฐ ๋๋ฉด CoreFxLabs๊น์ง PR์ ์ํํ๊ธฐ ์ ์ ์ด๊ธฐ ๊ตฌํ์ ๊ตฌ์ถํ๋ ์ฅ์๋ก ์ฌ์ฉํ ์ ์์ต๋๊น?
@svic
Peek
๋ฐDequeue
๊ฐ ์ฐ์ ์์์ ๋ํดout
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฐ์ ์์๋ฅผ ์ ํ ๋ฐํํ์ง ์๋ ์ค๋ฒ๋ก๋๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋จ์ํํ ์ ์์ต๋๋ค.
๋์. ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ์์๋ฅผ ๋ฌด์ํ๊ณ ์ฐ์ ์์ ๋๊ธฐ์ด์ ํญ๋ชฉ๋ง ์ด๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๊น?
์ข์ ์ง๋ฌธ. ๋ฌด์์ ์ ์ํ์๊ฒ ์ต๋๊น? IEnumerable<TElement> Elements { get; }
?
์์ ์ฑ - ์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ฐ์ ์์๊ฐ
(priority, version)
์๊ณผ ๊ฐ์์ผ ํจ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Update
๋ฅผ ๋
ผ๋ฆฌ์ ์ธ Remove
+ Enqueue
๋ก ๊ณ ๋ คํ์ฌ ์ด๋ฅผ ํผํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ์ ์์๊ฐ ๊ฐ์ ํญ๋ชฉ์ ๋์ ํญ๋ชฉ์ ํญ์ ์ถ๊ฐํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ต์ ๊ฒฐ๊ณผ 0์ -1๋ก ๊ฐ์ฃผ). ์๋ํด์ผ ํ๋ IMO.
@benaadams
TryX ๋ฉ์๋๋ ์๋ BCL์์ ์ผ๋ฐ์ ์ธ ํจํด์ด ์๋์์ต๋๋ค. Concurrent ์ ํ๊น์ง (2.0์
Dictionary.TryGetValue
๊ฐ ์ฒซ ๋ฒ์งธ ์์ผ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?)
์๋ฅผ ๋ค์ด TryX ๋ฉ์๋๋ Queue ๋ฐ Stack์ฉ Core์๋ง ์ถ๊ฐ๋์์ผ๋ฉฐ ์์ง Framework์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋๋ ์ฌ์ ํ BCL์ ์ต์ํ์ง ์๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค. API ๊ฒํ ํ์์ ์ต๊ทผ์ ๋ง์ Try*
๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ ์ฌ์ค์์ ์ ๋ ์ด๊ฒ์ด ํจ์ฌ ๋ ์ค๋ซ๋์ ์ผ๋ฐ์ ์ธ ํจํด์ด๋ผ๋ ์ธ์์ ๋ฐ์์ต๋๋ค ๐.
์ด๋ ์ชฝ์ด๋ , ๊ทธ๊ฒ์ ์ง๊ธ ์ผ๋ฐ์ ์ธ ํจํด์ด๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ ค์ํด์๋ ์๋ฉ๋๋ค. ํจํด์ด ์์ง .NET Framework์ ์๋ค๋ ์ฌ์ค์ด .NET Core์ ํ์ ์ ์ค๋จํด์๋ ์ ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ฃผ์ ๋ชฉ์ ์ธ ๋ ๋น ๋ฅธ ํ์ ์
๋๋ค.
@pgolebiowski
๋๋ ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์ด ๊ธฐ๋ฅ์ ์์ ํ ์ ๊ฑฐํ๊ณ ๋์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์ ์ด์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค
ํ , ์ฌ๊ธฐ ์ผ์ ์ด ์์ ์๋ ์๋ค๋ ๋ง์ด ์์ด์ ๐
์ด์ ์ง์งํ๊ฒ, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํญ์ ๋ชฉํ๋ก ์ผ์๋ ์ข์ ๋ฐฉํฅ์
๋๋ค. PriorityQueue
๋ Heap
๋ฅผ ํ์ง ์๋ ์ด์ ๊ฐ ๊ฒฐ์ฝ ์๋๋๋ค. Heap
๊ฐ CoreFX์ ํฌํจ๋์ง ์๊ณ CoreFXExtensions ๋ฆฌํฌ์งํ ๋ฆฌ์ PowerCollections์ ํจ๊ป ๊ณ ๊ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก "๊ทธ๋ฅ" ์ ์ง๋ ์ ์๋ค๋ ์ฌ์ค์ ์ฐ๋ฆฌ ๋ชจ๋ ๊ด์ฐฎ๋ค๋ฉด ์ ๋ ๊ด์ฐฎ์ต๋๋ค.
์ค์ ์ฐธ๊ณ ์ฌํญ: ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ํ๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด๊ณผ ํ์ ํจ๊ป ์ค๊ณํด์ผ ํฉ๋๋ค. ๋ชฉ์ ์ด ๋ค๋ฅด๊ณ ํ ์๋ฃจ์ ์ด ๋ค๋ฅธ ์๋ฃจ์ ์ด ์ ๊ณตํ์ง ์๋ ๊ฒ์ ์ ๊ณตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ํจ๊ป ํด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. IMO ์ฐ๋ฆฌ๋ PriorityQueue
์ ์ง์คํ๊ณ "์ ์ ํ" Heap
๋ฅผ ๋ณ๋ ฌ/๋์ค์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ ํจ๊ป ํ๋ฉด ์๊ด์์ง๋ง ์ฌ์ฉํ๊ธฐ ์ฌ์ด PriorityQueue
์ ์กด์ฌ๊ฐ "์ ์ ํ/๊ณ ์ฑ๋ฅ" ๊ณ ๊ธ Heap
๋์์ธ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฐ๋ ฅํ ์ด์ ๋ฅผ ๋ณด์ง ๋ชปํฉ๋๋ค.
IQueue
์์ฑํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทํ์ ์์ ์ ๊ฐ์ํ ๋ IQueue
์ ์ถ๊ฐํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. IMO ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ํ์๊ฐ ์๋ค๋ฉด ๊ทธ๊ฒ์ ๋น์ฐํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ PriorityQueue
( Enqueue
๋ฐ Update
์๋ง ํด๋น)์์ ์ ํ๊ธฐ๋ฅผ ํธ์ถํ ๋ ์ค๋ช
ํ๋ ๋ฐ ์ด์ํจ๊ณผ ๋ณต์กํจ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ ํ๊ธฐ ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค.
๋์ฒด(๊ฐ์ฒด) ํธ๋ค
๊ทธ๋ฌํ ๊ณผ๋ถํ IMO๋ฅผ ๊ฐ๋ ๊ฒ์ ์ค์ ๋ก ๋์ ์๊ฐ์ด ์๋๋๋ค(์ฝ๊ฐ ์ถ์
ํ๊ธด ํ์ง๋ง). ํธ๋ค์ด ์๋ชป๋ PriorityQueue
, ์ฆ O(log n)์์ ์จ ๊ฒ์์ ๊ฐ์งํ ์ ์์ด์ผ ํฉ๋๋ค.
API ๋ฆฌ๋ทฐ์ด๊ฐ ๊ฑฐ๋ถํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ค์ง๋ง IMO๋ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค...
์์
์์ ์ฑ์ด ์ฑ๋ฅ/๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋์ ํจ๊ป ์ ๊ณต๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค( Update
์ด๋ฏธ ๋จ์ด๋จ๋ ธ๊ฑฐ๋ Update
์ ๋
ผ๋ฆฌ์ ์ธ Remove
+ Enqueue
์ทจ๊ธํ๋ค๊ณ ๊ฐ์ ). ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ ๋์ด๋ฅผ ์ฌ์ค์ ํฉ๋๋ค). ๋น๊ต์ ๊ฒฐ๊ณผ 0์ -1๋ก ์ฒ๋ฆฌํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ข์ต๋๋ค ... ์๋๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น?
IQueue<T>
2๊ฐ์ ์ ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
PriorityQueue<T,U>
์ ํ์์ IQueue
์์ดPriorityQueue<T>
์ ํ๊ธฐ ๋ฐ IQueue
๊ฝค ๋ง์ ์ฌ๋๋ค์ด ์์์ ์์ํ์ต๋๋ค.
Re: @pgolebiowski์ ์ต์ ์ ์ - https://github.com/dotnet/corefx/issues/574#issuecomment -308427321
IQueue<T>
-Remove
๋ฐTryRemove
์ถ๊ฐํ ์ ์์ง๋งQueue<T>
์๋ ์์ต๋๋ค.
Queue<T>
์ถ๊ฐํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น? ( @eickle๋ ๋์) ๊ทธ๋ ๋ค๋ฉด ์ถ๊ฐ ํญ๋ชฉ๋ ๋ฒ๋ค๋ก
์ธํฐํ์ด์ค์ ์ถ๊ฐํ๊ณ ์์ฌ์ค๋ฝ๊ฑฐ๋ Queue<T>
์ถ๊ฐ๋ ํ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
IsEmpty
๋ํด ๋์ผ -- Queue<T>
๋ฐ Stack<T>
์ถ๊ฐ๊ฐ ํ์ํ ๊ฒ์ ๋ฌด์์ด๋ ์ธํฐํ์ด์ค์ ํ์ํฉ์๋ค(๊ฒํ ๋ฐ ์์ฝ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค).
@pgolebiowski IQueue<T>
์ ๊ตฌํ๋ ํด๋์ค ๋ชฉ๋ก๊ณผ ํจ๊ป ์๊ฒฌ์ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น?
PriorityQueue<T>
๊ตฌ์กฐ์ฒด ์ด๊ฑฐ์๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค( ์์ฆ์๋ ์ผ๋ฐ์ ์ธ BCL ํจํด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค). ์ค๋ ๋์์ ๋ ๋ฒ ํธ์ถ๋ ๋ค์ ์ญ์ /์ํ์ก์ต๋๋ค.
ํ
๋ค์์คํ์ด์ค ์ ํ: ์์ง ๋ค์์คํ์ด์ค ๊ฒฐ์ ์ ์๊ฐ์ ๋ญ๋นํ์ง ๋ง์. Heap
๊ฐ CoreFxExtensions์์ ๋๋๋ฉด ์ด๋ค ์ข
๋ฅ์ ๋ค์์คํ์ด์ค๋ฅผ ํ์ฉํ ์ง ์์ง ๋ชจ๋ฆ
๋๋ค. ์๋ง๋ Community.*
๋๋ ์ด์ ๋น์ทํ ๊ฒ์
๋๋ค. CoreFxExtensions ๋ชฉ์ /๋์ ๋ชจ๋ ๋
ผ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
์ฐธ๊ณ : CoreFxExtensions ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ํ ๊ฐ์ง ์์ด๋์ด๋ ๊ฒ์ฆ๋ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์๊ฒ ์ฐ๊ธฐ ๊ถํ์ ๋ถ์ฌํ๊ณ ํ์ํ ๋ .NET ํ/MS๊ฐ ์ค์ฌ์๊ฐ ๋๋ ์กฐ์ธ(API ๊ฒํ ์ ๋ฌธ ์ง์ ํฌํจ)๋ง ์ ๊ณตํ๋ .NET ํ์ด ์๋ ์ปค๋ฎค๋ํฐ์์ ์ฃผ๋ก ์ฃผ๋ํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฐฉ๋ฅํ๋ ๊ณณ์ด๋ผ๋ฉด System.*
๋๋ Microsoft.*
๋ค์์คํ์ด์ค์์ ์ํ์ง ์์ ๊ฒ์
๋๋ค. (๋ฉด์ฑ
์กฐํญ: ์ด๊ธฐ ์๊ฐ, ์์ง ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ๋ง์ญ์์ค. ๋ค๋ฅธ ๋์ ๊ฑฐ๋ฒ๋์ค ์์ด๋์ด๊ฐ ์งํ ์ค์
๋๋ค.)
TryRemove
ํ๊ณRemove
๋ฅผbool Remove
ํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ปฌ๋ ์ ํด๋์ค์ ์ ๋ ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ "์ปฌ๋ ์ ์ remove()๋ throwํ์ง ์์ต๋๋ค"๋ผ๋ ๋ง์ ๊ทผ์ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ ํ ์คํธํ์ง ์๋ ์์ญ์ด๋ฉฐ ์ ์์ ์ธ ๋์์ด ๋ณ๊ฒฝ๋๋ฉด ๋ง์ ๋๋ผ์์ ์ ๋ฐํ ๊ฒ์ ๋๋ค.
๐ ์ ์ด๋ ๋ค๋ฅธ ์ปฌ๋ ์
๊ณผ ์ ๋ ฌํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ค๋ฅธ ์ปฌ๋ ์
์ Remove
ํจํด์ ์ค์บํ ์ ์์ต๋๊น?
@ebickle ํ์ฌ API ๊ณ์ฝ๊ณผ ๋์์ธ ๊ทผ๊ฑฐ๊ฐ ํฌํจ๋ .md ํ์ผ ํ๋ ๊ฐ๋ฅผ ํธ์คํ ํ github ์ ์ฅ์๋ฅผ ๋ง๋๋ ์์ด๋์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
CoreFxLabs ์์ ์ง์ ํธ์คํ ํด ๋ณด๊ฒ ์ต๋๋ค. ๐
@karelz
์ฐ์ ์์๋ฅผ ๋ฌด์ํ๊ณ ์ฐ์ ์์ ๋๊ธฐ์ด์ ํญ๋ชฉ๋ง ์ด๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๊น?
์ข์ ์ง๋ฌธ. ๋ฌด์์ ์ ์ํ์๊ฒ ์ต๋๊น?
IEnumerable<TElement> Elements { get; }
?
์, ๋๋ ElementsCollection
๋ฐํํ๋ ์์ฑ์ด ๊ฐ์ฅ ์ข์ ์ต์
์ผ ๊ฒ์
๋๋ค. ํนํ Dictionary<K, V>.Values
์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์.
์ฐ์ ์์๊ฐ ๊ฐ์ ํญ๋ชฉ์ ๋์ ํญ๋ชฉ์ ํญ์ ์ถ๊ฐํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ต์ ๊ฒฐ๊ณผ 0์ -1๋ก ๊ฐ์ฃผ). ์๋ํด์ผ ํ๋ IMO.
๊ทธ๊ฒ์ ํ์ด ์๋ํ๋ ๋ฐฉ์์ด ์๋๋ฉฐ "๊ฐ์ ์ฐ์ ์์ ํญ๋ชฉ์ ๋"์ด ์์ต๋๋ค. ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํญ๋ชฉ์ ํ ์ ์ฒด์ ๋ถ์ฐ๋ ์ ์์ต๋๋ค(ํ์ฌ ์ต์๊ฐ์ ๊ฐ๊น์ง ์์ ๊ฒฝ์ฐ).
๋ค์ ๋งํด์, ์์ ์ฑ์ ์ ์งํ๊ธฐ ์ํด์๋ ์ฝ์
ํ ๋ ๋ฟ๋ง ์๋๋ผ ๋์ค์ ํ์์ ํญ๋ชฉ์ ์ด๋ํ ๋๋ 0์ ๋น๊ต์ ๊ฒฐ๊ณผ๋ฅผ -1๋ก ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋๋ก ํ๋ ค๋ฉด version
์ priority
์ ๊ฐ์ ๊ฒ์ ์ ์ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ดํ
- Remove ๋ฐ TryRemove๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง Queue ๊ทธ๊ฒ๋ค์ด ์์ต๋๋ค.
๋๊ธฐ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น?
? ( @eickle๋ ๋์) ๊ทธ๋ ๋ค๋ฉด ์ถ๊ฐ ํญ๋ชฉ๋ ๋ฒ๋ค๋ก
Remove
๋ฅผ IQueue<T>
์ถ๊ฐํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Contains
๊ฐ ์ด์ํ๋ค๊ณ ์ ์ํ ์๋ ์์ต๋๋ค. NotSupportedException์ ๋์ง๊ธฐ ์์ํ์ง ์๋ ํ ์ธํฐํ์ด์ค์ ์ ์ฉ์ฑ๊ณผ ์ฌ์ฉํ ์ ์๋ Queue ์ ํ์ ์ ํํฉ๋๋ค. ์ฆ, ๋ฒ์๋ ๋ฌด์์
๋๊น?
๋ฐ๋๋ผ ๋๊ธฐ์ด, ๋ฉ์์ง ๋๊ธฐ์ด, ๋ถ์ฐ ๋๊ธฐ์ด, ServiceBus ๋๊ธฐ์ด, Azure Storage ๋๊ธฐ์ด, ServiceFabric Reliable Queues ๋ฑ์ ์ํ ๊ฒ์ ๋๊น? (๋น๋๊ธฐ ๋ฐฉ๋ฒ์ ์ ํธํ๋ ์ผ๋ถ์ ๋ํด ์ค๋ช )
๊ทธ๊ฒ์ ํ์ด ์๋ํ๋ ๋ฐฉ์์ด ์๋๋ฉฐ "๊ฐ์ ์ฐ์ ์์ ํญ๋ชฉ์ ๋"์ด ์์ต๋๋ค. ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํญ๋ชฉ์ ํ ์ ์ฒด์ ๋ถ์ฐ๋ ์ ์์ต๋๋ค(ํ์ฌ ์ต์๊ฐ์ ๊ฐ๊น์ง ์์ ๊ฒฝ์ฐ).
๊ณต์ ํ ํฌ์ธํธ. ๋๋ ๊ทธ๊ฒ์ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ก ์๊ฐํ๊ณ ์์๋ค. ๋ด ds ๊ธฐ๋ณธ์ ๋ฆ์ ํ์๊ฐ ์์ต๋๋ค. :)
๊ธ์, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ค๋ฅธ ds(๋ฐฐ์ด, ์ด์ง ๊ฒ์ ํธ๋ฆฌ(๋๋ ๊ณต์ ์ด๋ฆ์ด ๋ฌด์์ด๋ ) - @stephentoub ์ ์์ด๋์ด/์ ์์ด ์์)๋ก ๊ตฌํํ๊ฑฐ๋ ์์์ ์์๋ก ์ ์ฐฉํฉ๋๋ค. version
๋๋ age
ํ๋๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์์ ์ฑ์ ๋ณด์ฅํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@ebickle ํ์ฌ API ๊ณ์ฝ๊ณผ ๋์์ธ ๊ทผ๊ฑฐ๊ฐ ํฌํจ๋ .md ํ์ผ ํ๋ ๊ฐ๋ฅผ ํธ์คํ ํ github ์ ์ฅ์๋ฅผ ๋ง๋๋ ์์ด๋์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
@karelz CoreFxLabs ์์ ์ง์ ํธ์คํ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์๋ฅผ ์ดํด๋ณด์ญ์์ค.
2๊ฐ์ ์ ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ฐ์ ์์ ํ
์ ํ๊ธฐ ๋ฐ IQueue ์์ด(๋ณต์กํ ์ ์์) - ์ฐ์ ์์ ํ
์ ํ๊ธฐ ๋ฐ IQueue ์ฌ์ฉ
์ ํ๊ธฐ๋ฅผ ์์ ์์ด์ต๋๋ค. ํ๋์ ํตํฉ๋ PriorityQueue<T, U>
์ํ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค. ๋ ๊ฐ์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ - ๊ธ์, ๋น๊ต์๋ก ์ถฉ๋ถํฉ๋๋ค.
์ถ๊ฐ/๋ณ๊ฒฝ/์ ๊ฑฐํ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
@pgolebiowski
๋ฌธ์๊ฐ ์ข์ ๋ณด์ ๋๋ค. .NET ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ณผ ๊ฒ์ผ๋ก ๊ธฐ๋๋๋ ๊ฒฌ๊ณ ํ ์๋ฃจ์ ์ฒ๋ผ ๋๊ปด์ง๊ธฐ ์์ํ์ต๋๋ค. :)
์ค์ฒฉ๋ Enumerator ํด๋์ค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ํฉ์ด ๋ณ๊ฒฝ๋์๋์ง ํ์คํ์ง ์์ง๋ง ๋ช ๋
์ ์ ์์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด GetEnumerator() ๊ฒฐ๊ณผ๋ฅผ boxingํ์ฌ ๋ฐ์ํ๋ ๊ฐ๋น์ง ์์ง๊ธฐ ํ ๋น์ ํผํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด https://github.com/dotnet/coreclr/issues/1579 ๋ฅผ ์ฐธ์กฐ
public class PriorityQueue<T> // ...
{
public struct Enumerator : IEnumerator<T>
{
public T Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext();
public void Reset();
public void Dispose();
}
}
์ฐ์ ์์ ํ
์ ๋ ์ค๋ซ๋์ TryRemove ์์ด "public bool Remove(T element)"๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ ํ ํฌํํ๊ณ ์์ผ๋ฉฐ ์ด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ฐ๋ฐ์ ์ค์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. API ๊ฒํ ํ์ด ์ฐจ์๋ฒจ์ ์ธ๋ฆฌ๋๋ก ํ ์๋ ์์ง๋ง ๋ด ๋ง์์๋ ์ด๋ฆฐ ์ง๋ฌธ์ ๋๋ค.
์์ฑ์์์ ์ด๊ธฐ ์ฉ๋์ ์ง์ ํ๊ฑฐ๋ TrimExcess ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๊ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ํ์ฌ ๋ฏธ์ธ ์ต์ ํ์
๋๊น? ํนํ IEnumerable์ ๊ณ ๋ คํ๋ฉด
๋๋ ๋์ bool Remove(T element)
์์ด TryRemove
. ์ฐธ์กฐ https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/CollectionExtensions.cs#L41
@pgolebiowski ๋ฌธ์์ ๋ฃ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. CoreFxLab ๋ง์คํฐ ๋ธ๋์น์ ๋ํ PR๋ก ๋ฌธ์๋ฅผ ์ ์ถํ ์ ์์ต๋๊น? @ianhays @safern์ ํ๊ทธ๋ฅผ ์ง์ ํ๋ฉด PR์ ๋ณํฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ CoreFxLab ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋์์ธ ํฌ์ธํธ์ ๋ํ ์ถ๊ฐ ํ ๋ก ์ ํ ์ ์์ต๋๋ค. ์ด ๋ฉ๊ฐ ๋ฌธ์ ๋ณด๋ค ๋ ์ฌ์ธ ๊ฒ์
๋๋ค(์ด๊ณณ์์ Area-PriorityQueue๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๋ฉ์ผ์ ์์ํ์ต๋๋ค).
CoreFxLab ํ ๋ฆฌํ์คํธ์ ๋ํ ๋งํฌ๋ฅผ ์ฌ๊ธฐ์ ๋ฃ์ผ์๊ฒ ์ต๋๊น?
API๊ฐ ํ์ฌ ํ์(2๊ฐ ํด๋์ค)์ผ๋ก ์น์ธ๋๋ฉด 4์ฐจ ํ์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ๋ชจ๋์ ๋ํ ๊ตฌํ์ผ๋ก CoreFXLab์ ๋ํ ๋ ๋ค๋ฅธ PR์ ์์ฑํฉ๋๋ค( ๊ตฌํ ์ฐธ์กฐ ). PriorityQueue<T>
๋ ์๋์ ํ๋์ ๋ฐฐ์ด๋ง ์ฌ์ฉํ๊ณ PriorityQueue<TElement, TPriority>
๋ ๋ ๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ฅผ ํจ๊ป ์ฌ๋ฐฐ์ดํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ ํ ๋น์ ์ ์ฝํ๊ณ ์ต๋ํ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก๋ถ์ด ๋ค์ด์ค๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
ConcurrentQueue์ ๊ฐ์ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ ๋ฒ์ ์ ๋ง๋ค ๊ณํ์ด ์์ต๋๊น?
๋๋ :heart: ์ด๊ฒ์ ๋์ ๋ฒ์ ์ ๋ณด๊ณ IProducerConsumerCollection<T>
๊ตฌํํ์ฌ BlockingCollection<T>
๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
@aobatact @khellang ์์ ํ ๋ค๋ฅธ ์ค๋ ๋์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ๊ฐ์น ์๋ค๋ ๊ฒ์ ๋์ํฉ๋๋ค :win:!
public bool IsEmpty();
์ด๊ฒ์ด ์ ๋ฐฉ๋ฒ์
๋๊น? IsEmpty
๊ฐ ์๋ ํ๋ ์์ํฌ์ ๋ค๋ฅธ ๋ชจ๋ ์ปฌ๋ ์
์๋ ์์ฑ์ผ๋ก ํฌํจ๋ฉ๋๋ค.
IsEmpty { get; }
์ผ๋ก top-post ์ ์ ์์ ์
๋ฐ์ดํธํ์ต๋๋ค.
corefxlab repo์ ์ต์ ์ ์ ๋ฌธ์์ ๋ํ ๋งํฌ๋ ์ถ๊ฐํ์ต๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ,
๊ฐ๋ฅํ๋ฉด ์
๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฒฌ์ด ๋ง์ ๊ฒ ๊ฐ์์. ์๋ฌด๋ ์ด๊ฒ์ด ๊ทธ๋ํ ๊ฒ์์ ์ ์ฉํ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์ ์์ฌํ์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๊ธฐ์ ๋ฐ๋ก ์ด ์ ๊ธฐ๋๋ค. ๊ทธ๋์ ๋ด ์ดํด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ฃผ์ ๋ฐ๋ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-์ค๋ณต ์์๊ฐ ์์ ๋ ์
๋ฐ์ดํธ๊ฐ ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง ๋ช
ํํ์ง ์์ต๋๋ค.
-์ค๋ณต ์์๊ฐ ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์ง์ํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง ์ฌ๋ถ์ ๋ํ ๋ช ๊ฐ์ง ๋
ผ์์ด ์์ต๋๋ค.
- ์ฐ์ ์์๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด ์ง์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์์๋ฅผ ์ฐพ๊ธฐ ์ํ ์ถ๊ฐ ์กฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์๋ค๋ ์ผ๋ถ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ํนํ ์
๋ฐ์ดํธ๊ฐ ์ํ๋์ง ์๋ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ! ๋ฐ/๋๋ ์ต์
์ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ณด์ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค...
๋ด๊ฐ ๋์น ๊ฒ์ด ์์ต๋๊น?
์ข์, ํ๋ ๋ ์์๋ ๊ฒ ๊ฐ์๋ฐ - ์๋ฏธ์ 'updateFirst' ๋๋ 'removeFirst'๋ฅผ ์๋ฏธํ๋ ์ ๋ฐ์ดํธ/์ ๊ฑฐ๊ฐ ์ด์ํ ์ ์๋ค๊ณ ์ฃผ์ฅ๋์์ต๋๋ค. :)
์ด๋ค ๋ฒ์ ์ .Net Core์์ PriorityQueue๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
@memoryfraction .NET Core ์์ฒด์๋ ์์ง PriorityQueue๊ฐ ์์ต๋๋ค(์ ์์ด ์์ง๋ง ์ต๊ทผ์ ์๊ฐ์ด ์์์ต๋๋ค). ๊ทธ๋ฌ๋ Microsoft .NET Core ๋ฐฐํฌํ์ ์์ด์ผ ํ ์ด์ ๋ ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ NuGet์ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ง๋ ์ด ๋ฌธ์ ์ ๋ํด ๋๊ตฐ๊ฐ ์ ์ํ ์ ์์ต๋๋ค.
@memoryfraction .NET Core ์์ฒด์๋ ์์ง PriorityQueue๊ฐ ์์ต๋๋ค(์ ์์ด ์์ง๋ง ์ต๊ทผ์ ์๊ฐ์ด ์์์ต๋๋ค). ๊ทธ๋ฌ๋ Microsoft .NET Core ๋ฐฐํฌํ์ ์์ด์ผ ํ ์ด์ ๋ ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ NuGet์ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ง๋ ์ด ๋ฌธ์ ์ ๋ํด ๋๊ตฐ๊ฐ ์ ์ํ ์ ์์ต๋๋ค.
๋ต์ฅ๊ณผ ์ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
C#์ ์ฌ์ฉํ์ฌ leetcode๋ฅผ ์ฐ์ตํ๊ณ SortedSet์ ์ฌ์ฉํ์ฌ ์ค๋ณต ์์๊ฐ ์๋ ์งํฉ์ ์ฒ๋ฆฌํด์ผ ํ ๋. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ณ ์ ํ ID๋ก ์์๋ฅผ ๋ํํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์์ผ๋ก๋ .NET Core์ ์ฐ์ ์์ ํ๊ฐ ์์ผ๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ํธํฉ๋๋ค.
์ด ๋ฌธ์ ์ ํ์ฌ ์ํ๋ ๋ฌด์์ ๋๊น? ์ต๊ทผ์ PriorityQueue๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์ด ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปฌ๋ ์
์ด๊ธฐํ๋ฅผ ํ์ฑํํ์ง ์์ต๋๋ค. PriorityQueue<T>
์๋ Add
๋ฉ์๋๊ฐ ์์ต๋๋ค. ์ปฌ๋ ์
์ด๊ธฐํ๋ ์ค๋ณต ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋งํผ ์ถฉ๋ถํ ํฐ ์ธ์ด ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๊ณต์ ํ๊ณ ์ถ์ ๋น ๋ฅธ ๋ฐ์ด๋๋ฆฌ ํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ด๊ฐ ์์ฑํ ๊ฒ๊ณผ ๋น๊ตํ๊ณ ์ถ์ต๋๋ค.
์ ์ํ ๋๋ก API๋ฅผ ์์ ํ ๊ตฌํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด ์๋ ๋จ์ํ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ํญ๋ชฉ์ ๋ง์ง๋ง์ ์ ์งํ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์์์ ์ญ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. ํญ๋ชฉ ์๊ฐ 32๊ฐ ๋ฏธ๋ง์ด๋ฉด ๊ฐ๋จํ ์ ํ ๊ฒ์์ ์ฌ์ฉํ์ฌ ์ ๊ฐ์ ์ฝ์
ํ ์์น๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ ํ ์ด์ง ๊ฒ์์ ์ฌ์ฉํ์ต๋๋ค. ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐ์ด์ ์ฑ์ด ๋ค์ ๋น์ฐ๋ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ์ด ๋ฐฉ๋ฒ์ด ๋ฐ์ด๋๋ฆฌ ํ๋ณด๋ค ๋น ๋ฅด๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์๊ฐ์ด ์๋ค๋ฉด ๊ณต๊ฐ git repo์ ์ ์ฅํ์ฌ ์ฌ๋๋ค์ด ์ด๋ฅผ ๋นํํ๊ณ ์ด ๋๊ธ์ ์์น๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
@SunnyWar ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค: https://github.com/BlueRaja/High-Speed-Priority-Queue-for-C-Sharp
์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. GenericPriorityQueue ์ ๋ํด ๊ตฌํ์ ํ
์คํธํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์ด์ ๊ธ์ ๋ฌด์ํด์ฃผ์ธ์. ํ ์คํธ์์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ผ๋จ ์์ ๋๋ฉด ๋ฐ์ด๋๋ฆฌ ํ์ด ๊ฐ์ฅ ์ ์ํ๋ฉ๋๋ค.
@karelz ์ด ์ ์์ ํ์ฌ ICollection<T>
์ด๋์ ์์ต๋๊น? ์ปฌ๋ ์
์ด ๋ถ๋ช
ํ ์ฝ๊ธฐ ์ ์ฉ์ด ์๋์๋ ๋ถ๊ตฌํ๊ณ ์ง์๋์ง ์๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ์ต๋๋ค.
@karelz re dequeue order์ ๋ฏธํด๊ฒฐ ์ง๋ฌธ: ๋๋ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์ ๊ฐ์ด ๋จผ์ ์ ๊ฑฐ๋๋ ๊ฒ์ ์ฐฌ์ฑํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ํธ๋ฆฌํ๊ณ ํ์ด๋จธ ๋๊ธฐ์ด ๊ตฌํ์๋ ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ ๊ฐ ์๊ฐํ๋ ๋ ๊ฐ์ง ์ฃผ์ ์๋๋ฆฌ์ค์ ๋๋ค. '๋์' ์ฐ์ ์์ ๋ฐ '๋์' ์ซ์ ๊ฐ๊ณผ ๊ด๋ จ๋ ์ธ์ด์ ์ฃผ์ฅ์ด ์๋ ํ ๋ฐ๋ ์ฃผ์ฅ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@karelz re enumeration order... ์ปฌ๋ ์
์ ๋ด๋ถ ๋ฐ์ดํฐ ํ์ ์ ์๋ฆฌ ์ ์ ๋ ฌ๋ ์์ Sort()
๋ฉ์๋๋ฅผ ๊ฐ๋ ๊ฒ์ ์ด๋ป์ต๋๊น (O (n log n)). ๊ทธ๋ฆฌ๊ณ ํธ์ถ Enumerate()
ํ Sort()
O (N)์์ ์ปฌ๋ ์
์ ์ด๊ฑฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Sort()๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด O(n)์์ ์ ๋ ฌ๋์ง ์์ ์์๋ก ์์๋ฅผ ๋ฐํํฉ๋๊น?
Triage: ์ด๊ฒ์ ๊ตฌํํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ํฉ์๊ฐ ์๋ ๊ฒ ๊ฐ์์ ๋ฏธ๋๋ก ์ด๋ํฉ๋๋ค.
๋ฃ๊ธฐ์ ๋งค์ฐ ์ค๋ง์ค๋ฝ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฌ์ ํ ํ์ฌ ์๋ฃจ์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ฌ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง ์๋ ์ฃผ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ leetcode๋ฅผ ์ํํ๊ธฐ ์ํ ํ์ ์์์
๋๋ค.
๋ ๋ง์ leetcode, ๋ ๋ง์ C# ์ฝ๋ ์ธํฐ๋ทฐ๋ ๋ ๋ง์ C# ๊ฐ๋ฐ์๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ ๋ง์ ๊ฐ๋ฐ์๋ ๋ ๋์ ์ํ๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ ๋์ ์ํ๊ณ๋ ์ฐ๋ฆฌ๊ฐ ๋ด์ผ C#์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ฝํ์๋ฉด ์ด๊ฒ์ ๊ธฐ๋ฅ์ผ ๋ฟ๋ง ์๋๋ผ ๋ฏธ๋์ ๋๋ค. ์ด๊ฒ์ด ์ด์๊ฐ '๋ฏธ๋'๋ก ๋ถ๋ฅ๋๋ ์ด์ ์ ๋๋ค.
ํ์ฌ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง ์๋ ์ฃผ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํ์ค์ด ์์ ๋ ๋ชจ๋ ์ฌ๋์ ๊ฐ์ ๊ณ ์ ํ ํน์ฑ์ด ์๋ ๊ณ ์ ํ ๊ฒ์ ๋ฐ๋ช ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด๊ฐ ์์
ํ๊ณ ์๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ System.Collections.Generic.PriorityQueue<T>
์ํ๋ ์ ์ด ๋ง์ด ์์ต๋๋ค. ์ด ์ ์์ ์ด์ 5๋
๋์ ์ง์๋์์ต๋๋ค. ์ ์์ง๋ ์ผ์ด๋์ง ์์์ต๋๊น?
์ ์์ง๋ ์ผ์ด๋์ง ์์์ต๋๊น?
์ฐ์ ๊ธฐ์, ๋ง์ฅ๋์ด ์์ต๋๋ค. ์ปฌ๋ ์ ์ ๋์์ธํ๋ ๊ฒ์ ์์ ์ ๋๋ค. ์ปฌ๋ ์ ์ BCL์ ๋ฃ์ผ๋ฉด ์ปฌ๋ ์ ์ด ๊ตํ๋๋ ๋ฐฉ์, ๊ตฌํํ๋ ์ธํฐํ์ด์ค, ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง ๋ฑ์ ๋ํด ์๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ค ์ด๋ ๊ฒ๋ ๋ก์ผ ๊ณผํ์ด ์๋์ง๋ง ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ํ, ๋์์ธ์ ํ๋จํ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ์ ์ฌ๋ก์ ๊ณ ๊ฐ์ด ํ์ํฉ๋๋ค. ์ด๋ ์ปฌ๋ ์ ์ด ์ ์ ๋ ์ ๋ฌธํ๋ ์๋ก ๋ ์ด๋ ค์์ง๋๋ค. ์ง๊ธ๊น์ง ๊ทธ๋ณด๋ค ๋ ์ค์ํ๊ฒ ์ฌ๊ฒจ์ง๋ ๋ค๋ฅธ ์์ ์ด ํญ์ ์์์ต๋๋ค.
๋ถ๋ณ ์ปฌ๋ ์ ์ด๋ผ๋ ์ต๊ทผ์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ค์ ๋ถ๋ณ์ฑ์ ๊ดํ VS์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํด BCL ํ์์ ์ผํ์ง ์๋ ๋๊ตฐ๊ฐ์ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ์ ํจ๊ป API "BCL-ified"๋ฅผ ์ป์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Roslyn์ด ์จ๋ผ์ธ ์ํ๊ฐ ๋์์ ๋ ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ํ ๋ง์ ๊ณณ์์ ๊ทธ๋ค์ ์ฌ๋ณธ์ ์ฐ๋ฆฌ ๊ฒ์ผ๋ก ๊ต์ฒดํ์ผ๋ฉฐ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋์์ธ(๋ฐ ๊ตฌํ)์ ๋ง์ด ์์ ํ์ต๋๋ค. "์์ " ์๋๋ฆฌ์ค ์์ด๋ ์ด๋ ต์ต๋๋ค.
ํ์ค์ด ์์ ๋ ๋ชจ๋ ์ฌ๋์ ๊ฐ์ ๊ณ ์ ํ ํน์ฑ์ด ์๋ ๊ณ ์ ํ ๊ฒ์ ๋ฐ๋ช ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@masonwheeler ๊ฐ PriorityQueue<T>
์
๋๊น? ํธํ๋์ง ์๊ณ "๋๋ถ๋ถ์ ์ํ ์ต๊ณ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"๋ก ๋ช
ํํ๊ฒ ์ธ์ ๋์ง ์๋ ์ฌ๋ฌ ํ์ฌ ์ต์
์ด ์์ต๋๊น? (์ ๊ฐ ์กฐ์ฌ๋ฅผ ์ํด๋ด์ ๋ต์ ๋ชจ๋ฅด๊ฒ ๋ค์)
@eiriktsarpalis ๊ตฌํ ์ฌ๋ถ์ ๋ํ ํฉ์๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง์ง ์์ต๋๊น?
@terrajobst ์ ์๋ ค์ง ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ์๋ ค์ง ํจํด์ธ๋ฐ ์์ ์๋๋ฆฌ์ค๊ฐ ์ ๋ง ํ์ํ๊ฐ์? ์ฌ๊ธฐ์๋ ๊ฑฐ์ ํ์ ์ด ํ์ํ์ง ์์ต๋๋ค. ์ด๋ฏธ ์์ ํ ๊ฐ๋ฐ๋ ์ธํฐํ์ด์ค ์ฌ์๋ ์์ต๋๋ค. ์ ์๊ฐ์ ์ด ์ ํธ๋ฆฌํฐ๊ฐ ์กด์ฌํ์ง ์๋ ์ง์ง ์ด์ ๋ ๋๋ฌด ์ด๋ ต๊ฑฐ๋ ์์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค. ์ง์ง ์ด์ ๋ ์ค์ ์ํํธ์จ์ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํ๋ ์์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฃ์ ์ ์น ์บ ํ์ธ์ ํ๋ ๊ฒ๋ณด๋ค ์ง์ ๋ง๋๋ ๊ฒ์ด ๋ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ฌ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง ์๋ ์ฃผ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@terrajobst
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ํ์ฌ ์๋ฃจ์
์ด ํญ์ ์์๋๋ก ์๋ํ์ง ์๊ฑฐ๋ ํ์ฌ ์ธ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒฝํ์ ํ์ต๋๋ค. ํ์คํ๋ ๋ฒ์ i(์ฌ์ฉ์๋ก์)๋ฅผ ์ฌ์ฉํ๋ฉด ์ป์ ์ ์๋ ์ต์์ ์ฑ๋ฅ์ ํ์ ํ ์ ์์ต๋๋ค.
@danmosemsft
@masonwheeler ๊ฐ
PriorityQueue<T>
์ ๋๊น? ํธํ๋์ง ์๊ณ "๋๋ถ๋ถ์ ์ํ ์ต๊ณ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"๋ก ๋ช ํํ๊ฒ ์ธ์ ๋์ง ์๋ ์ฌ๋ฌ ํ์ฌ ์ต์ ์ด ์์ต๋๊น? (์ ๊ฐ ์กฐ์ฌ๋ฅผ ์ํด๋ด์ ๋ต์ ๋ชจ๋ฅด๊ฒ ๋ค์)
์. ๊ทธ๋ฅ ๊ตฌ๊ธ "C# ์ฐ์ ์์ ํ"; ์ฒซ ํ์ด์ง๋ ๋ค์์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค.
@terrajobst ์ ์๋ ค์ง ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ์๋ ค์ง ํจํด์ธ๋ฐ ์์ ์๋๋ฆฌ์ค๊ฐ ์ ๋ง ํ์ํ๊ฐ์? ์ฌ๊ธฐ์๋ ๊ฑฐ์ ํ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
์ ๊ฒฝํ์ ๊ทธ๋ ์ต๋๋ค. ์ ๋ง๋ ์ธ๋ถ ์ฌํญ์ ์์ผ๋ฉฐ ์ผ๋จ API๋ฅผ ์ถ์ํ๋ฉด ์ค์ ๋ก ํฐ ๋ณํ๋ฅผ ์ค ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ๋ง์ ๊ตฌํ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. API๋ฅผ ์ ์ ๋์ OOB๋ก ๋ฏธ๋ฆฌ ๋ณผ ์ ์์ง๋ง ํผ๋๋ฐฑ์ ํ์คํ ์์งํ ์๋ ์์ง๋ง ์์ ์๋๋ฆฌ์ค๊ฐ ์๋ค๋ ๊ฒ์ ํ์ด ๋ธ๋ ์ด์ปค๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ข ์ข ์์ ์ด ์๋๋ฆฌ์ค๊ฐ ๋์ฐฉํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์์ต๋๋ค.
๋ถ๋ช ํ ์ฐ๋ฆฌ๋ ์์ ์ด ํ์ํฉ๋๋ค. ๐
@masonwheeler ๋๋ ๋น์ ์ ๋งํฌ๊ฐ ์ด๊ฒ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค ๐ ์ด์ ๋ด ๋จธ๋ฆฌ ์์ ์์ต๋๋ค.
@terrajobst๊ฐ ๋งํ๋ฏ์ด ์ฌ๊ธฐ์ ์ฐ๋ฆฌ์ ์ฃผ์ ๋ฌธ์ ๋ ๋ฆฌ์์ค/์ฃผ์์์ต๋๋ค(์ํ๋ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ฅผ ๋น๋ํ ์ ์์). ๋๋ณธ.
[๋ช ํ์ฑ์ ์ํด ํธ์ง๋จ]
@danmosemsft ์๋, ๊ทธ ๋ ธ๋๋ฅผ
Hero ์ฑ ํ๋ณด #1: TimerQueue.Portable์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
Hero ์ฑ ํ๋ณด #1: TimerQueue.Portable์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ด๋ฏธ ๊ณ ๋ คํ๊ณ ํ๋กํ ํ์ ์ ๋ง๋ค๊ณ ํ๊ธฐํ์ต๋๋ค. ํ์ด๋จธ๊ฐ ๋น ๋ฅด๊ฒ ์์ฑ๋๊ณ ์๋ฉธ๋๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ(์: ํ์์์์ ๊ฒฝ์ฐ)๋ ๋ ํจ์จ์ ์ ๋๋ค.
@stephentoub ํ์ด๋จธ ์๊ฐ ์ ์ ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ ํจ์จ์ฑ์ด
ํ์ด๋จธ ์๊ฐ ์ ์ ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ป๊ฒ ํ์ฅ๋ฉ๋๊น?
์๋์, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ์ด๋ค ์๊ฐ์๋ ๋ง์ ํ์ด๋จธ๊ฐ ์์ง๋ง ์์ฃผ ์ ์ ์์ ํ์ด๋จธ๊ฐ ๋ฐ์ฌ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ์ด๋จธ๊ฐ ํ์์์์ ์ฌ์ฉ๋ ๋์ ๊ฒฐ๊ณผ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ํ ๊ฒ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ ์ ์๋ ์๋์ ๋๋ค... 0(1)์ด๊ณ ๋งค์ฐ ๋ฎ์ ์ค๋ฒํค๋๋ฅผ ์ํฉ๋๋ค. O(log N)๊ฐ ๋๋ฉด ๋ฌธ์ ์ ๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์ด ์์ผ๋ฉด ํ์คํ C#์ด ์ธํฐ๋ทฐ์ ๋ ์น์ํด์ง๋๋ค.
์ฐ์ ์์ ๋๊ธฐ์ด์ด ์์ผ๋ฉด ํ์คํ C#์ด ์ธํฐ๋ทฐ์ ๋ ์น์ํด์ง๋๋ค.
๋ค, ๋ง์ต๋๋ค.
์ ๋ ๊ฐ์ ์ด์ ๋ก ์ฐพ๊ณ ์์ต๋๋ค.
@stephentoub ์ค์ ๋ก ๋ฐ์ํ์ง ์๋ ์๊ฐ ์ด๊ณผ์ ๊ฒฝ์ฐ ์ด๋ ๋์๊ฒ ์๋ฒฝํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์๊ธฐ ๋ง์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ๋ฉด ๊ฐ์๊ธฐ ํจํท์ด ์์ค๋๊ฑฐ๋ ์๋ฒ๊ฐ ์๋ตํ์ง ์๋ ๋ฑ์ ์ด์ ๋ก ์์คํ ์ ์ด๋ค ์ผ์ด ๋ฐ์ํฉ๋๊น? ๋ํ System.Timer์์ ๋ฐ๋ณต ํ์ด๋จธ๊ฐ ๋์ผํ ๊ตฌํ์ ์ฌ์ฉํฉ๋๊น? ๊ฑฐ๊ธฐ์์ ๋ง๋ฃ๋๋ ํ์์์์ 'ํ๋ณตํ ๊ธธ'์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์๊ธฐ ๋ง์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ๋ฉด ์์คํ ์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ๊ถ๊ธํฉ๋๋ค.
์๋ ํด๋ด. :)
์ฐ๋ฆฌ๋ ์ด์ ๊ตฌํ์์ ๋ง์ ์ค์ ์ํฌ๋ก๋๊ฐ ์ด๋ ค์์ ๊ฒช๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ดํด๋ณธ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ก์ด ๊ฒ(์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฌ์ฉํ์ง ์๊ณ ๋์ ์ ๊ณง ํ์ด๋จธ์ ์กฐ๋ง๊ฐ ํ์ด๋จธ๊ฐ ๊ฐ๋จํ๊ฒ ๋ถํ ๋จ)์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ผ๋ฉฐ ๊ทธ๊ฒ.
๋ํ System.Timer์์ ๋ฐ๋ณต ํ์ด๋จธ๊ฐ ๋์ผํ ๊ตฌํ์ ์ฌ์ฉํฉ๋๊น?
์. ๊ทธ๋ฌ๋ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์๋นํ ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋์ด ์์ต๋๋ค.
5๋ ์ด ์ง๋ ์ง๊ธ๋ PriorityQueue๋ ์์ต๋๋ค.
Rx์๋ ๊ณ ๋๋ก ํ๋ก๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์น ์ฐ์ ์์ ๋๊ธฐ์ด ํด๋์ค๊ฐ ์์ต๋๋ค.
5๋ ์ด ์ง๋ ์ง๊ธ๋ PriorityQueue๋ ์์ต๋๋ค.
์ฐ์ ์์๊ฐ ๋์ง ์์์ผํฉ๋๋ค ...
๊ทธ๋ค์ repo ๋ ์ด์์์ ์ค์ฌ์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ ์์น๋ https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Internal/PriorityQueue.cs์ ๋๋ค.
@stephentoub ํ์ง๋ง ์ค์ ๋ก๋ @eiriktsarpalis ์ผ ์๋ ์์ต๋๋ค. ์ง๊ธ ์ฐ๋ฆฌ๋ ์ค์ ๋ก ์ด์ ๋ํ ๊ด์ฌ์ด ์์ต๋๊น? API ๋์์ธ์ด ์์ฑ๋๋ฉด ๊ธฐ๊บผ์ด ์์ ํ๊ฒ ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์์ง ํด๊ฒฐ๋์๋ค๋ ์ ์ธ์ ๋ณด์ง ๋ชปํ๊ณ ์ง์ ๋ ํฌ๋ฌ ์ฑ ์์ด ์ต์ข
API ๋์์ธ์ด ์์ ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ํ์ง๋ง...
์ต๊ณ ์ ํฌ๋ฌ ์ฑ ํ๋ณด๊ฐ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝ์ฐ/๊ฐ์/์ธํฐ๋ทฐ๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์๋จ์ ์๋ Eric์ ๋์์ธ์ ์ถฉ๋ถํ ์ ์ฉํด ๋ณด์ธ๋ค๊ณ ์๊ฐํฉ๋๋ค... ๊ทธ๋ฆฌ๊ณ ์ฌ์ ํ ์ ๋ฐ๋ ์ ์์ด ๋จ์ ์์ต๋๋ค(์๋ก ์์ ๋์์ง๋ง ์์ง ์ฒ ํ๋์ง ์์์ต๋๋ค!)
๋ด๊ฐ ๊ทธ๋ค ์ฌ์ด์์ ์์์ฐจ๋ฆฐ ์ฃผ์ ์ฐจ์ด์ ์ ์ฌ์ ์ฒ๋ผ ๋งํด์ผ ํ๋์ง ์ฌ๋ถ์ ์ ํ์๊ฐ ์ฌ๋ฌผ์ด์ด์ผ ํ๋์ง ์ฌ๋ถ์ ๋๋ค.
์ ๊ทธ๊ฒ์ด ์ฌ์ ์ด ๋๊ณ ์ถ์๋์ง ์ ํํ ์์ด๋ฒ๋ฆฌ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์์ธํ๋ ํ ๋น์๊ฐ ์๊ณ ์ฐ์ ์์๊ฐ ์๋ ํค๋ฅผ ์ด๊ฑฐํ ์ ์๋ค๋ ๊ฒ์ ๋์๊ฒ ์ข์ ์ผ์ฒ๋ผ ๋ณด์๊ณ ๋งค์ฐ ์ฌ์ ๊ณผ ๊ฐ์์ต๋๋ค. ๋๋ฒ๊ฑฐ์์ ์ฌ์ ์ผ๋ก ์๊ฐํํ ์ ์๋ค๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค.
์ ํ์๋ ์ค์ ๋ก ์์๋๋ ํด๋์ค ์ธํฐํ์ด์ค์ธ FWIW๋ฅผ ๋ํญ ๋ณ๊ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํ๊ธฐ๋ ์์ฑ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๊ฒ์ด์ด์ผ ํ๋ฉฐ, ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฐ์ ์์ ๊ฐ์ ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋ค. ์ฐ์ ์์๋ฅผ ์๊ณ ์ถ์ผ๋ฉด ์ ํ๊ธฐ๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ํ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋ฉ์๋ ์๋ช ์ ์ฐ์ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ ์ผ์ข ์ ๋ณด๋ค ์ ๋ฌธํ๋ 'PrioritySet' ํด๋์ค๊ฐ ๋ฉ๋๋ค. [๋ถ์ํ ์ ํ์๋ ๋ฒ๊ทธ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค!]
@TimLovellSmith ์ด ๋์์ ๋ํ ์๊ตฌ๋ฅผ ์ดํดํ์ง๋ง 5๋
๋์ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ์ ํ๊ธฐ๋ก ๋ฐฐ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ์ ๊ตฌํํ๊ณ Queue.cs
์ ๋์ผํ API ๋
ธ์ถ ์์ญ์ ๊ณต์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง ์์๊น์ ? Queue.cs
? ๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ๊น์ง ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ํ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์๊ฐ์ ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ API ๋์์ธ์ ๋์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ๋์ง ์์์ง๋ง PriorityQueue
๋ง๋๋ ๊ฒฝ์ฐ Queue
.
@Jlalond ๊ทธ๋์ ์ฌ๊ธฐ์ ์ ์, ์? ํ ๊ธฐ๋ฐ ๋ฐฐ์ด ๊ตฌํ์ ์ด์๊ฐ ์์ต๋๋ค. ์ด์ ์ ํ์์ ๋ํด ๋ด๊ฐ ๊ฐ์ง๊ณ ์์๋ ๊ฐ์ฅ ํฐ ์ด์๋ฅผ ๊ธฐ์ตํฉ๋๋ค. ์ฐ์ ์์ ์
๋ฐ์ดํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ ๊ฒ์ด ์ฝ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ํ๋ฒํ ์ค๋๋ ๋๊ธฐ์ด์๋ ์ฐ์ ์์ ์
๋ฐ์ดํธ ์์
์ด ์์ง๋ง ์์ ์ฐ์ ์์ ์
๋ฐ์ดํธ๋ ๋ง์ ์ฐ์ ์์ ๋๊ธฐ์ด ์๊ณ ๋ฆฌ์ฆ์์ ์ค์ํ ์์
์
๋๋ค.
์์๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ตฌ์กฐ๋ฅผ ๋๋ฒ๊ทธํ ํ์๊ฐ ์๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ๋๋ค์ ์์ํ ๊ฐ์ฌํด์ผ ํฉ๋๋ค.
@TimLovellSmith ์ฃ์กํฉ๋๋ค Tim, IDictionary
์ ์์์ ๋ช
ํํ ํ์ด์ผ ํ์ต๋๋ค.
์ฐ์ ์์๊ฐ ๋ณ๊ฒฝ๋๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๊น?
๋๋ ๋น์ ์ ๊ตฌํ์ ์ข์ํ์ง๋ง IDictionary Behavior์ ๋ณต์ ๋ฅผ ์ค์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ IDictionary<>
์์ ์์ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํ์ง๋ง ICollection๋ง ์์ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ ์ก์ธ์ค ํจํด์ด ์ง๊ด์ ์ด์ง ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฌ๋ T๋ฅผ ๋ฐํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ฐ์ ์์๊ฐ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋๊ธฐ์ด์ ๋ฃ๊ฑฐ๋ ๋๊ธฐ์ด์์ ์ ๊ฑฐํ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ด ์์์ ์ฐ์ ์์๋ฅผ ์์์ผ ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@Jlalond
์ฐ์ ์์ ๋๊ธฐ์ด์ด ์๋ ๊ฒฝ์ฐ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ ๋ชจ๋ ์์
์ ์ง์ํด์ผ ํฉ๋๋ค.
์ด๋ฐ ์ข
๋ฅ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ/์ถ์ํ์ ์ต์ํ ์ฌ๋๋ค์ '๊ธฐ๋'ํฉ๋๋ค.
์
๋ฐ์ดํธ ์ฐ์ ์์๋ ๋ ๋ฒ์ฃผ์ ๋ชจ๋ ์ํ๊ธฐ ๋๋ฌธ์ API์ ์ํฉ๋๋ค. ์
๋ฐ์ดํธ ์ฐ์ ์์๋ ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์์
์ ์ํํ๋ ๋ณต์ก์ฑ์ด ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก์ฑ์ ์ํฅ์ ๋ฏธ์น๊ณ ์ ๊ธฐ์ ์ผ๋ก ์ธก์ ๋๋ค๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ์์ ์ถฉ๋ถํ ์ค์ํฉ๋๋ค. ๋ค์์ ์ฐธ์กฐํ์ธ์.
https://en.wikipedia.org/wiki/Priority_queue#Specialized_heaps
TBH๋ ์ฃผ๋ก ์๊ณ ๋ฆฌ์ฆ๊ณผ ํจ์จ์ฑ ์ธก๋ฉด์์ ํฅ๋ฏธ๋กญ๊ณ ์ธก์ ๋ reduce_key๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฐ์ธ์ ์ผ๋ก API์ DecreasePriority()๋ง ์๊ณ ์ค์ ๋ก UpdatePriority๊ฐ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ง๋ง ํธ์์ API ์ฌ์ฉ์์๊ฒ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฆ๊ฐ ๋๋ ๊ฐ์ ์ฌ๋ถ์ ๋ํด ๊ฑฑ์ ํ๋ ๊ฒ์ ๊ท์ฐฎ๊ฒ ํ์ง ์๋ ๊ฒ์ด ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. joe ๊ฐ๋ฐ์๊ฐ ์ ๊ฐ์๋ง ์ง์ํ๊ณ ์ฆ๊ฐ๋ ์ง์ํ์ง ์๋์ง ๊ถ๊ธํ์ง ์๊ณ ์ฆ์ '์
๋ฐ์ดํธ'ํ ์ ์๋๋ก ์ผ๋ฐ ์
๋ฐ์ดํธ ์ฐ์ ์์ API๋ฅผ ๊ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ง๋ง ๋ฌธ์ ๊ฐ์์ฉ์ผ๋ก ์ฌ์ฉํ ๋๋ ๋น์ฉ X, ์ฆ๊ฐ์ฉ์ผ๋ก ์ฌ์ฉํ ๋๋ ์ ๊ฑฐ+์ถ๊ฐ์ ๋์ผํ๊ฒ ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด Y์
๋๋ค.
RE ์ฌ์ ๋์ํ์ต๋๋ค. ๋ ๊ฐ๋จํ๋ค๋ ์ด๋ฆ์ผ๋ก ๋ด ์ ์์์ ์ ๊ฑฐํ์ต๋๋ค.
https://github.com/TimLovellSmith/corefxlab/blob/priorityQueueSpecSolved/docs/specs/priority-queue.md
ํ์ ๋ฃ๊ฑฐ๋ ํ์์ ๋บ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ด ์์์ ์ฐ์ ์์๋ฅผ ์์์ผ ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด ๋๊ธ์ด ๋ฌด์จ ๋ด์ฉ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์๋ฅผ ํ์์ ๋นผ๊ธฐ ์ํด ์์์ ์ฐ์ ์์๋ฅผ ์ ํ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธฐ์ด์ ๋ฃ์ ๋ ์ฐ์ ์์๋ฅผ ์์์ผ ํฉ๋๋ค. ์์๋ฅผ ํ์์ ์ ๊ฑฐํ ๋ ์์์ ์ต์ข ์ฐ์ ์์๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๊ทธ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@TimLovellSmith
์ด ๋๊ธ์ด ๋ฌด์จ ๋ด์ฉ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์๋ฅผ ํ์์ ๋นผ๊ธฐ ์ํด ์์์ ์ฐ์ ์์๋ฅผ ์ ํ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธฐ์ด์ ๋ฃ์ ๋ ์ฐ์ ์์๋ฅผ ์์์ผ ํฉ๋๋ค. ์์๋ฅผ ํ์์ ์ ๊ฑฐํ ๋ ์์์ ์ต์ข ์ฐ์ ์์๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๊ทธ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ํค ๊ฐ ์์์ Tpriorty๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๋ชป ์ดํดํ์ต๋๋ค.
์, ๋ง์ง๋ง ๋ ์ง๋ฌธ์ ์ Tpriority๊ฐ ์๋ KeyValuePair์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฐ์ ์์ ์ง์ ์ ์ํด ๋ด๊ฐ ๋ณผ ์ ์๋ ๊ฐ์ฅ ์ข์ ์๊ฐ์ N log N์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ฐ์น ์๋ค๋ ๋ฐ ๋์ํ์ง๋ง ๊ทธ API๋ ์ด๋ป๊ฒ ์๊ฒผ์๊น์?
์ฐ์ ์์ ์ฌ์ง์ ์ ๋ํด ๋ด๊ฐ ๋ณผ ์ ์๋ ๊ฐ์ฅ ์ข์ ์๊ฐ์ N log N์ ๋๋ค.
ํ ํญ๋ชฉ์ด ์๋ N ํญ๋ชฉ์ ์ฐ์ ์์๋ฅผ ๋ค์ ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์๊ธฐ์ฃ ?
๋ฌธ์๋ฅผ ๋ช
ํํ ํ๊ฒ ์ต๋๋ค. "UpdatePriority | O(log n)"์ "UpdatePriority(๋จ์ผ ํญ๋ชฉ) | O(log n)"๋ก ์ฝ์ด์ผ ํฉ๋๋ค.
@TimLovellSmith ์๋ฏธ๊ฐ ์์ง๋ง ์์๋ฅผ ์ ๊ฑฐํ ๋ค์ ๋ค์ ์ฝ์ ํด์ผ ํ๋ฏ๋ก ์ฐ์ ์์ ์ ๋ฐ์ดํธ๊ฐ ์ค์ ๋ก ne O2 *(log n)๊ฐ ๋์ง ์์ต๋๊น? ์ด๊ฒ์ด ๋ฐ์ด๋๋ฆฌ ํ์ด๋ผ๋ ๊ฐ์ ์ ๋ฐํ์ผ๋ก
@TimLovellSmith ์๋ฏธ๊ฐ ์์ง๋ง ์์๋ฅผ ์ ๊ฑฐํ ๋ค์ ๋ค์ ์ฝ์ ํด์ผ ํ๋ฏ๋ก ์ฐ์ ์์ ์ ๋ฐ์ดํธ๊ฐ ์ค์ ๋ก ne O2 *(log n)๊ฐ ๋์ง ์์ต๋๊น? ์ด๊ฒ์ด ๋ฐ์ด๋๋ฆฌ ํ์ด๋ผ๋ ๊ฐ์ ์ ๋ฐํ์ผ๋ก
2์ ๊ฐ์ ์์ ์์ธ์ N์ ํฌ๊ธฐ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋๋ถ๋ถ ๋ฌด์๋ฏธํด์ง๊ธฐ ๋๋ฌธ์ ๋ณต์ก๋ ๋ถ์์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์๋ฉ๋๋ค.
์ดํดํ์ต๋๋ค. ๋๋ถ๋ถ Tim์ด ํ ์ ์๋ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๊ฐ ์๋์ง ์๊ณ ์ถ์์ต๋๋ค.
ํ ๋ฒ์ ์์
:)
2020๋ 8์ 18์ผ ํ์์ผ 23:51 masonwheeler [email protected]์ด(๊ฐ) ์์ฑํ์ต๋๋ค.
@TimLovellSmith https://github.com/TimLovellSmith ์ดํด๊ฐ ๋์ง๋ง
์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ ์ค์ ๋ก ne O2 * (log n)๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์์๋ฅผ ์ ๊ฑฐํ ๋ค์ ๋ค์ ์ฝ์ ํ์๊ฒ ์ต๋๊น? ๋ด ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก
๋ฐ์ด๋๋ฆฌ ํ2์ ๊ฐ์ ์์ ์์ธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ณต์ก์ฑ ๋ถ์์์ ๋ฌด์๋ฉ๋๋ค.
N์ ํฌ๊ธฐ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋๋ถ๋ถ ๋ฌด์๋ฏธํด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/dotnet/runtime/issues/14032#issuecomment-675887763 ,
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AF76XTI3YK4LRUVTOIQMVHLSBNZARANCNFSM4LTSQI6Q
.
@Jlalond
์ฐธ์ ํ ์์ด๋์ด๊ฐ ์๋ค, ๋๋ ์์ ์์ธ์ ๋ฌด์ํ์๋ฟ์ด์ง๋ง ๊ฐ์๋ ์ฆ๊ฐ์ ๋ค๋ฆ
๋๋ค.
์ฐ์ ์์ ์
๋ฐ์ดํธ๊ฐ ๊ฐ์ํ๋ ๊ฒฝ์ฐ ์ ๊ฑฐํ๊ณ ๋ค์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ฑฐํ๋ง ๋ฐ์ํ๋ฏ๋ก 1 * O(log n) = O(log n)์
๋๋ค.
์ฐ์ ์์ ์
๋ฐ์ดํธ๊ฐ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ ํด๋น ์
๋ฐ์ดํธ๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ ์ถ๊ฐํด์ผ ํ๋ฏ๋ก 2 * O(log n) = ์ฌ์ ํ O(log n)์
๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ์ ๊ฑฐ + ์ฝ๊ธฐ๋ณด๋ค ์ฐ์ ์์๋ฅผ ๋์ด๊ธฐ ์ํด ๋ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ช ํ์ ์๋ ์์ง๋ง ๋๋ ๊ทธ๊ฒ์ ์ฐพ์ผ๋ ค๊ณ ์๋ํ์ง ์์์ต๋๋ค. O(log n) ์ถฉ๋ถํ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
KeyValuePair
๋ ์ฌ์ ์ธ ๋์ ์ธํฐํ์ด์ค์ ๋ชฐ๋ ๋ค์ด์์ง๋ง ์ฌ์ ์ด ์ ๊ฑฐ๋ ํ์๋ ์ด์๋จ์๊ณ , ์ฃผ๋ก _์์ ์ปฌ๋ ์
์ ์ฐ์ ์์๋ก ๋ฐ๋ณตํ ์ ์๋๋ก ํ์ต๋๋ค. ๋ํ ์ฐ์ ์์์ ๋ฐ๋ผ ์์๋ฅผ ํ์์ ๋นผ๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ๋จ์ํจ์ ์ํด ์ฐ์ ์์๊ฐ ์๋ dequeue๋ Dequeue API์ '๊ณ ๊ธ' ๋ฒ์ ์๋ง ์์ด์ผ ํฉ๋๋ค. (TryDequeue :D)
๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
@TimLovellSmith Cool, ์์ ๋ ์ ์์ ๊ธฐ๋ํฉ๋๋ค. ์ด ์์ ์ ์์ํ ์ ์๋๋ก ๊ฒํ ๋ฅผ ์ํด ์ ์ถํ ์ ์์ต๋๊น? ๋ํ, ๋ณํฉ ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ด๋ง ๋๊ธฐ์ด์ ์ฝ๊ฐ์ ์๊ทน์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ์ ํ ์ด๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ์ด ๊ฐ์ฅ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๊ฐ?
@Jlalond
Peek + Dequeue API๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ ํ์ต๋๋ค.
์ผ๋ถ ICollection
๊ฐ์ ํ๋ณด ๋งํฌ์
๋๋ค. ๊ฒํ ๋ฅผ ์ํด ์ ์ถํด์ผ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ฐฐ์ด ๊ธฐ๋ฐ ํ๋งํผ ๋น ๋ฅด๊ฑฐ๋ ๊ทธ ์ด์์ธ ํ ์ด๋ค ๊ตฌํ์ ์ฌ์ฉํ๋์ง ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค.
@TimLovellSmith ์ค์ ๋ก API ๊ฒํ ์ ๋ํด ์๋ ๊ฒ์ด ์์ง๋ง @danmosemsft ๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก
๋ด ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ค์ ๋ก ๋ฐ์ด๋๋ฆฌ ํ์ ์ ํธํ์ง๋ง ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ทธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์์ต๋๋ค.
@eiriktsarpalis @layomia ๋ ์ง์ญ ์์ ์ ์ด๋ฉฐ API ๊ฒํ ๋ฅผ ํตํด ์ด๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ๋๋ ํ ๋ก ์ ๋ฐ๋ฅด์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํฉ์์ ์ ๋๋ฌํ์ต๋๊น?
๊ณผ๊ฑฐ์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ ์ปฌ๋ ์ , ํนํ ๋ ๋จ์ ์ด๊ฑฐ๋ ํ์ ์์ฅ์ธ ์ปฌ๋ ์ ์ ๊ฐ์ฅ ์ ํฉํ ์ฅ์๋ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ๋งค๋ ๋ฐฐ์กํฉ๋๋ค. ๋์๊ด๋งํผ ๋นจ๋ฆฌ ์ด๋ํ ์๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ปฌ๋ ์ ํฉ์ ์ค์ฌ์ผ๋ก ์ปค๋ฎค๋ํฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ํ 84๊ฐ์ ์์ง์๊ฐ๋ฝ์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด์ ๋ํ ๊ด๋ฒ์ํ ํ์์ฑ์ด ์์์ ์์ฌํฉ๋๋ค.
@Jlalond ์ฃ์กํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ด ๋ฌด์์ธ์ง ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. Tpriority๊ฐ ์ผ๋ฐ์ ์ธ ์ด์ ๋ฅผ ๋ฌป๊ณ ์์ต๋๊น? ์๋๋ฉด ์ซ์์ฌ์ผ ํ๋์? ๋ง์ ์ฌ๋๋ค์ด ์ซ์๊ฐ ์๋ ์ฐ์ ์์ ์ ํ์ ์ฌ์ฉํ๊ฒ ๋ ์ง ์์ฌ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ byte, int, long, float, double ๋๋ enum์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ ์ ์์ต๋๋ค.
@TimLovellSmith ์, ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ฒ์ธ์ง ์๊ณ ์ถ์์ต๋๋ค.
@danmosemsft ๊ฐ์ฌํฉ๋๋ค Dan. ๋ด ์ ์[1]์ ๋ํ ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ๋/๋๊ธ์ ์๋ ๋๋ต 0์ด๋ฉฐ ๋งจ ์์ ์๋ @eickle ์ ์ ์(์ ์ฐจ ์ ์ฌํด์ง๊ณ ์์)์ ์ํด ์ด๋ฆฐ ์ํ๋ก ๋จ๊ฒจ์ง ๋ชจ๋ ์ค์ํ ์ง๋ฌธ์ ํด๊ฒฐํฉ๋๋ค.
๊ทธ๋์ ์ง๊ธ๊น์ง ๊ฑด์ ์ฑ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ฌ์ ํ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค. IReadOnlyCollection์ ์์ํ๋ ๊ฒ์ด ์ ์ฉํ์ง ์ฌ๋ถ์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค(๋ณ๋ก ์ ์ฉํ์ง๋ ์์ง๋ง ์ ๋ฌธ๊ฐ์๊ฒ ๋งก๊ฒจ์ผ ํฉ๋๋ค). @eiriktsarpalis @layomia ์ด๊ฑฐ ์ข ๋ด๋ฌ๋ผ๊ณ ํด๋ ๋ ๊น์?
[์ถ์ - ์ค๋ ๋ ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ ์๋ ํฌ๋ฌ ์ฑ์ ์ฝ๋ฉ ๋ํ, ์ธํฐ๋ทฐ ์ง๋ฌธ ๋ฑ์ ๋๋ค. ์ฌ๊ธฐ์ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ํจ๊ป ์ค๋์ ์ข์ํ๋ ์ซ์ ์ ํ์ ์ฌ๋ฐ๋ฅธ O์ ํจ๊ป ์๋ํ๋ ๋ฉ์ง ๊ฐ๋จํ API๋ฅผ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. (n) ๊ตฌํ ์๋๊ฐ ๋๋ฌด ๋๋ฆฌ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ์ฉํ ์ ์๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋ ํฅ๋ฏธ์ง์งํ ๊ฒ์ด ์๋๋ผ ์ฃ์กํฉ๋๋ค.]
'์ค์ ' ํ๋ก์ ํธ, ์ฃผ๋ก ๊ทธ๋ํ ๊ฒ์(์: ๋ฌธ์ ์ต์ ํ, ๊ฒฝ๋ก ์ฐพ๊ธฐ) ๋ฐ ์ ๋ ฌ๋ ์ถ์ถ(์ฒญํฌ๋ณ(์: ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ฟผ๋ ํธ๋ฆฌ), ์ค์ผ์ค๋ง(์: ์์ ํ์ด๋จธ ๋ ผ์)). ๋์์ด ๋๋ ๊ฒฝ์ฐ ์จ์ ์ฑ ๊ฒ์ฌ/ํ ์คํธ๋ฅผ ์ํด ์ง์ ๊ตฌํ์ ์ฐ๊ฒฐํ ์ ์๋ ๋ช ๊ฐ์ง ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. ํ์ฌ ์ ์์ ๋์๊ฒ ์ข์ ๋ณด์ ๋๋ค(์ด์์ ์ผ๋ก ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ชฉ์ ์ ์ฌ์ฉํ ์ ์์). ๋ช ๊ฐ์ง ์์ ๊ด์ฐฐ์ด ์์ต๋๋ค.
TElement
๋ TKey
์ฌ์ผ ํ๋ ๊ณณ์ ๋ ๋ฒ ๋ํ๋ฉ๋๋ค.bool EnqueueOrUpdateIfHigherPriority
๋๋ฉฐ, ์ด๋ ์ข
์ข
์ฌ์ฉ๋๋ ์ ์ผํ ๋๊ธฐ์ด/์
๋ฐ์ดํธ ๋ฐฉ๋ฒ(์: ๊ทธ๋ํ ๊ฒ์)์ผ๋ก ๋๋ฉ๋๋ค. ๋ถ๋ช
ํ ๊ทธ๊ฒ์ ํ์์ ์ด์ง ์๊ณ API์ ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ๋ํ ๊ฒ์ด์ง๋ง, ์ด๊ฒ์ ๋งค์ฐ ์ข์ ๊ฒ์
๋๋ค.Enqueue
( Add
์๋ฏธํ์ง ์์)์ ์ฌ๋ณธ์ด ๋ ๊ฐ ์์ต๋๋ค. ํ๋๋ bool TryEnqueue
์
๋๊น?EqualityComparer
์ ์ด๋ฆ์ ์ฝ๊ฐ ์์์น ๋ชปํ ๊ฒ์
๋๋ค. KeyComparer
๊ฐ PriorityComparer
์ ํจ๊ป ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค.CopyTo
๋ฐ ToArray
์ ๋ณต์ก์ฑ์ ๋ํ ๋ฉ๋ชจ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค.@๋น์ฃผ์ผ๋ฉ๋ก
๋ฆฌ๋ทฐ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
KeyComparer์ ์ด๋ฆ ์ง์ ์ ์์ด ๋ง์์ ๋ญ๋๋ค. ์ฐ์ ์์ ๊ฐ์ API๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ฌํ API ์ค ํ๋ ๋๋ ๋ ๋ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? '์ตํ์ ์ฐ์ ์์' ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์๋ง ์ฌ์ฉํ์๊ฒ ์ต๋๊น? ์๋๋ฉด ๋น์ ๋ ์ฆ๊ฐ๋ฅผ ์ํ์ญ๋๊น?
public void EnqueueOrIncreasePriority(TKey key, TPriority priority); // doesn't throw, only updates priority of keys already in the collection if new priority is higher
public void EnqueueOrDeccreasePriority(TKey key, TPriority priority); // doesn't throw, only updates priority of keys already in the collection new priroity is lower
์ด๊ฑฐํ์ด ๊ฐ์ฅ ์์ ์์๋ฅผ ๋จผ์ ๋ฐํํ๋ค๊ณ ์๊ฐํ ์ด์ ๋ Peek()์ด ์ปฌ๋ ์ ์ ๋งจ ์์ ์์๋ฅผ ๋ฐํํ๋ ์ ์ ๋ชจ๋ธ๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ๋ฐ์ด๋๋ฆฌ ํ์ธ ๊ฒฝ์ฐ ๊ตฌํํ๊ธฐ ์ํด ๋น๊ต๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ๊ณต์ง์ฒ๋ผ ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ๋ ์์ ๋กญ์ต๋๋ค - ๋ถ๋นํ ๋ณต์ก์ฑ? ๊ทธ๋ฐ ์ด์ ๋ก ๊บผ๋ด๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
๋ ๊ฐ์ Enqueue๋ ์ฐ๋ฐ์ ์ด์์ต๋๋ค. ์ฐ์ ์์๊ฐ ํญ์ ์ ๋ฐ์ดํธ๋๋ EnqueueOrUpdate๊ฐ ์์ต๋๋ค. ๋๋ TryUpdate๊ฐ ๊ทธ๊ฒ์ ๋ ผ๋ฆฌ์ ์ญ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ์ด๋ฏธ ์ปฌ๋ ์ ์ ์๋ ํญ๋ชฉ์ ๋ํด ์ฐ์ ์์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์์ผ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ผ๋ฆฌ์ ๊ฒฉ์ฐจ๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ ๋ณผ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ์ค์ ๋ก ์ฌ๋๋ค์ด ์ํ๋ API์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.
๊ฐ์ํ๋ ๋ณํ์ ์ฌ์ฉํ๋ ๊ฒ๋ง ์์ํ ์ ์์ต๋๋ค. ๋
ธ๋๋ฅผ ๋๊ธฐ์ด์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋
ธ๋๋ฅผ ์ฐ์ ์์๊ฐ ๋ฎ์ ๋
ธ๋๋ก ๊ต์ฒดํ๋ ๊ฒ์ ๊ฒฝ๋ก ์ฐพ๊ธฐ์์ ์์ฐ์ค๋ฌ์ด ์์
์
๋๋ค. ๋๋ ์ฆ์ ๋ฐ๋์ ์ฉ๋๋ฅผ ์ ์ํ ์ ์์๋ค. boolean
๋ฐํ ๋งค๊ฐ๋ณ์๋ ํญ๋ชฉ์ด ๋๊ธฐ์ด์ ์๊ฑฐ๋ ๋๊ธฐ์ด์ ์์ง ์์ ๋ ์์
์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ ํธ๋ฆฌํ ์ ์์ต๋๋ค.
๋๋ ๋ฐ์ด๋๋ฆฌ ํ์ ๊ฐ์ ํ์ง ์์์ง๋ง ๊ทธ๊ฒ์ด ๋ฌด๋ฃ๋ผ๋ฉด ์ฒซ ๋ฒ์งธ ์์๊ฐ ํญ์ ์ต์๊ฐ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋จ์ง ์ด์ํ ์ ์ฝ์ผ๋ก ๋ณด์์ต๋๋ค.
@VisualMelon @TimLovellSmith ํ๋์ API๋ก ๊ด์ฐฎ์๊น์?
EnqueueOrUpdatePriority
? ๋๊ธฐ์ด ๋ด์์ ๋
ธ๋๋ฅผ ์ฌ๋ฐฐ์นํ๋ ๊ธฐ๋ฅ์ ์ฐ์ ์์๋ฅผ ๋์ด๊ฑฐ๋ ๋ฎ์ถ๋๋ผ๋ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@Jlalond ์, ๊ตฌํ์ ๋ฐ๋ผ ํจ์จ์ฑ์ ๋์์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ธ๊ธํ๊ณ ๋๊ธฐ์ด์ ์ด๋ฏธ ์๋ ๊ฒ์ ๊ฐ์ ํ๋ ๊ฒฝ์ฐ์๋ง ๋๊ธฐ์ด์ ๋ฃ๊ณ ์ถ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ ์ธ์ฝ๋ฉํฉ๋๋ค. ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ด ๊ทธ๋ฌํ ๋ฒ์ฉ ๋๊ตฌ์ ์ ํฉํ์ง ์ฌ๋ถ๋ฅผ ๋งํ์ง ์๊ฒ ์ง๋ง ํ์คํ ํ์ํ ๊ฒ์ ์๋๋๋ค.
EnqueueOrUpdate ๋ฐ EnqueueOrDecrease๋ฅผ ์ ์งํ๋ฉด์ EnqueueOrIncreasePriority๋ฅผ โโ์ ๊ฑฐํ๋๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค. HashSet.Add()์ ๊ฐ์ด ์ปฌ๋ ์ ์ ํญ๋ชฉ์ด ์๋ก ์ถ๊ฐ๋ ๋ bool์ ๋ฐํํ๋๋ก ํฉ๋๋ค.
@Jlalond ์์ ์ค๋ฅ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค(์ด ๋ฌธ์ ๊ฐ ์ธ์ ๊ฒํ ๋๋์ง ๋ฌป๋ ์ต๊ทผ ๋๊ธ ์ญ์ ).
@eiriktsarpalis ๊ฐ ๋ค์ ์ฃผ์ ๋ค์ ๋์์ฌ ๊ฒ์ด๋ฉฐ ์ด ๊ธฐ๋ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ๊ณ API๋ฅผ ๊ฒํ ํ ๋ ๋ ผ์ํ ์์ ์ ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํ๊ณ ์์ง๋ง ์์ง .NET 6์ ๋ํด ์ปค๋ฐ๋์ง ์์ ๊ฒ์ ๋๋ค.
์ด ์ค๋ ๋๋ 2017๋ ์ ์ด ์ฃผ์ ์ ๋ํด ๋ช ๋ฌ ๋์(์ด ๊ฑฐ๋ํ ์ค๋ ๋์ ๋๋ถ๋ถ) ์ฌ์ธต ํ ๋ก ์ ํ๊ณ ๊ณต๋์ผ๋ก ์ด ์ ์์ ์์ฑํ์์๋ ๋ถ๊ตฌํ๊ณ ์ฒ์๋ถํฐ ์์ํ๊ณ ๋ถ๊ธฐํ์ฌ ๋์ด์๋ฌ์ต๋๋ค. ์๋ก ์คํฌ๋กคํ์ฌ ํ์ธํ์ญ์์ค. ์ด๊ฒ์ ๊ฐ์์ฑ์ ์ํด @karelz๊ฐ ์ฒซ ๋ฒ์งธ ๊ฒ์๋ฌผ์ ์ฒซ ๋ฒ์งธ ์ค์ ๋งํฌํ ์ ์์ด๊ธฐ๋ ํฉ๋๋ค.
corefxlab repo์์ ์ต์ ์ ์ ์ ์ฐธ์กฐํ์ญ์์ค.
2017๋ 6์ 16์ผ ํ์ฌ ์ฐ๋ฆฌ๋ ํ ๋ฒ๋ ๋ฐ์ํ ์ ์ด ์๋ API ๊ฒํ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์๊ณ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
API๊ฐ ํ์ฌ ํ์(2๊ฐ ํด๋์ค)์ผ๋ก ์น์ธ๋๋ฉด 4์ฐจ ํ์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ๋ชจ๋์ ๋ํ ๊ตฌํ์ผ๋ก CoreFXLab์ ๋ํ ๋ ๋ค๋ฅธ PR์ ์์ฑํฉ๋๋ค( ๊ตฌํ ์ฐธ์กฐ ).
PriorityQueue<T>
๋ ์๋์ ํ๋์ ๋ฐฐ์ด๋ง ์ฌ์ฉํ๊ณPriorityQueue<TElement, TPriority>
๋ ๋ ๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ฅผ ํจ๊ป ์ฌ๋ฐฐ์ดํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ ํ ๋น์ ์ ์ฝํ๊ณ ์ต๋ํ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก๋ถ์ด ๋ค์ด์ค๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
์์ง ๋ฐ์ํ์ง ์์ ๊ณต์ ๊ฒํ ๋ถํฐ ์์ํ์ฌ 2017๋ ์ ์ ์ํ ๋ด์ฉ์ ๊ณ์ ๋ฐ๋ณตํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์ด ์๋ฐฑ ๊ฐ์ ๊ฒ์๋ฌผ์ ๊ตํํ ํ ์์ฑ๋ ์ ์์์ ํฌํฌ ๋ฐ ๋ฐ๋ณต์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋์ ๋ ธ๋ ฅ์ ์กด์คํฉ๋๋ค. ํผ๋๋ฐฑ์ด ์์ผ๋ฉด ๊ธฐ๊บผ์ด ๋ ผ์ํ๊ฒ ์ต๋๋ค.
@pgolebiowski ํ ๋ก ์ ๋ค์ ์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ํ์ ๋ฐฉ๋ฒ์ด ์๋ ์ ์์ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ๋ถ๊ธฐํ์ฌ ์ฃ์กํฉ๋๋ค. ๋๋ก์๋ ์ถฉ๋์ ์ธ ํ๋์ด์๋ค. (์ง๊ธ๊น์ง ์ ์์์ ๋ฏธํด๊ฒฐ ์ง๋ฌธ์ด ๋๋ฌด ๋ง์ ํ ๋ก ์ด ์์ ํ ์ค๋จ๋ ๋๋์ด์๊ณ , ์ข ๋ ์์ ์๋ ์ ์์ด ํ์ํ์ ๋ฟ์ ๋๋ค.)
์ ์ด๋ ์ผ์์ ์ผ๋ก ๋ด PR์ ์ฝ๋ ๋ด์ฉ์ ์์ด๋ฒ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ ํ์ธ๋ '๋ฏธํด๊ฒฐ ๋ฌธ์ '์ ๋ํด ๋ค์ ๋ ผ์ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ฉด ์ด๋ป์ต๋๊น? ๋๋ ๊ทธ๋ค ๋ชจ๋์ ๋ํ ๋์ ์๊ฒฌ์ ๋งํ๊ณ ์ถ์ต๋๋ค.
ํด๋์ค ์ด๋ฆ PriorityQueue vs. Heap <-- ์ด๋ฏธ ๋ ผ์๋์์ผ๋ฉฐ PriorityQueue๊ฐ ๋ ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
IHeap ๋ฐ ์์ฑ์ ์ค๋ฒ๋ก๋๋ฅผ ๋์ ํ์๊ฒ ์ต๋๊น? <-- ๋๋ ๋ง์ ๊ฐ์น๋ฅผ ์์ํ์ง ์์ต๋๋ค. ๋๋ ์ธ๊ณ์ 95%์ ๋ํด ๋ค์ค ํ ๊ตฌํ์ด ์์ด์ผ ํ๋ ๊ฐ๋ ฅํ ์ด์ (์: ์ฑ๋ฅ ๋ธํ)๊ฐ ์๋ค๊ณ ์๊ฐํ๊ณ ๋๋จธ์ง 5%๋ ์๋ง๋ ์์ฒด์ ์ผ๋ก ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค.
IpriorityQueue๋ฅผ ์๊ฐํ์๊ฒ ์ต๋๊น? <-- ์ ๋ ํ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์ธ์ด์ ํ๋ ์์ํฌ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฌํ ์ธํฐํ์ด์ค ์์ด๋ ์ ์๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๊ฒ์ด ์๋ชป๋ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค.
์ ํ๊ธฐ(๊ฐ ๋ด๋ถ์ ์ ์ฅ๋ ์ฐ์ ์์)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์(5๊ฐ์ API ์ฐจ์ด) <-- ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์ ํ๊ธฐ๋ฅผ ์ง์ํ๋ ๋ฐ ์ฐฌ์ฑํ๋ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ด ์์ต๋๋ค. IComparer<>
์ด๋ฏธ ํญ๋ชฉ ์ฐ์ ์์๋ฅผ ๋น๊ตํ๊ธฐ ์ํ ์ ๋ง ์ข์ ์ต์ ํ์ฅ์ฑ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์ ํ๊ธฐ๋ ํฐ ๊ฐ์ ์ ์ ๊ณตํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ์ฌ๋๋ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐ์ ์์๊ฐ ์๋ ์ ํ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ(๋๋ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ)์ ๋ํด ํผ๋์ค๋ฌ์ํ ์ ์์ต๋๋ค.
ํํ(TElement ์์, Tpriority ์ฐ์ ์์) ๋ KeyValuePair ์ฌ์ฉKeyValuePair
๋ ํญ๋ชฉ์ด ์ธํธ/์ฌ์ ์์ ํค๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ํญ๋ชฉ์ด ์
๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์๋ฅผ ๊ฐ๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ ํธ๋๋ ์ต์
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Peek๊ณผ Dequeue๋ ํํ ๋์ ์ out ์ธ์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๊น? <-- ๋ชจ๋ ์ฅ๋จ์ , ํนํ ์ฑ๋ฅ์ด ํ์คํ์ง ์์ต๋๋ค. ๊ฐ๋จํ ๋ฒค์น๋งํฌ ํ ์คํธ์์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋ ๊ฒ์ ์ ํํด์ผ ํฉ๋๊น?
Peek and Dequeue ๋์ง๊ธฐ๊ฐ ์ ํ ์ ์ฉํฉ๋๊น? <-- ์... ๋๊ธฐ์ด์ ์ฌ์ ํ ํญ๋ชฉ์ด ์๋ค๊ณ ์๋ชป ๊ฐ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๋ฐ์ํด์ผ ํ๋ ์ผ์ ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฅผ ๊ฐ์ ํ์ง ์๋๋ก ํ๋ ค๋ฉด Peek ๋ฐ Dequeue API๋ฅผ ์ ํ ์ ๊ณตํ์ง ์๊ณ TryPeek ๋ฐ TryDequeue๋ง ์ ๊ณตํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. [ํน์ ๊ฒฝ์ฐ์ Peek ๋๋ Dequeue๋ฅผ ์์ ํ๊ฒ ํธ์ถํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์ผ๋ฉฐ Peek/Dequeue๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ฑ์ด ์ฝ๊ฐ ํฅ์๋ฉ๋๋ค.]
๊ทธ ์ธ์๋ ๊ณ ๋ ค ์ค์ธ ์ ์์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ ๋ช ๊ฐ์ง ์ ์์ด ์์ต๋๋ค.
์ฐ์ ์์ ํ
์ฐ์ ์์ ํ
PriorityQueue๊ฐ ์์ผ๋ฉด ๊ฒ์ผ๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ํธ๋ฆฌํฉ๋๋ค.
๊ฐ์ฅ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ์ข์ต๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ด ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ '์ต์ ๋น์ฉ'์ผ๋ก ์ต์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๊ฑฐํ์ ์ฃผ๋ฌธ ๋ณด์ฆ์ ์ ๊ณตํด์๋ ์ ๋ฉ๋๋ค.
๋ฏธํด๊ฒฐ ๋ฌธ์ - ์ฒ๋ฆฌ:
์ฐ์ ์์ ํ
์ด ์ ํ์ ๋ ๋น ๋ฅด๊ฒ ์ด๋ํ๋ ๋ฐ ๋์์ด ๋๋๋ก https://github.com/dotnet/runtime/discussions/42205 ์์ ๋ ผ์ ์ค์ธ "์ปค๋ฎค๋ํฐ ์ปฌ๋ ์ " ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด ์ ํ์ ์ด๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
๋๋ ๊ฐ์ฅ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ์ข๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ํด ๊ธฐ๋ฐ ๊ฒ์ ๊ฐ๋ฐ์๋ ์ ์ฉํ๋ฉฐ, ๊ฐ ์์๊ฐ ๋ค์ ์ฐจ๋ก๋ฅผ ๊ฐ์ก์ ๋ ๋จ์กฐ๋กญ๊ฒ ์ฆ๊ฐํ๋ ์นด์ดํฐ๊ฐ ๋๋๋ก ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ ์๋ ๊ฒ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ฐ๋ฆฌ๋ API ๊ฒํ ๋ฅผ ์ต๋ํ ๋นจ๋ฆฌ ์ ๊ณตํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฐพ๊ณ ์์ต๋๋ค(์์ง .NET 6 ๊ธฐ๊ฐ ๋ด์ ๊ตฌํ์ ์ ๊ณตํ๊ธฐ๋ก ์ฝ์ํ์ง๋ ์์์ง๋ง).
๊ทธ๋ฌ๋ ๊ฒํ ๋ฅผ ์ํด ์ด๊ฒ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๋์ ์์ค์ ๊ณต๊ฐ ์ง๋ฌธ์ ์ ๋ฆฌํด์ผ ํฉ๋๋ค. @TimLovellSmith ์ ๊ธ ์ด ๊ทธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์ข์ ์ถ๋ฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ ์ ์ ๋ํ ๋ช ๊ฐ์ง ์ธ๊ธ:
์ง๋ฌธ 1-3์ ๋ํ ํฉ์๋ ์ค๋ซ๋์ ํ๋ฆฝ๋์ด ์์ผ๋ฉฐ, ํด๊ฒฐ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
_์ ํ์ ์ฌ์ฉ(๊ฐ ๋ด๋ถ์ ์ฐ์ ์์๊ฐ ์ ์ฅ๋จ) ์ฌ๋ถ_ -- ๊ทํ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ๊ทธ ๋์์ธ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ ํ๊ธฐ๊ฐ ์ ํ ์ฌํญ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ฆ, ์๋ชป๋ Enqueue
์ค๋ฒ๋ก๋๋ฅผ ํธ์ถํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค(๋๋ InvalidOperationException
๋ฐ์ ์ํ์ด ์์).
๋๋ KeyValuePair
๋ณด๋ค ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. .Key
์์ฑ์ ์ฌ์ฉํ์ฌ TPriority
๊ฐ์ ์ก์ธ์คํ๋ ๊ฒ์ ์ ์๊ฒ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค. ํํ์ ์ฌ์ฉํ๋ฉด ์์ฒด ๋ฌธ์ํ ์์ฑ์ด ๋ ๋์ .Priority
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
_Peek ๋ฐ Dequeue๊ฐ ํํ ๋์ out ์ธ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น?_ -- ๋ค๋ฅธ ๊ณณ์์ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฆฝ๋ ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ง๋ out
์ธ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.
_Peek ๋ฐ Dequeue ๋์ง๊ธฐ๊ฐ ์ ํ ์ ์ฉํฉ๋๊น?_ -- ๊ทํ์ ์๊ฒฌ์ 100% ๋์ํฉ๋๋ค.
_๊ฐ์ฅ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ์ข์ ๊ฒ์ ๋๋ค_ -- ๋์ํฉ๋๋ค.
_์ด๊ฑฐ๋ ์ฃผ๋ฌธ ๋ณด์ฅ์ ์ ๊ณตํด์๋ ์ ๋ฉ๋๋ค_ -- ์ด๊ฒ์ด ์ฌ์ฉ์์ ๊ธฐ๋๋ฅผ ์๋ฐํ์ง ์์๊น์? ์ฅ๋จ์ ์ ๋ฌด์์ ๋๊น? NB API ๊ฒํ ๋ ผ์๋ฅผ ์ํด ์ด์ ๊ฐ์ ์ธ๋ถ ์ฌํญ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
๋๋ ๋ํ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ด๋ฆฐ ์ง๋ฌธ์ ๋ฐ๊พธ์ด ๋งํ๊ณ ์ถ์ต๋๋ค.
PriorityQueue<T>
, PriorityQueue<TElement, TPriority>
๋๋ ๋ ๋ค ๋ฐฐ์กํฉ๋๊น? -- ๊ฐ์ธ์ ์ผ๋ก ํ์๊ฐ ๋ ๊นจ๋ํ๊ณ ๋ฒ์ฉ์ ์ธ ์๋ฃจ์
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ํ์๋ง ๊ตฌํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์น์ ์ผ๋ก ์ฐ์ ์์๋ ๋๊ธฐ ์ค์ธ ์์์ ๊ณ ์ ํ ์์ฑ์ด ๋์ด์๋ ์ ๋๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ด๋ฅผ ๋ํผ ์ ํ์ผ๋ก ์บก์ํํ๋๋ก ๊ฐ์ ํด์๋ ์ ๋ฉ๋๋ค.
ํ๋ฑ๊น์ง ์์ ๊ณ ์ ์ฑ์ ์๊ตฌํฉ๋๊น? -- ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง ๊ณ ์ ์ฑ์ ์ธ์์ ์ธ ์ ์ฝ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํธ๋ค ์ ๊ทผ ๋ฐฉ์์ ์์กดํ์ง ์๊ณ ์ ๋ฐ์ดํธ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์ํด ๊ฐ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํ API ํ๋ฉด์ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ์ด์ ์์๊ฐ ์ฌ๋ฐ๋ฅธ ๋๋ฑ ์๋ฏธ๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(์์๊ฐ ํฐ DTO์ผ ๋ ์ ์ ํ ๋๋ฑ์ฑ์ ๋ฌด์์ ๋๊น?). ์ฌ๊ธฐ์์ ์ธ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
Enqueue
๋ฉ์๋ ๋ณํ์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์์ต๋๋ค. ํธ๋ค ํ ๋น์ด ์ถฉ๋ถํ ํฐ ๋ฌธ์ ๋ผ๋ฉด ValueTask๋ก ์๊ฐํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.๋ณํฉ ๋๊ธฐ์ด์ ์ง์ํฉ๋๊น? -- ๋ณํฉ์ด ํจ์จ์ ์ด์ง ์์ ํ๋์ ๊ตฌํ(์๋ง๋ ๋ฐฐ์ด ํ ์ฌ์ฉ)๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ํฉ์๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๊น? -- IQueue<T>
์ถ์ฒํ๋ ๋ช ๊ฐ์ง ์ ์์ ๋ณด์์ง๋ง ์ด๊ฒ์ ์ถ์ํ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋จ์ํ๊ฒ ์ ์งํ๊ณ ICollection<T>
๊ตฌํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
cc @layomia @safern
@eiriktsarpalis ๋ฐ๋๋ก - ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๊ธฐ ์ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ์ธ์์ ์ธ ๊ฒ์ ์ ํ ์์ต๋๋ค!
์ฐ์ ์์ ๋๊ธฐ์ด์ด ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ข
์ข
์์์ ์ฐ์ ์์๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ๋ฌธ์ ๋ ์ผ๋ฐ ๊ฐ์ฒด์ ์ฐ์ ์์๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด '๊ทธ๋ฅ ์๋'ํ๋ ๊ฐ์ฒด ์งํฅ API๋ฅผ ์ ๊ณตํฉ๋๊น? ์๋๋ฉด ์ฌ๋๋ค์๊ฒ ๊ฐ์ ๋ก
a) ํธ๋ค ๋ชจ๋ธ ์ดํด
b) ์
๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์๋๋ก ์ถ๊ฐ ์์ฑ์ด๋ ์ธ๋ถ ์ฌ์ ๊ณผ ๊ฐ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ์ฌ ๊ฐ์ฒด ํธ๋ค์ ์ถ์ ํฉ๋๋ค(๋ณ๊ฒฝํ ์ ์๋ ํด๋์ค์ ์ฌ์ ๊ณผ ํจ๊ป ์ด๋ํด์ผ ํฉ๋๊น? ๋๋ ๊ฐ์ฒด๋ฅผ ํํ๋ก ์
๊ทธ๋ ์ด๋ ๋ฑ)
c) '๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ' ๋๋ '๊ฐ๋น์ง ์์ง' ์ธ๋ถ ๊ตฌ์กฐ, ์ฆ ์ฌ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๋ ๋๊ธฐ์ด์ ๋ ์ด์ ์๋ ํญ๋ชฉ์ ๋ํ ํธ๋ค ์ ๋ฆฌ
d) ๋จ์ผ ์ฐ์ ์์ ํ์ ์ปจํ
์คํธ์์๋ง ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ํ๊ฐ ์๋ ์ปจํ
์คํธ์์ ๋ถํฌ๋ช
ํธ๋ค์ ํผ๋ํ์ง ๋ง์ญ์์ค.
๊ฒ๋ค๊ฐ ๋๊ตฐ๊ฐ๊ฐ _์ฐ์ ์์์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋_ ํ๊ฐ ์ด๋ฐ ์์ผ๋ก ํ๋ํ๊ธฐ๋ฅผ ์ํ๋ ์ ์ฒด ์ด์ ์ ๋ํ ์ฒ ํ์ ์ธ ์ง๋ฌธ์ด ์์ต๋๋ค. ์ ๋์ผํ ๊ฐ์ฒด(๊ฐ์์ true๋ฅผ ๋ฐํํจ)์ 2๊ฐ์ _๋ค๋ฅธ_ ์ฐ์ ์์๊ฐ ์์ด์ผ ํฉ๋๊น? ๊ทธ๊ฒ๋ค์ด ์ ๋ง๋ก ๋ค๋ฅธ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๋ฉด ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ชจ๋ธ๋ง๋์ง ์์ต๋๊น? (๋๋ ๊ตฌ๋ถ์๋ฅผ ์ฌ์ฉํ์ฌ ํํ๋ก ์ํฅ ๋ณํํ์๊ฒ ์ต๋๊น?)
๋ํ ํธ๋ค์ ๊ฒฝ์ฐ ํธ๋ค์ด ์ค์ ๋ก ์๋ํ๋๋ก ์ฐ์ ์์ ํ์ ๋ด๋ถ ํธ๋ค ํ ์ด๋ธ์ด ์์ด์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋๊ธฐ์ด์์ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ์ ์ ์ ์งํ๋ ๊ฒ๊ณผ ๋์ผํ ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ถ์ : ๋ชจ๋ .net ๊ฐ์ฒด๋ ์ด๋ฏธ ํ๋ฑ/๊ณ ์ ์ฑ์ ๊ฐ๋ ์ ์ง์ํ๋ฏ๋ก '์๊ตฌ'ํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
KeyValuePair
์ ๊ด๋ จํ์ฌ ์ด์์ ์ด์ง ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค(์ ์์์ Key
๋ ์์์ ๋ํ ๊ฒ์ด๊ณ Value
๋ ์ฐ์ ์์์ ๋ํ ๊ฒ์ด๋ฉฐ ์ด๋ ๋ค์ํ Sorted
๋ฐ์ดํฐ ์ ํ์ BCL)์ด๋ฉฐ ์ ์ ์ฑ์ ๊ณ ์ ์ฑ์ ๋ํ ๊ฒฐ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๊ณต๊ฐ API์ ํํ๋ณด๋ค ์ด๋ฆ์ด ์ ์ง์ ๋ ์ ์ฉ struct
๋ฅผ _๋ง์ด_ ์ ํธํฉ๋๋ค. ํนํ ์
๋ ฅ์ ๊ฒฝ์ฐ ๊ทธ๋ ์ต๋๋ค.
๋
์ฐฝ์ฑ์ ๊ดํด์๋ ๊ทธ๊ฒ์ด ๊ทผ๋ณธ์ ์ธ ๊ด์ฌ์ฌ์ด๋ฉฐ, ๊ทธ๋ ๊ฒ ๋ ๋๊น์ง ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๊ฒฐ์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชฉํ๊ฐ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋จ์ผ ๋ฒ์ฉ API์ธ ๊ฒฝ์ฐ (์ ํ ์ฌํญ) ๋น๊ต๊ธฐ(๊ธฐ์กด ์ ์ ๋ฐ ์ ์ i์ ๋ฐ๋ผ)์ ์ํด ์ ์๋ ์์ ๊ณ ์ ์ฑ์ ์ ํธํฉ๋๋ค. ๊ณ ์ ๋ ๋น ๊ณ ์ ๋ ํฐ ๊ท ์ด์ด๋ฉฐ ๋ ์ ํ์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ ์๋ ๊ตฌํํ๊ธฐ๊ฐ '๋ ์ด๋ ต๊ณ ' ๊ฐ์ฅ (๊ทธ๋ฆฌ๊ณ ๋ ์ผ๋ฐ์ ์ธ) ์ฌ์ฉ ์ฌ๋ก(๋ด ๊ฒฝํ์ผ ๋ฟ)๋ฅผ ๋ค๋ฃจ์ง๋ง ์ค์ฉํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ๋น๊ณ ์ ์ฑ(IMO)์ด ๋ค๋ฅธ ์ ํ(์: ์ผ๋ฐ ์ด์ ๋ฐ์ด๋๋ฆฌ ํ)์ ์ํด _require__ํ์ํ_ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ ๋ ๋ค ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก @pgolebiowski๊ฐ ๋งํฌํ ์๋ ์ ์์ด ๋ชจ๋๋ก(๊ฐ๋จํ) ๋ํผ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. _ํธ์ง: ์๋์, ๋ฌถ์ธ ์ฐ์ ์์๋ฅผ ์ง์ํ์ง ์์ต๋๋ค_
๋ฐ๋๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ธ์์ ์ธ ๊ฒ์ด ์ ํ ์์ต๋๋ค!
์ฃ์กํฉ๋๋ค. ์ ๋ฐ์ดํธ ์ง์์ด ์ธ์์ ์ด๋ผ๋ ๋ป์ ์๋๋๋ค. ์คํ๋ ค ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๊ณ ์ ์ฑ์ ๋ํ ์๊ตฌ ์ฌํญ์ด ์ธ์์ ์ผ๋ก ๋์ ๋์์ต๋๋ค.
์ถ์ : ๋ชจ๋ .net ๊ฐ์ฒด๋ ์ด๋ฏธ ํ๋ฑ/๊ณ ์ ์ฑ์ ๊ฐ๋ ์ ์ง์ํ๋ฏ๋ก '์๊ตฌ'ํ๋ ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
๋ฌผ๋ก , ๊ทธ๋ฌ๋ ๋๋๋ก ์ ํ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๊ฐ์ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ฐ๋์งํ ๊ฒ์ด ์๋ ์๋ ์์ต๋๋ค(์: ์ฐธ์กฐ ๊ฐ์, ์์ ํ ๊ตฌ์กฐ์ ๊ฐ์ ๋ฑ). ๋๋ ํ๋ฑ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์ง์ ํ๊ณ ๊ทธ๊ฒ์ ๋์์ธ์ ๊ฐ์ํ๋ ๊ฒ์ ์ ์ฌ์ ์ธ ์ฌ์ฉ์ ๋ฒ๊ทธ์ ์์ ํ ์๋ก์ด ๋ถ๋ฅ๋ฅผ ๊ฐ์ ธ์จ๋ค.
@eiriktsarpalis ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ์ ๋ง ์ธ๊ณต์ผ๊น? ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ์์ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋๋ค.
API๋ _์ ์ ์_๋์ด์ผ ํฉ๋๋ค. ์ฌ์ฉ์ ๊ฐ ์ ๋ฐ์ดํธํ๋ ค๋ ํญ๋ชฉ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์๊ตฌํ์ง ์๊ณ ๋ ์ ๋ฐ์ดํธ API๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ํธ๋ค๊ณผ ๊ฐ์ฒด ๋๋ฑ์ฑ์ ์ ์ ์๋ API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ผ ๋ฟ์ ๋๋ค.
ํธ๋ค ์ ๊ทผ ๋ฐฉ์: ์ปฌ๋ ์ ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค '์ด๋ฆ', ์ฆ 'ํธ๋ค'์ ์ง์ ํด์ผ ๋์ค์ ๋ํ์์ ๋ชจํธํจ ์์ด ์ ํํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
๊ฐ์ฒด ๊ณ ์ ์ฑ ์ ๊ทผ ๋ฐฉ์: ์ปฌ๋ ์ ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ฌ์ผ ํ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํฉ๋๋ค.
๋ถํํ๋ ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ์๋ง์ด 'EnqueueIfNotExists' ๋๋ 'EnqueueOrDecreasePriroity(item)'์ ๊ฐ์ ๊ฐ์ฅ ์ ์ฉํ ๊ณ ์์ค API ๋ฉ์๋ ์์ฑ์ ์ค์ ๋ก ์ง์ํ๋๋ก ํ์ฉํฉ๋๋ค. ํญ๋ชฉ์ด ์ด๋ฏธ ๋๊ธฐ์ด์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค(ํธ๋ค์ ์ฌ์ฉํ์ฌ ์ถ์ ํ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์).
ํธ๋ค ์ ๊ทผ ๋ฐฉ์์ ๋ํ ๊ฐ์ฅ ํ์คํ ๋นํ ์ค ํ๋๋ ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์๊ฐ ์๋ ๋ชจ๋ ์ข ๋ฅ์ ์๋๋ฆฌ์ค๋ฅผ ๊ตฌํํ๊ธฐ๊ฐ ํจ์ฌ ๋ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
์
์ถ์
๋ฌผ๋ก , ๊ทธ๋ฌ๋ ๋๋๋ก ์ ํ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ํ๋ฑ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ฐ๋์งํ์ง ์์ ์ ์์ต๋๋ค.
IEqualityComparer์ ๊ฐ์ ํ์ถ ํด์น๊ฐ ์๊ฑฐ๋ ๋ ํ๋ถํ ์ ํ์ผ๋ก ์ํฅ ๋ณํ๋ฉ๋๋ค.
ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค ๐ฅณ ๋ชจ๋ ์๋ก์ด ์ ๋ ฅ์ ๊ณ ๋ คํ์ฌ ์ฃผ๋ง ๋์ ์ ์์ ์ ๋ฐ์ดํธํ๊ณ ๋ค๋ฅธ ๋ผ์ด๋๋ฅผ ์ํด ์๋ก์ด ์์ ๋ณธ์ ๊ณต์ ํ ๊ฒ์ ๋๋ค. ์์ ์ผ 2020-09-20.
.NET Core ์ปค๋ฎค๋ํฐ๋ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ _priority queue_ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ ์์์ ์ถ๊ฐ๋ก ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ํนํ System.Collections.Generic
๋ค์์คํ์ด์ค์ PriorityQueue<TElement, TPriority>
๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ค๊ณ์์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์น์ ๋ฐ๋ผ ์งํ๋์์ต๋๋ค(๋ ๋์ ์์น์ ์๊ณ ์์ง ์๋ ํ).
๊ฐ๋ ์ ์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ ์์์ ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ์์ ๋ชจ์์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ ์ปฌ๋ ์ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์์์ ๋ํ ํจ์จ์ ์ธ ์ก์ธ์ค์ ํด๋น ์์๋ฅผ ์ ๊ฑฐํ๋ ์ต์ ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์๋๋ ๋์์๋ ๋ค์์ด ํฌํจ๋ ์๋ ์์ต๋๋ค. 1) ์ด๋ฏธ ์ปฌ๋ ์ ์ ์๋ ์์์ ์ฐ์ ์์๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ; 2) ์ฌ๋ฌ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ณํฉํ๋ ๊ธฐ๋ฅ.
์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ฆ, ์ด์ ์น์ ์์ ์ค๋ช ํ ๋๋ก ํน์ ๋์ ํน์ฑ์ ๊ฐ์ง ๊ฐ๋ ์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ ์คํด์ ๋ฌ๋ฆฌ ํ(heap)๋ ์ถ์์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ๋ค๋ฆ ๋๋ค.
๋๋ถ๋ถ์ ์ํํธ์จ์ด ์์ง๋์ด๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ ๊ตฌํ์๋ง ์ต์ํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌํ์ด์ง๋ง ๋ถํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๋ ํจ์จ์ ์ธ ํ ์ ํ์ ๋ ๊ฐ์ง ์๋ 4์ฐจ ํ ๋ฐ ํ์ด๋ง ํ ์ ๋๋ค. ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ Wikipedia ๋ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฐ๋ฆฌ์ ๋ ผ์๋ ์ค๊ณ์์ ๊ฐ์ฅ ๋์ ์ ์ธ ์์ญ์ด์ ๋์์ API์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ญ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ํนํ ๋ฌธ์ ๋ ๊ณ ๊ฐ์๊ฒ ์ ๊ณตํ๋ ค๋ ์ ํ์ด ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค์ด Dijkstra์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ณํํ๋ ์ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค. Java์๋ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ ๋ฅผ ๋ค์ด 32,000๋ฒ ์ด์ ์กฐํ๋ ์ธ ๊ฐ์ง StackOverflow ์ง๋ฌธ์ธ example , example , example ์์ ์์ง๋์ด์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ ๊ฐ์น์ API ๋์ ์ ํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ๋ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ค๋ฉด ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธํ๋ ค๋ ํญ๋ชฉ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ๋ฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ธํ์ต๋๋ค. b) ์ปฌ๋ ์ ์ ์๋ ์์์ ๊ณ ์ ์ฑ ์ ์ฉ์ ํตํด. ์ด๋ค ๊ฐ๊ฐ์ ๋ค๋ฅธ ์ด์ ๊ณผ ๋น์ฉ์ ์๋ฐํฉ๋๋ค.
์ต์ (a): ํธ๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์์๊ฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ณ ์ ํ ํธ๋ค์ ์ ๊ณตํฉ๋๋ค. ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋์ค์ ์ ๋ฐ์ดํธํ๋ ค๋ ์์๋ฅผ ๋ช ํํ๊ฒ ์ง์ ํ ์ ์๋๋ก ์ด๋ฌํ ํธ๋ค์ ์ถ์ ํด์ผ ํฉ๋๋ค. ์ด ์๋ฃจ์ ์ ์ฃผ์ ๋น์ฉ์ ๊ณ ๊ฐ์ด ์ด๋ฌํ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์์ ํธ๋ค์ ์ง์ํ๊ธฐ ์ํด ๋ด๋ถ ํ ๋น์ด ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ฐฐ์ด ๊ธฐ๋ฐ์ด ์๋ ๋ชจ๋ ํ์ ๊ฐ ๋ ธ๋๊ฐ ์๋์ผ๋ก ์์ฒด ํธ๋ค์ด ๋๋ ๋ ธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด PairingHeap.Update ๋ฉ์๋์ API๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ต์ (b): ๊ณ ์ ์ฑ. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๊ฐ์๊ฒ ๋ ๊ฐ์ง ์ถ๊ฐ ์ ์ฝ์ ๊ฐํฉ๋๋ค. i) ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์ ์์๋ ์๋ก์ด ํด๋์ค์ ์ ์ฌ์ ์ฌ์ฉ์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ํน์ ํ๋ฑ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ii) ๋ ๊ฐ์ ๋์ผํ ์์๋ ๋์ผํ ๋๊ธฐ์ด์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ๋น์ฉ์ ์ง๋ถํจ์ผ๋ก์จ ํธ๋ค ์ ๊ทผ ๋ฐฉ์์ ์์กดํ์ง ์๊ณ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ ์ด์ ์ ์ป์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ์ ์ฑ/๋๋ฑ์ฑ์ ํ์ฉํ์ฌ ์ ๋ฐ์ดํธํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋ชจ๋ ๊ตฌํ์๋ ์ถ๊ฐ ๋ด๋ถ ๋งคํ์ด ํ์ํ๋ฏ๋ก O(n)์ด ์๋ O(1)์์ ์ํ๋ฉ๋๋ค.
ํธ๋ค์ ํตํด ์
๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ PriorityQueue<TElement, TPriority>
ํด๋์ค๋ฅผ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธฐ๋ณธ ๊ตฌํ ์ ํ์ด๋ง ํ์
๋๋ค.
public class PriorityQueueNode<TElement, TPriority>
{
public TElement Element { get; }
public TPriority Priority { get; }
}
public class PriorityQueue<TElement, TPriority> :
IEnumerable<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueue();
public PriorityQueue(IComparer<TPriority> comparer);
public IComparer<TPriority> Comparer { get; }
public int Count { get; }
public bool IsEmpty { get; }
public void Clear();
public bool Contains(TElement element); // O(n)
public bool TryGetNode(TElement element, out PriorityQueueNode<TElement, TPriority> node); // O(n)
public PriorityQueueNode<TElement, TPriority> Enqueue(TElement element, TPriority priority); //O(log n)
public PriorityQueueNode<TElement, TPriority> Peek(); // O(1)
public bool TryPeek(out PriorityQueueNode<TElement, TPriority> node); // O(1)
public void Dequeue(out TElement element); // O(log n)
public bool TryDequeue(out TElement element, out TPriority priority); // O(log n)
public void Update(PriorityQueueNode<TElement, TPriority> node, TPriority priority); // O(log n)
public void Remove(PriorityQueueNode<TElement, TPriority> node); // O(log n)
public void Merge(PriorityQueue<TElement, TPriority> other) // O(1)
public IEnumerator<PriorityQueueNode<TElement, TPriority>> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
public struct Enumerator : IEnumerator<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueueNode<TElement, TPriority> Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext() => throw new NotImplementedException();
public void Reset() => throw new NotImplementedException();
public void Dispose() => throw new NotImplementedException();
}
}
var queue = new PriorityQueue<Job, double>();
queue.Enqueue(firstJob, 10);
queue.Enqueue(secondJob, 5);
queue.Enqueue(thirdJob, 40);
var withHighestPriority = queue.Peek(); // { element: secondJob, priority: 5 }
var queue = new PriorityQueue<Job, double>();
var mapping = new Dictionary<Job, PriorityQueueNode<Job, double>>();
mapping[job] = queue.Enqueue(job, priority);
queue.Update(mapping[job], newPriority);
HashSet
์ ์ ์ฌํ๊ฒ O(n) ์์ ์ด๊ฑฐ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ์ ์๋์ง ์์ ์์๋ก. ํจ์จ์ ์ธ ๊ตฌํ์ ์์๊ฐ ์์๋๋ก ์ด๊ฑฐ๋๋๋ก ๋ณด์ฅํ๋ฉด์ ์ ํ ์๊ฐ์ ํ์ ์ด๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ O(n log n)์ด ํ์ํฉ๋๋ค. ์ปฌ๋ ์
์ ๋ํ ์ฃผ๋ฌธ์ .OrderBy(x => x.Priority)
๋ก ๊ฐ๋จํ๊ฒ ๋ฌ์ฑํ ์ ์๊ณ ๋ชจ๋ ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์ผ๋ก ์ด๊ฑฐ์ ๊ด์ฌ์ด ์๋ ๊ฒ์ ์๋๋ฏ๋ก ์ ์๋์ง ์์ ์ด๊ฑฐ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
| ์ธ์ด | ์ ํ | ๋ฉ๋ชจ |
|:-:|:-:|:-:|
| ์๋ฐ | ์ฐ์ ์์ ํAbstractQueue
ํ์ฅํ๊ณ ์ธํฐํ์ด์ค Queue
๊ตฌํํฉ๋๋ค. |
| ๋
น | ๋ฐ์ด๋๋ฆฌํ | |
| ์ค์ํํธ | CFBinaryํ | |
| C++ | ์ฐ์ ์์ ๋๊ธฐ์ด | |
| ํ์ด์ฌ | ํQ | |
| ์ด๋ | ํ | ํ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. |
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ ผ์ํ ๋ _heap_์ด๋ผ๋ ์ฉ์ด๋ _priority queue_๋ณด๋ค 4๋ฐฐ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
"array" AND "data structure"
โ 17.400.000 ๊ฒฐ๊ณผ"stack" AND "data structure"
โ 12.100.000๊ฐ์ ๊ฒฐ๊ณผ"queue" AND "data structure"
โ 3.850.000 ๊ฒฐ๊ณผ"heap" AND "data structure"
โ 1.830.000 ๊ฒฐ๊ณผ"priority queue" AND "data structure"
โ 430.000๊ฐ์ ๊ฒฐ๊ณผ"trie" AND "data structure"
โ 335.000๊ฐ์ ๊ฒฐ๊ณผ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ๊ณ์ ๋ฐ๋ณตํ์ญ์์ค :) ์ฐ๋ฆฌ๊ฐ ์๋ ดํ๊ณ ์๋ค๊ณ ๋๋๋๋ค! ๐ ๋ํ ์ง๋ฌธ์ ๋ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. FAQ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค!
@pgolebiowski ํธ๋ค ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝํฅ์ด ์์ต๋๋ค(์์ 2์ ๋ฐ๋ผ ์ด๊ฒ์ ๋ํํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ค์ ๋ง์ถ๋ ๊ฒฝ์ฐ). ํ์ง๋ง ๋๋ถ๋ถ ๋์๊ฒ ์ข์ ๋ณด์ ๋๋ค. ๋๋ ๋น์ ์ด ์ธ๊ธํ ๊ตฌํ์ ์ฌ์ฉํ์ฌ ๋๋์ด ์ด๋ค์ง ๋ณผ ์ ์์ง๋ง ๋ค์์ ๋ฐ์ฅ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฒฌ์ ๋๋ค.
TryDequeue
๊ฐ ๋
ธ๋๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ด์ํด ๋ณด์
๋๋ค. ๊ทธ ์์ ์์ ์ค์ ๋ก ํธ๋ค์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค(๋ ๊ฐ์ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํธํฉ๋๋ค)Merge
๋์ด์ผํฉ๋๋ค PriorityQueue'2
ํ์ง PriorityQueueNode'2
, ๋น์ ์ ํ๋์ ๋ช
ํํ ํ ์ ์์ต๋๊น? ๋๋ ํ์ด๋ง ํ์ ์ต์ํ์ง ์์ง๋ง ์๋ง๋ ๋ ํ์ด ๊ทธ ์ดํ์ ๊ฒน์น ๊ฒ์
๋๋ค.Contains
๋ผ๋ ์ด๋ฆ์ ํฌ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ TryGet
์คํ์ผ ๋ฐฉ๋ฒ์ ๋ํด ์ถ์ธกํ ์ ์๋ ์ด๋ฆ์ด ์๋๋๋ค.Contains
์ ๋ชฉ์ ์ ์ํด ์ฌ์ฉ์ ์ ์ IEqualityComparer<TElement>
๋ฅผ ์ง์ํด์ผ ํฉ๋๊น?Remove
๋ฐํ์ด bool
; TryRemove
ํ๊ฑฐ๋ ๋์ก์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(๋
ธ๋๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ Update
๊ฐ ์ํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค).@VisualMelon ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ ์ํ๊ฒ ํด๊ฒฐํ ๊ฒ์ ๋๋ค. ํ์คํ ๋์ํฉ๋๋ค.
TryDequeue
๊ฐ ๋ ธ๋๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ด์ํด ๋ณด์ ๋๋ค. ๊ทธ ์์ ์์ ์ค์ ๋ก ํธ๋ค์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค(๋ ๊ฐ์ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํธํฉ๋๋ค)- ์ ๋งค๊ฐ ๋ณ์
Merge
๋์ด์ผํฉ๋๋คPriorityQueue'2
ํ์งPriorityQueueNode'2
, ๋น์ ์ ํ๋์ ๋ช ํํ ํ ์ ์์ต๋๊น? ๋๋ ํ์ด๋ง ํ์ ์ต์ํ์ง ์์ง๋ง ์๋ง๋ ๋ ํ์ด ๊ทธ ์ดํ์ ๊ฒน์น ๊ฒ์ ๋๋ค.Remove
๋ฐํ์ดbool
.TryRemove
ํ๊ฑฐ๋ ๋์ก์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(๋ ธ๋๊ฐ ํ์ ์๋ ๊ฒฝ์ฐUpdate
๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค).- ๋๋ 2-๋งค๊ฐ๋ณ์ ๋ฐฉ๋ฒ์ ๋ํด
Contains
๋ผ๋ ์ด๋ฆ์ ํฌ์ด ์๋๋๋ค. ๊ทธ๊ฒ์TryGet
์คํ์ผ ๋ฐฉ๋ฒ์ ๋ํด ์ถ์ธกํ ์ ์๋ ์ด๋ฆ์ด ์๋๋๋ค.
์ด ๋ ๊ฐ์ง์ ๋ํ ์ค๋ช :
- ๋ ์์๊ฐ ๋์ผํ ์ฐ์ ์์๋ก ๋๊ธฐ์ด์ ์์ผ๋ฉด ์์ธก ๊ฐ๋ฅํ ์์๋ก ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋๋ค๋ ์ ์์ ์์ ์ ์ ๋๊น? (์ฌํ์ฑ์ ์ํด ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋น์๊ฐ ์ถฉ๋ถํ ์ฝ๊ฒ ๊ตฌํํ ์ ์์)
- ๋ ธ๋๊ฐ ์ฌ์ ํ ํ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค(์ธ์ ์ฌ์ฉํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.)
์ฒซ ๋ฒ์งธ ์์ ์ผ๋ก, ๋ชฉํ๊ฐ ์ฌํ์ฑ์ด๋ผ๋ฉด ๊ตฌํ์ ๊ฒฐ์ ์ ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ต๋๋ค. ๋ชฉํ๊ฐ _์ฐ์ ์์๊ฐ ๊ฐ์ ๋ ๊ฐ์ ์์๊ฐ ๋๊ธฐ์ด์ ๋ฐฐ์น๋๋ ๊ฒฝ์ฐ ๋๊ธฐ์ด์ ๋ฐฐ์น๋ ๊ฒ๊ณผ ๋์ผํ ์์๋ก ๋์ฌ ๊ฒ์ ๋๋ค_ โ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ด ์กฐ์ ํ ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด ์์ฑ์ ๋ฌ์ฑํ๋ฉด ๋น ๋ฅธ ๋๋ต์ "์๋ง๋ ์๋์ค"๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋ ๋ฒ์งธ ์์ ์ ๊ฒฝ์ฐ ์, ํ์ ์์๊ฐ ์ปฌ๋ ์ ์ ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ฐ ์ ํฉํ์ง ์์ต๋๋ค. ๊ณ ๊ฐ์ ์ด๋ฅผ ๋ณ๋๋ก ์ถ์ ํ์ฌ O(1)์์ ๋ฌ์ฑํ๊ฑฐ๋ ํธ๋ค์ ์ฌ์ฉํ๋ ๋งคํ์ ์ฌ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ค์ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด O(n).
- ํด๋์ค๊ฐ
Contains
์ ๋ชฉ์ ์ ์ํด ์ฌ์ฉ์ ์ ์IEqualityComparer<TElement>
๋ฅผ ์ง์ํด์ผ ํฉ๋๊น?
ํ ... ์๋ง Contains
๋ฅผ ์ด ์ฐ์ ์์ ํ์ ์ฑ
์์ ๋งก๊ธฐ๋ ๊ฒ์ด ๋๋ฌด ๋ง์ ์ ์๊ณ Linq
์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค( Contains
์ด์จ๋ ์ด๊ฑฐ์ ์ ์ฉ๋์ด์ผ ํจ).
@pgolebiowski ์ค๋ช ๊ฐ์ฌํฉ๋๋ค
์ฒซ ๋ฒ์งธ ์์ ์ผ๋ก, ๋ชฉํ๊ฐ ์ฌํ์ฑ์ธ ๊ฒฝ์ฐ ๊ตฌํ์ ๊ฒฐ์ ์ ์ ๋๋ค. ๊ทธ๋ ์ต๋๋ค.
์์ํ ๋ณด์ฅ๋๋ ๊ฒ์ฒ๋ผ ๊ทธ๋ค์ง ๊ฒฐ์ ์ ์ด์ง ์์ต๋๋ค(์: ๊ตฌํ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋์์ ๋ณ๊ฒฝ๋์ง ์์). ๊ทธ๋์ ์ ๊ฐ ์ถ๊ตฌํ๋ ๋๋ต์ '์๋์ค'๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ด์ฐฎ์ต๋๋ค. ์๋น์๋ ์ํ์ค ID๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฐ์ ์์์ ์ํ์ค ID๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ๊ทธ ์์ ์์ SortedSet
๊ฐ ์์
์ ์ํํฉ๋๋ค.
๋ ๋ฒ์งธ ์์ ์ ๊ฒฝ์ฐ ์, ํ์ ์์๊ฐ ์ปฌ๋ ์ ์ ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ฐ ์ ํฉํ์ง ์์ต๋๋ค. ๊ณ ๊ฐ์ ์ด๋ฅผ ๋ณ๋๋ก ์ถ์ ํ์ฌ O(1)์์ ๋ฌ์ฑํ๊ฑฐ๋ ํธ๋ค์ ์ฌ์ฉํ๋ ๋งคํ์ ์ฌ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ค์ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด O(n).
Remove
ํ์ํ ์์
์ ํ์ ์งํฉ์ด ํ์ํ์ง ์์ต๋๊น? ๋๋ ๋ช
ํํ์ง ์์์ ์ ์์ต๋๋ค. PriorityQueueNode
์ฃผ์ด์ง ํ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค ( TElement
์๋).
ํ ... ๋๋ ์๋ง๋ ์ด ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฑ ์์ ํฌํจ์ ๋ฃ๋ ๊ฒ์ด ๋๋ฌด ๋ง์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค.
Contains
๊ฐ ์์ผ๋ฉด ๋ถํํ์ง ์์ ๊ฒ์
๋๋ค. ํธ๋ค์ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ฌ์ค์ ๋ชจ๋ฅด๋ ์ฌ๋๋ค์ ์ํ ํจ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
@pgolebiowski ๋น์ ์ ํธ๋ค์ ์๋นํ ์ ํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํจ์จ์ฑ์ ์ด์ ๋ก ์๊ฐํ๋ ๊ฒ์ด ๋ง์ต๋๊น?
ํจ์จ์ฑ ๊ด์ ์์ ํธ๋ค์ด ๊ณ ์ ์ฑ์ด ์๋ ์๋๋ฆฌ์ค์ ์๋ ์๋๋ฆฌ์ค ๋ชจ๋์ ๋ํด ์ง์ ์ผ๋ก ์ต๊ณ ๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋ฃจ์ ์ผ๋ก ๊ด์ฐฎ์ต๋๋ค.
์กฐ๊ธ๋:
์ฌ์ฉ์ฑ ๊ด์ ์์ ์ค๋ณต ์์๋ ๊ฑฐ์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ฌ์ ํ ํ๋ ์์ํฌ๊ฐ ๋ ๋ชจ๋ธ์ PriorityQueue
๋ํ ๋ํผ๋ก ๋์ค์ ์ ์ด๋ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. (์์๊ฐ ์กด์ฌํ๋ค๋ฉด. ๋ด๊ฐ ์๊ฐํ๋ ๋๋ก!)
ํ์ฌ API ์์ฒด์ ๋ํด ๋ช ๊ฐ์ง ์๊ฐ/์ง๋ฌธ์ ์ ์ํ์ต๋๋ค.
TryPeek(out TElement element, out TPriority priority)
์ค๋ฒ๋ก๋๋ ์ ๊ณตํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?Remove(PriorityQueueNode)
๊ฐ ๋ฐ์ํฉ๋๊น? ๋๋ false๋ฅผ ๋ฐํํฉ๋๊น?TryRemove()
๋ฒ์ ์ด ์์ด์ผ ํฉ๋๊น?Contains()
api๊ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ์ฉํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. 'ํฌํจ'์ ๋ณด๋ ์ฌ๋์ ๋์ ๋ณด์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ ์ฐ์ ์์๊ฐ ๋ค๋ฅธ '์ค๋ณต' ์์๊ฐ ์๋ ์๋๋ฆฌ์ค ๋๋ ๊ธฐํ ๊ณ ์ ํ ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ต๋๋ค! ์ด ๊ฒฝ์ฐ ์ต์ข
์ฌ์ฉ์๋ ์ด์จ๋ ์์ ์ ๊ฒ์์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ ์ค๋ณต์ด ์๋ ์๋๋ฆฌ์ค์์๋ ์ ์ฉํ ์ ์์ต๋๋ค.@pgolebiowski ์๊ฐ์ ๋ด์ด ์ ์ ์์๋ฅผ
Contains()
๋๋ TryGetNode()
์ด ํ์ฌ ์ ์๋ ํ์์ผ๋ก API์ ์กด์ฌํด์ผ ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. TElement
๋ํ ํ๋ฑ์ด ์ค์ํ๋ค๋ ๊ฒ์ ์์ํ๋ฉฐ, ์ด๋ ์๋ง๋ ํธ๋ค ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ด ํผํ๋ ค๊ณ ํ๋ ๊ฒ ์ค ํ๋์ผ ๊ฒ์
๋๋ค.public void Dequeue(out TElement element);
๋ฅผ public TElement Dequeue();
๋ก ๋ฐ๊พธ์ด ๋งํ๊ฒ ์ต๋๋ค.TryDequeue()
๋ฉ์๋๊ฐ ์ฐ์ ์์๋ฅผ ๋ฐํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?ICollection<T>
๋๋ IReadOnlyCollection<T>
๊ตฌํํด์ผ ํ์ง ์์ต๋๊น?๋๋ถ๋ถ์ ์ํํธ์จ์ด ์์ง๋์ด๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ ๊ตฌํ์๋ง ์ต์ํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌํ์ด์ง๋ง ๋ถํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๋ ํจ์จ์ ์ธ ํ ์ ํ์ ๋ ๊ฐ์ง ์๋ 4์ฐจ ํ๊ณผ ํ์ด๋ง ํ์ ๋๋ค.
ํ์์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๊ธฐ ์ํ ์ ์ถฉ์์ ๋ฌด์์ ๋๊น? ์ด๋ ์ด ๊ธฐ๋ฐ ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ต๋๊น?
'์ถ๊ฐ' ๋ฐ '์ ๊ฑฐ' ๋ฑ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์๋ช
์ด ์์ผ๋ฉด ICollection<T>
๋๋ ๊ตฌํํ ์ ์์ต๋๋ค.IReadOnlyCollection<T>
ICollection<KeyValuePair<T,Priority>>
ํจ์ฌ ๋ ๊ฐ๊น์ต๋๋ค.
ICollection<KeyValuePair<T,Priority>>
ํจ์ฌ ๋ ๊ฐ๊น์ต๋๋ค.
KeyValuePair<TPriority, TElement>
๋์ง ์์๊น์? ์์๋ Tpriority์ ์ํด ์ด๋ฃจ์ด์ง๋๋ฐ, ์ด๋ ์ฌ์ค์ ํค์ ๋ฉ์ปค๋์ฆ์
๋๋ค.
์ข์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก Contains
๋ฐ TryGet
๋ฉ์๋๋ฅผ ์ญ์ ํ๋ ๋ฐ ์ฐฌ์ฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ๊ฐ์ ์์ ์ ๊ฑฐํ๊ณ FAQ์์ ์ ๊ฑฐ ์ด์ ๋ฅผ ์ค๋ช
ํฉ๋๋ค.
๊ตฌํ๋ ์ธํฐํ์ด์ค์ ๊ดํด์๋ โ IEnumerable<PriorityQueueNode<TElement, TPriority>>
์ถฉ๋ถํ์ง ์์ต๋๊น? ์ด๋ค ์ข
๋ฅ์ ๊ธฐ๋ฅ์ด ๋น ์ ธ ์์ต๋๊น?
KeyValuePair
- .Element
๋ฐ .Priority
๊ฐ ์๋ ํํ ๋๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ ๋ฐ๋์งํ๋ค๋ ๋ชฉ์๋ฆฌ๊ฐ ๋ช ๊ฐ ์์์ต๋๋ค. ๋๋ ์ด๊ฒ๋ค์ ์ฐฌ์ฑํ๋ค๊ณ ์๊ฐํ๋ค.
KeyValuePair<TPriority, TElement>
๋์ง ์์๊น์? ์์๋ Tpriority์ ์ํด ์ด๋ฃจ์ด์ง๋๋ฐ, ์ด๋ ์ฌ์ค์ ํค์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์์ธก ๋ชจ๋์๊ฒ ์ข์ ์ฃผ์ฅ์ด ์์ต๋๋ค. ํํธ์ผ๋ก๋ ๋ค, ๋ฐฉ๊ธ ๋ง์ํ์ ๊ทธ๋๋ก์ ๋๋ค. ๋ฐ๋ฉด์ KVP ์ปฌ๋ ์ ์ ํค๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ํด์ผ ํ๋ฉฐ ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ์์๋ฅผ ๊ฐ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์ ํจํฉ๋๋ค.
๋ฐ๋ฉด์ KVP ์ปฌ๋ ์ ์ ํค๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ํด์ผ ํฉ๋๋ค.
๋๋ ์ด ๋ง์ ๋์ํ์ง ์์ต๋๋ค. ํค-๊ฐ ์์ ๋ชจ์์ด ๋ฐ๋ก ๊ทธ๊ฒ์ ๋๋ค. ๋ชจ๋ ๊ณ ์ ์ฑ ์๊ตฌ ์ฌํญ์ ๊ทธ ์์ ๊ณ์ธตํ๋ฉ๋๋ค.
IEnumerable<PriorityQueueNode<TElement, TPriority>>
์ถฉ๋ถํ์ง ์์ต๋๊น? ์ด๋ค ์ข ๋ฅ์ ๊ธฐ๋ฅ์ด ๋น ์ ธ ์์ต๋๊น?
์ ๊ณต๋ API๊ฐ ์ด๋ฏธ ๋๋ถ๋ถ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ถฉ์กฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก IReadOnlyCollection<PQN<TElement, TPriority>>
๊ฐ ๊ตฌํ๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ๋ํ ๋ค๋ฅธ ์ปฌ๋ ์
์ ํ๊ณผ๋ ์ผ์นํฉ๋๋ค.
์ธํฐํ์ด์ค ๊ด๋ จ:
```
public bool TryGetNode(TElement ์์, out PriorityQueueNode
What's the point of it if I can just do enumerate collection and do comparison of elements? And why only Try version?
public PriorityQueueNode<TElement, TPriority> Peek(); // O(1)
public void Dequeue(out TElement element); // O(log n)
I find it a bit strange to have discrepancy between Dequeue and Peek. They do pretty much same thing expect one is removing element from queue and other is not, it's looks weird for me if one returns priority and element and other just element.
public void Remove(PriorityQueueNode<TElement, TPriority> node); // O(log n)
`Queue` doesn't have `Remove` method, why `PriorityQueue` should ?
I would also like to see constructor
๊ณต๊ฐ PriorityQueue(IEnumerable
```
๋ํ IReadonlyCollection<>
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด PriorityQueue
๋ฅผ ์ํฉ๋๋ค.
๊ณต๊ฐ API ํ๋ฉด ์ด์ธ์ ๋ค๋ฅธ ํญ๋ชฉ์ผ๋ก ์ด๋ํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค์ด Dijkstra์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ณํํ๋ ์ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค. Java์๋ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 32,000๋ฒ ์ด์ ์กฐํ๋ 3๊ฐ์ StackOverflow ์ง๋ฌธ์์ ์์ง๋์ด์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. example, example, example. ์ด๋ฌํ ์ ํ๋ ๊ฐ์น์ API ๋์ ์ ํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ๋ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ ๋์ํ์ง ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก C++์์ Dijkstra๋ฅผ ์์ฑํ์ ๋ std::priority_queue๋ก ์ถฉ๋ถํ์ผ๋ฉฐ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ AFAIK ๊ณตํต ํฉ์ ๋ ์ฐ์ ์์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๊ธฐ์ด์ ๊ฐ์ง ์์๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ์ ์ฒ๋ฆฌํ๋์ง ์ฌ๋ถ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ๋๋ค. ์์ ์ค์ผ์ค๋ฌ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์์งํ ๋งํด์ ํ์ฌ ๋๊ธฐ์ด ์ ์์์ Dijkstra๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ฐ์ดํธ ์ฐ์ ์์๊ฐ ํ์ํ ๋ ธ๋๋ฅผ ์ถ์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? TryGetNode()๋ก? ์๋๋ฉด ๋ค๋ฅธ ๋ ธ๋ ๋ชจ์์ด ์์ต๋๊น? ํ์ฌ ์ ์์ ๋ํ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
Wikipedia๋ฅผ ์ดํด๋ณด๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ์ ๋ํ ๊ฐ์ ์ด ์์ต๋๋ค. ํด๋น ๊ธฐ๋ฅ์ด ์๊ณ ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋๋ "๋ ๋์ ๊ฒ์ ์ํด ๋ ธ๋ ฅํ๋ค"๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ค์ ๋ก ๊ทธ๊ฒ์ ๋ํ ์์๊ฐ ์์ต๋๊น?
์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๋ ํจ์จ์ ์ธ ํ ์ ํ์ ๋ ๊ฐ์ง ์๋ 4์ฐจ ํ๊ณผ ํ์ด๋ง ํ์ ๋๋ค. ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ Wikipedia ๋ฐ ์ด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋๋ ์ข ์ด๋ฅผ ์กฐ์ฌํ๊ณ ์ด๊ฒ์ ์ธ์ฉ๋ฌธ์ ๋๋ค.
๊ฒฐ๊ณผ๋ ๊ตฌํ์ ์ต์ ์ ํ์ด ์ ๋ ฅ์ ํฌ๊ฒ ์์กดํจ์ ๋ณด์ฌ์ค๋๋ค. ๋ํ ์ฃผ๋ก L1-L2 ์ฅ๋ฒฝ์์ ์บ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํจ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋ณต์กํ ์บ์ ์ธ์ ๊ตฌ์กฐ๊ฐ ๋ ๊ฐ๋จํ ์บ์ ์ธ์ ๊ตฌ์กฐ์ ๋นํด ์ ์ํ๋์ง ์์ ์ ์์์ ์์ฌํฉ๋๋ค.
ํ์ฌ ๋๊ธฐ์ด ์ ์์ ๋ฐฐ์ด์ด ์๋ ํธ๋ฆฌ ๊ตฌํ ๋ค์ ์ ๊ฒจ ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ๋ณ์ ํฉ์ด์ ธ ์๋ ํธ๋ฆฌ ๋ ธ๋๊ฐ ์์ ๋ฐฐ์ด๋งํผ ์ฑ๋ฅ์ด ์ข์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋๋ ๋ฐฐ์ด์ ๋ฐ๋ผ ๊ฐ๋จํ ์ด์ง ํ์ ๋น๊ตํ๋ ๋ฒค์น ๋งํฌ๋ฅผ ๊ฐ์ง๊ณ ์ ํ, ์ ์ ํ ๊ฒฐ์ ์ ๋ด๋ฆด ๊ทธ ์ ์, ๋๋ ๊ทธ๊ฒ์ด (๋ด๊ฐ ๋น์ ์ ์ฐพ๊ณ ์์ด์ ํน์ ๊ตฌํ ๋ค์ ์ ๊ธ ๋์์ธ์ ์ค๋งํธ ์๊ฐํ์ง ์์ต๋๋ค ์ด์์ ์ผ ๊ฒ์ด๋ค ํ์ด๋ง ์๊ฐ Merge
๋ฉ์๋).
๋ค๋ฅธ ์ฃผ์ ๋ก ๋์ด๊ฐ๋ฉด ๊ฐ์ธ์ ์ผ๋ก KeyValuePair๋ฅผ ์ ํธํฉ๋๋ค.
๋จ์ ์ TPriority Key
์ ๋ํด ๋ง๊ฐ์ด ๊ต์ฐจํ์ง๋ง ์ข์ ๋ฌธ์๋ก ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
`
Dijkstra์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋๊ธฐ์ด์ ๊ฐ์ง ์์๋ฅผ ์ถ๊ฐํ๋ฉด ์๋ํ๋ฉฐ ์ฒ๋ฆฌํ๋ ๊ทธ๋ํ ๊ฐ์ฅ์๋ฆฌ์ ์ด ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒ๋ฆฌ ์์ง์์ ์์ฑ๋ ํ์ ์์ฃผํ๋ ์์ ๋ ธ๋์ ์๋ ๋ณ๊ฒฝ๋๋ฉฐ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๋๊ธฐ์ด์ ๋ฃ๊ธฐ ๋ฐ ๋๊ธฐ์ด์์ ๋นผ๋ ํจ์จ์ฑ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
IReadOnlyCollection์ ์ํํ ์ ์๋ ๊ฒ์ ๋ํด ํ๋ ธ์ต๋๋ค. ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ํด๋น ์ธํฐํ์ด์ค์๋ Add() ๋ฐ Remove()๊ฐ ์์ต๋๋ค. (๋ด๊ฐ ๋ฌด์จ ์๊ฐ์ ํ๊ณ ์์๋์ง...)
@Ivanidzo4ka ๊ทํ์ ์๊ฒฌ์ ๋ ๊ฐ์ง ๊ฐ๋ณ ์ ํ์ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ ๊ฒ์ ๋์ฑ ํ์ ์ํต๋๋ค. ํ๋๋ ๋จ์ํ ๋ฐ์ด๋๋ฆฌ ํ(์ฆ, ์ ๋ฐ์ดํธ ์์)์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ ์ ์ค ํ๋์ ์ค๋ช ๋ ๋๋ก์ ๋๋ค.
๊ณผ๊ฑฐ์๋ 10๋
์ ๊ฐ์ฅ ์ข์ ๋ถ๋ถ์ ์์ฑํ ๋ฐ์ด๋๋ฆฌ ํ๊ณผ SortedSet
/ Dictionary
์กฐํฉ์ ๋๋ถ๋ถ ์ฌ์ฉํ์ง ์๊ณ ์ฌ์ฉํ๋ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ ๊ฐ์ง ์ ํ์ด ์๋ก ๋ค๋ฅธ ์ญํ ์ ํฉ๋๋ค(KSSP๊ฐ ๋ ์ค๋ฆ).
ํด๋์ค๊ฐ ์๋ ๊ตฌ์กฐ์ฒด์ด๋ฏ๋ก NullReference ์์ธ๊ฐ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ฐ๋๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ ์ ๋ฌํ๊ณ ์๋ค๋ฉด NRE๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฌํ ๊ฒ๋ค์ด ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ์์ํ๋ ๊ณณ์ ๋ช ํํ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ธ๋/ํธ๋ค์ ์๋ง๋ ํด๋์ค์ฌ์ผ ํ์ง๋ง, ๋จ์ง ํ ์์ ์ฝ๊ณ /๋ฐํํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ตฌ์กฐ์ฒด์ฌ์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
ํธ๋ค ๊ธฐ๋ฐ ์ ์์์ ์์์ ์ฐ์ ์์๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ด์ผ ํ๋ค๊ณ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ํธ๋ค์ ์ ๊ฑฐํ๊ณ ์ ํธ๋ค์ ์ถ๊ฐํ๋ฉด ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ง๋ง ์ ์ฉํ ์์ ์ด๋ฉฐ ๊ตฌํ์ ๋ฐ๋ผ ์ฑ๋ฅ์์ ์ด์ ์ด ์์ ์ ์์ต๋๋ค(์: ์ผ๋ถ ํ์ ์๋์ ์ผ๋ก ์ ๋ ดํ๊ฒ ๋ฌด์ธ๊ฐ์ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ ์ ์์). ์ด๋ฌํ ๋ณํ๋ (์๋ฅผ ๋ค์ด,์ด ์ ๋ ๋ง์ ๊ฒ์ ๊ตฌํํ ์ ๊ฒ ์ด ๊ธฐ์กด AlgoKit ParingHeap์ ๋ฐ๋ผ ๋ค์ ์ ๋ชฝ ์ ๋ ์) ์ํ ๊ณต๊ฐ์ ์ ์์๋ ์ง์ญ์์ ์ ํ์ด ํนํ์ ๋๋ค.
.NET Core ์ปค๋ฎค๋ํฐ๋ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ _priority queue_ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ ์์์ ์ถ๊ฐ๋ก ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ํนํ System.Collections.Generic
๋ค์์คํ์ด์ค์ PriorityQueue<TElement, TPriority>
๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ค๊ณ์์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์น์ ๋ฐ๋ผ ์งํ๋์์ต๋๋ค(๋ ๋์ ์์น์ ์๊ณ ์์ง ์๋ ํ).
๊ฐ๋ ์ ์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ ์์์ ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ์์ ๋ชจ์์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ ์ปฌ๋ ์ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์์์ ๋ํ ํจ์จ์ ์ธ ์ก์ธ์ค์ ํด๋น ์์๋ฅผ ์ ๊ฑฐํ๋ ์ต์ ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์๋๋ ๋์์๋ ๋ค์์ด ํฌํจ๋ ์๋ ์์ต๋๋ค. 1) ์ด๋ฏธ ์ปฌ๋ ์ ์ ์๋ ์์์ ์ฐ์ ์์๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ; 2) ์ฌ๋ฌ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ณํฉํ๋ ๊ธฐ๋ฅ.
์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ฆ, ์ด์ ์น์ ์์ ์ค๋ช ํ ๋๋ก ํน์ ๋์ ํน์ฑ์ ๊ฐ์ง ๊ฐ๋ ์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ ์คํด์ ๋ฌ๋ฆฌ ํ(heap)๋ ์ถ์์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ๋ค๋ฆ ๋๋ค.
๋๋ถ๋ถ์ ์ํํธ์จ์ด ์์ง๋์ด๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ ๊ตฌํ์๋ง ์ต์ํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌํ์ด์ง๋ง ๋ถํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๋ ํจ์จ์ ์ธ ํ ์ ํ์ ๋ ๊ฐ์ง ์๋ 4์ฐจ ํ ๋ฐ ํ์ด๋ง ํ ์ ๋๋ค. ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ Wikipedia ๋ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฐ๋ฆฌ์ ๋ ผ์๋ ์ค๊ณ์์ ๊ฐ์ฅ ๋์ ์ ์ธ ์์ญ์ด์ ๋์์ API์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ญ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ํนํ ๋ฌธ์ ๋ ๊ณ ๊ฐ์๊ฒ ์ ๊ณตํ๋ ค๋ ์ ํ์ด ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค์ด Dijkstra์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ณํํ๋ ์ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค. Java์๋ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ ๋ฅผ ๋ค์ด 32,000๋ฒ ์ด์ ์กฐํ๋ ์ธ ๊ฐ์ง StackOverflow ์ง๋ฌธ์ธ example , example , example ์์ ์์ง๋์ด์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ ๊ฐ์น์ API ๋์ ์ ํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ๋ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ค๋ฉด ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธํ๋ ค๋ ํญ๋ชฉ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ๋ฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ธํ์ต๋๋ค. b) ์ปฌ๋ ์ ์ ์๋ ์์์ ๊ณ ์ ์ฑ ์ ์ฉ์ ํตํด. ์ด๋ค ๊ฐ๊ฐ์ ๋ค๋ฅธ ์ด์ ๊ณผ ๋น์ฉ์ ์๋ฐํฉ๋๋ค.
์ต์ (a): ํธ๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์์๊ฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ณ ์ ํ ํธ๋ค์ ์ ๊ณตํฉ๋๋ค. ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋์ค์ ์ ๋ฐ์ดํธํ๋ ค๋ ์์๋ฅผ ๋ช ํํ๊ฒ ์ง์ ํ ์ ์๋๋ก ์ด๋ฌํ ํธ๋ค์ ์ถ์ ํด์ผ ํฉ๋๋ค. ์ด ์๋ฃจ์ ์ ์ฃผ์ ๋น์ฉ์ ๊ณ ๊ฐ์ด ์ด๋ฌํ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์์ ํธ๋ค์ ์ง์ํ๊ธฐ ์ํด ๋ด๋ถ ํ ๋น์ด ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ฐฐ์ด ๊ธฐ๋ฐ์ด ์๋ ๋ชจ๋ ํ์ ๊ฐ ๋ ธ๋๊ฐ ์๋์ผ๋ก ์์ฒด ํธ๋ค์ด ๋๋ ๋ ธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด PairingHeap.Update ๋ฉ์๋์ API๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ต์ (b): ๊ณ ์ ์ฑ. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๊ฐ์๊ฒ ๋ ๊ฐ์ง ์ถ๊ฐ ์ ์ฝ์ ๊ฐํฉ๋๋ค. i) ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์ ์์๋ ์๋ก์ด ํด๋์ค์ ์ ์ฌ์ ์ฌ์ฉ์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ํน์ ํ๋ฑ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ii) ๋ ๊ฐ์ ๋์ผํ ์์๋ ๋์ผํ ๋๊ธฐ์ด์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ๋น์ฉ์ ์ง๋ถํจ์ผ๋ก์จ ํธ๋ค ์ ๊ทผ ๋ฐฉ์์ ์์กดํ์ง ์๊ณ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ ์ด์ ์ ์ป์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ์ ์ฑ/๋๋ฑ์ฑ์ ํ์ฉํ์ฌ ์ ๋ฐ์ดํธํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋ชจ๋ ๊ตฌํ์๋ ์ถ๊ฐ ๋ด๋ถ ๋งคํ์ด ํ์ํ๋ฏ๋ก O(n)์ด ์๋ O(1)์์ ์ํ๋ฉ๋๋ค.
ํธ๋ค์ ํตํด ์
๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ PriorityQueue<TElement, TPriority>
ํด๋์ค๋ฅผ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธฐ๋ณธ ๊ตฌํ ์ ํ์ด๋ง ํ์
๋๋ค.
public class PriorityQueueNode<TElement, TPriority>
{
public TElement Element { get; }
public TPriority Priority { get; }
}
public class PriorityQueue<TElement, TPriority> :
IEnumerable<PriorityQueueNode<TElement, TPriority>>,
IReadOnlyCollection<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueue();
public PriorityQueue(IComparer<TPriority> comparer);
public IComparer<TPriority> Comparer { get; }
public int Count { get; }
public bool IsEmpty { get; }
public void Clear();
public PriorityQueueNode<TElement, TPriority> Enqueue(TElement element, TPriority priority); //O(log n)
public PriorityQueueNode<TElement, TPriority> Peek(); // O(1)
public bool TryPeek(out PriorityQueueNode<TElement, TPriority> node); // O(1)
public bool TryPeek(out TElement element, out TPriority priority); // O(1)
public bool TryPeek(out TElement element); // O(1)
public PriorityQueueNode<TElement, TPriority> Dequeue(); // O(log n)
public void Dequeue(out TElement element, out TPriority priority); // O(log n)
public bool TryDequeue(out PriorityQueueNode<TElement, TPriority> node); // O(log n)
public bool TryDequeue(out TElement element, out TPriority priority); // O(log n)
public bool TryDequeue(out TElement element); // O(log n)
public void Update(PriorityQueueNode<TElement, TPriority> node, TPriority priority); // O(log n)
public void Remove(PriorityQueueNode<TElement, TPriority> node); // O(log n)
public void Merge(PriorityQueue<TElement, TPriority> other) // O(1)
public IEnumerator<PriorityQueueNode<TElement, TPriority>> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
public struct Enumerator : IEnumerator<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueueNode<TElement, TPriority> Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext() => throw new NotImplementedException();
public void Reset() => throw new NotImplementedException();
public void Dispose() => throw new NotImplementedException();
}
}
var queue = new PriorityQueue<Job, double>();
queue.Enqueue(firstJob, 10);
queue.Enqueue(secondJob, 5);
queue.Enqueue(thirdJob, 40);
var withHighestPriority = queue.Peek(); // { element: secondJob, priority: 5 }
var queue = new PriorityQueue<Job, double>();
var mapping = new Dictionary<Job, PriorityQueueNode<Job, double>>();
mapping[job] = queue.Enqueue(job, priority);
queue.Update(mapping[job], newPriority);
HashSet
์ ์ ์ฌํ๊ฒ O(n) ์์ ์ด๊ฑฐ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ์ ์๋์ง ์์ ์์๋ก. ํจ์จ์ ์ธ ๊ตฌํ์ ์์๊ฐ ์์๋๋ก ์ด๊ฑฐ๋๋๋ก ๋ณด์ฅํ๋ฉด์ ์ ํ ์๊ฐ์ ํ์ ์ด๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ O(n log n)์ด ํ์ํฉ๋๋ค. ์ปฌ๋ ์
์ ๋ํ ์ฃผ๋ฌธ์ .OrderBy(x => x.Priority)
๋ก ๊ฐ๋จํ๊ฒ ๋ฌ์ฑํ ์ ์๊ณ ๋ชจ๋ ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์ผ๋ก ์ด๊ฑฐ์ ๊ด์ฌ์ด ์๋ ๊ฒ์ ์๋๋ฏ๋ก ์ ์๋์ง ์์ ์ด๊ฑฐ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Contains
๋๋ TryGet
๋ฉ์๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?ํ์ ์์๋ฅผ ์ฐพ๋ ๊ฒ์ ์ด๋ค ๊ฒ์ ์๋ฏธ, ์ ์ฒด ์ปฌ๋ ์
์ ์ด๊ฑฐ๋ฅผ ํ์๋กํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์, ๋ฌด์ํ ๊ฐ์ ๊ฐ์ง๊ณ Contains
๋๋ TryGet
๋ฐฉ๋ฒ์ด ์ด๊ฑฐ ๋ํผ๊ฐ ๋ ๊ฒ์
๋๋ค. ๋ํ ์ปฌ๋ ์
์ ์์๊ฐ ์๋์ง ํ์ธํ๋ ค๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด์์ TElement
๊ฐ์ฒด์ ๋๋ฑ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฑ
์์ ์ํ์ง ์์์ผ ํฉ๋๋ค.
PriorityQueueNode
๋ฅผ ๋ฐํํ๋ Dequeue
๋ฐ TryDequeue
์ค๋ฒ๋ก๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?์ด๊ฒ์ Update
๋๋ Remove
๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ํธ๋ค์ ์ถ์ ํ๋ ค๋ ๊ณ ๊ฐ์ ์ํ ๊ฒ์
๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์์๋ฅผ ๋๊ธฐ์ด์์ ๋นผ๋ ๋์ ํธ๋ค ์ถ์ ์์คํ
์ ์ํ๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํธ๋ค์ ๋ฐ์ต๋๋ค.
Update
๋๋ Remove
๋ฉ์๋๊ฐ ๋ค๋ฅธ ํ์์ ๋
ธ๋๋ฅผ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?์ฐ์ ์์ ํ์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. LinkedListNode<T>
๊ฐ ์์ ์ด ์ํ LinkedList<T>
์ธ์ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ ๋
ธ๋๋ ์์ ์ด ์ํ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ธ์ํฉ๋๋ค.
| ์ธ์ด | ์ ํ | ๋ฉ๋ชจ |
|:-:|:-:|:-:|
| ์๋ฐ | ์ฐ์ ์์ ํAbstractQueue
ํ์ฅํ๊ณ ์ธํฐํ์ด์ค Queue
๊ตฌํํฉ๋๋ค. |
| ๋
น | ๋ฐ์ด๋๋ฆฌํ | |
| ์ค์ํํธ | CFBinaryํ | |
| C++ | ์ฐ์ ์์ ๋๊ธฐ์ด | |
| ํ์ด์ฌ | ํQ | |
| ์ด๋ | ํ | ํ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. |
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ ผ์ํ ๋ _heap_์ด๋ผ๋ ์ฉ์ด๋ _priority queue_๋ณด๋ค 4๋ฐฐ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
"array" AND "data structure"
โ 17.400.000 ๊ฒฐ๊ณผ"stack" AND "data structure"
โ 12.100.000 ๊ฒฐ๊ณผ"queue" AND "data structure"
โ 3.850.000 ๊ฒฐ๊ณผ"heap" AND "data structure"
โ 1.830.000 ๊ฒฐ๊ณผ"priority queue" AND "data structure"
โ 430.000๊ฐ์ ๊ฒฐ๊ณผ"trie" AND "data structure"
โ 335.000๊ฐ์ ๊ฒฐ๊ณผํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ ์์ v2.1๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ณ๊ฒฝ ๋ก๊ทธ:
Contains
๋ฐ TryGet
๋ฉ์๋๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.Contains
๋๋ TryGet
๋ฐฉ๋ฒ์ด ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?_IReadOnlyCollection<PriorityQueueNode<TElement, TPriority>>
์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.bool TryPeek(out TElement element, out TPriority priority)
์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.bool TryPeek(out TElement element)
์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.void Dequeue(out TElement element, out TPriority priority)
์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.void Dequeue(out TElement element)
์ PriorityQueueNode<TElement, TPriority> Dequeue()
.bool TryDequeue(out TElement element)
์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.bool TryDequeue(out PriorityQueueNode<TElement, TPriority> node)
์ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.PriorityQueueNode
๋ฅผ ๋ฐํํ๋ Dequeue
๋ฐ TryDequeue
์ค๋ฒ๋ก๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?_Update
๋๋ Remove
๋ฉ์๋๊ฐ ๋ค๋ฅธ ๋๊ธฐ์ด์์ ๋
ธ๋๋ฅผ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?_๋ณ๊ฒฝ ์ฌํญ์ ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ;)
์ค๋ช ์ ์ํ ์์ ์์ฒญ:
@pgolebiowski ์ ์๋ Merge
๋ฐฉ๋ฒ์ ๋ํด:
public void Merge(PriorityQueue<TElement, TPriority> other); // O(1)
๋ถ๋ช
ํ ๊ทธ๋ฌํ ์์
์๋ ๋ณต์ฌ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ผ๋ฏ๋ก this
๋ฐ other
_after_ ๋ณํฉ์ด ์ํ๋ ํ ๋ณ๊ฒฝํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค(์: ๋ ์ธ์คํด์ค ๋ชจ๋ ์คํจ ํ ์์ฑ์ ๋ง์กฑ์ํค๊ธฐ ์ํด).
@eiriktsarpalis @VisualMelon โ ๊ฐ์ฌํฉ๋๋ค! ์ ๊ธฐ๋ ์ฌํญ, ETA 2020-10-04๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ ๋ง์ ํผ๋๋ฐฑ/์ง๋ฌธ/๊ฑฑ์ /์๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๊ณต์ ํด ์ฃผ์ธ์ ๐
.NET Core ์ปค๋ฎค๋ํฐ๋ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ _priority queue_ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ ์์์ ์ถ๊ฐ๋ก ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ํนํ System.Collections.Generic
๋ค์์คํ์ด์ค์ PriorityQueue<TElement, TPriority>
๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ค๊ณ์์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์น์ ๋ฐ๋ผ ์งํ๋์์ต๋๋ค(๋ ๋์ ์์น์ ์๊ณ ์์ง ์๋ ํ).
๊ฐ๋ ์ ์ผ๋ก ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ ์์์ ์ฐ๊ฒฐ๋ ์ฐ์ ์์๊ฐ ์๋ ์์ ๋ชจ์์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ ์ปฌ๋ ์ ์์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์์์ ๋ํ ํจ์จ์ ์ธ ์ก์ธ์ค์ ํด๋น ์์๋ฅผ ์ ๊ฑฐํ๋ ์ต์ ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์๋๋ ๋์์๋ ๋ค์์ด ํฌํจ๋ ์๋ ์์ต๋๋ค. 1) ์ด๋ฏธ ์ปฌ๋ ์ ์ ์๋ ์์์ ์ฐ์ ์์๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ; 2) ์ฌ๋ฌ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ณํฉํ๋ ๊ธฐ๋ฅ.
์ฐ์ ์์ ๋๊ธฐ์ด์ ์ถ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ฆ, ์ด์ ์น์ ์์ ์ค๋ช ํ ๋๋ก ํน์ ๋์ ํน์ฑ์ ๊ฐ์ง ๊ฐ๋ ์ ๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ ์คํด์ ๋ฌ๋ฆฌ ํ(heap)๋ ์ถ์์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ๋ค๋ฆ ๋๋ค.
๋๋ถ๋ถ์ ์ํํธ์จ์ด ์์ง๋์ด๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ ๊ตฌํ์๋ง ์ต์ํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌํ์ด์ง๋ง ๋ถํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ตฌํ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๊ฒฝ์ฐ ๋ ํจ์จ์ ์ธ ํ ์ ํ์ ๋ ๊ฐ์ง ์๋ 4์ฐจ ํ ๋ฐ ํ์ด๋ง ํ ์ ๋๋ค. ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ Wikipedia ๋ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฐ๋ฆฌ์ ๋ ผ์๋ ์ค๊ณ์์ ๊ฐ์ฅ ๋์ ์ ์ธ ์์ญ์ด์ ๋์์ API์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ญ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ํนํ ๋ฌธ์ ๋ ๊ณ ๊ฐ์๊ฒ ์ ๊ณตํ๋ ค๋ ์ ํ์ด ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค์ด Dijkstra์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ณํํ๋ ์ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค. Java์๋ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ ๋ฅผ ๋ค์ด 32,000๋ฒ ์ด์ ์กฐํ๋ ์ธ ๊ฐ์ง StackOverflow ์ง๋ฌธ์ธ example , example , example ์์ ์์ง๋์ด์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ ๊ฐ์น์ API ๋์ ์ ํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ์ปฌ๋ ์ ์ ์ด๋ฏธ ์๋ ์์์ ๋ํ ์ฐ์ ์์ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ค๋ฉด ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธํ๋ ค๋ ํญ๋ชฉ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ๋ฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ธํ์ต๋๋ค. b) ์ปฌ๋ ์ ์ ์๋ ์์์ ๊ณ ์ ์ฑ ์ ์ฉ์ ํตํด. ์ด๋ค ๊ฐ๊ฐ์ ๋ค๋ฅธ ์ด์ ๊ณผ ๋น์ฉ์ ์๋ฐํฉ๋๋ค.
์ต์ (a): ํธ๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์์๊ฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ณ ์ ํ ํธ๋ค์ ์ ๊ณตํฉ๋๋ค. ๊ณ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋์ค์ ์ ๋ฐ์ดํธํ๋ ค๋ ์์๋ฅผ ๋ช ํํ๊ฒ ์ง์ ํ ์ ์๋๋ก ์ด๋ฌํ ํธ๋ค์ ์ถ์ ํด์ผ ํฉ๋๋ค. ์ด ์๋ฃจ์ ์ ์ฃผ์ ๋น์ฉ์ ๊ณ ๊ฐ์ด ์ด๋ฌํ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์์ ํธ๋ค์ ์ง์ํ๊ธฐ ์ํด ๋ด๋ถ ํ ๋น์ด ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ฐฐ์ด ๊ธฐ๋ฐ์ด ์๋ ๋ชจ๋ ํ์ ๊ฐ ๋ ธ๋๊ฐ ์๋์ผ๋ก ์์ฒด ํธ๋ค์ด ๋๋ ๋ ธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด PairingHeap.Update ๋ฉ์๋์ API๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ต์ (b): ๊ณ ์ ์ฑ. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๊ฐ์๊ฒ ๋ ๊ฐ์ง ์ถ๊ฐ ์ ์ฝ์ ๊ฐํฉ๋๋ค. i) ์ฐ์ ์์ ๋๊ธฐ์ด ๋ด์ ์์๋ ์๋ก์ด ํด๋์ค์ ์ ์ฌ์ ์ฌ์ฉ์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ํน์ ํ๋ฑ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ii) ๋ ๊ฐ์ ๋์ผํ ์์๋ ๋์ผํ ๋๊ธฐ์ด์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ๋น์ฉ์ ์ง๋ถํจ์ผ๋ก์จ ํธ๋ค ์ ๊ทผ ๋ฐฉ์์ ์์กดํ์ง ์๊ณ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ ์ด์ ์ ์ป์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ์ ์ฑ/๋๋ฑ์ฑ์ ํ์ฉํ์ฌ ์ ๋ฐ์ดํธํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋ชจ๋ ๊ตฌํ์๋ ์ถ๊ฐ ๋ด๋ถ ๋งคํ์ด ํ์ํ๋ฏ๋ก O(n)์ด ์๋ O(1)์์ ์ํ๋ฉ๋๋ค.
ํธ๋ค์ ํตํด ์
๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ์ง์ํ๋ PriorityQueue<TElement, TPriority>
ํด๋์ค๋ฅผ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธฐ๋ณธ ๊ตฌํ ์ ํ์ด๋ง ํ์
๋๋ค.
public class PriorityQueueNode<TElement, TPriority>
{
public TElement Element { get; }
public TPriority Priority { get; }
}
public class PriorityQueue<TElement, TPriority> :
IEnumerable<PriorityQueueNode<TElement, TPriority>>,
IReadOnlyCollection<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueue();
public PriorityQueue(IComparer<TPriority> comparer);
public IComparer<TPriority> Comparer { get; }
public int Count { get; }
public bool IsEmpty { get; }
public void Clear();
public PriorityQueueNode<TElement, TPriority> Enqueue(TElement element, TPriority priority); //O(log n)
public PriorityQueueNode<TElement, TPriority> Peek(); // O(1)
public bool TryPeek(out PriorityQueueNode<TElement, TPriority> node); // O(1)
public bool TryPeek(out TElement element, out TPriority priority); // O(1)
public bool TryPeek(out TElement element); // O(1)
public PriorityQueueNode<TElement, TPriority> Dequeue(); // O(log n)
public void Dequeue(out TElement element, out TPriority priority); // O(log n)
public bool TryDequeue(out PriorityQueueNode<TElement, TPriority> node); // O(log n)
public bool TryDequeue(out TElement element, out TPriority priority); // O(log n)
public bool TryDequeue(out TElement element); // O(log n)
public void Update(PriorityQueueNode<TElement, TPriority> node, TPriority priority); // O(log n)
public void Remove(PriorityQueueNode<TElement, TPriority> node); // O(log n)
public IEnumerator<PriorityQueueNode<TElement, TPriority>> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator();
public struct Enumerator : IEnumerator<PriorityQueueNode<TElement, TPriority>>
{
public PriorityQueueNode<TElement, TPriority> Current { get; }
object IEnumerator.Current { get; }
public bool MoveNext() => throw new NotImplementedException();
public void Reset() => throw new NotImplementedException();
public void Dispose() => throw new NotImplementedException();
}
}
var queue = new PriorityQueue<Job, double>();
queue.Enqueue(firstJob, 10);
queue.Enqueue(secondJob, 5);
queue.Enqueue(thirdJob, 40);
var withHighestPriority = queue.Peek(); // { element: secondJob, priority: 5 }
var queue = new PriorityQueue<Job, double>();
var mapping = new Dictionary<Job, PriorityQueueNode<Job, double>>();
mapping[job] = queue.Enqueue(job, priority);
queue.Update(mapping[job], newPriority);
HashSet
์ ์ ์ฌํ๊ฒ O(n) ์์ ์ด๊ฑฐ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ์ ์๋์ง ์์ ์์๋ก. ํจ์จ์ ์ธ ๊ตฌํ์ ์์๊ฐ ์์๋๋ก ์ด๊ฑฐ๋๋๋ก ๋ณด์ฅํ๋ฉด์ ์ ํ ์๊ฐ์ ํ์ ์ด๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ O(n log n)์ด ํ์ํฉ๋๋ค. ์ปฌ๋ ์
์ ๋ํ ์ฃผ๋ฌธ์ .OrderBy(x => x.Priority)
๋ก ๊ฐ๋จํ๊ฒ ๋ฌ์ฑํ ์ ์๊ณ ๋ชจ๋ ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์ผ๋ก ์ด๊ฑฐ์ ๊ด์ฌ์ด ์๋ ๊ฒ์ ์๋๋ฏ๋ก ์ ์๋์ง ์์ ์ด๊ฑฐ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Contains
๋๋ TryGet
๋ฉ์๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?ํ์ ์์๋ฅผ ์ฐพ๋ ๊ฒ์ ์ด๋ค ๊ฒ์ ์๋ฏธ, ์ ์ฒด ์ปฌ๋ ์
์ ์ด๊ฑฐ๋ฅผ ํ์๋กํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์, ๋ฌด์ํ ๊ฐ์ ๊ฐ์ง๊ณ Contains
๋๋ TryGet
๋ฐฉ๋ฒ์ด ์ด๊ฑฐ ๋ํผ๊ฐ ๋ ๊ฒ์
๋๋ค. ๋ํ ์ปฌ๋ ์
์ ์์๊ฐ ์๋์ง ํ์ธํ๋ ค๋ฉด ์ฐ์ ์์ ๋๊ธฐ์ด์์ TElement
๊ฐ์ฒด์ ๋๋ฑ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฑ
์์ ์ํ์ง ์์์ผ ํฉ๋๋ค.
PriorityQueueNode
๋ฅผ ๋ฐํํ๋ Dequeue
๋ฐ TryDequeue
์ค๋ฒ๋ก๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?์ด๊ฒ์ Update
๋๋ Remove
๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ํธ๋ค์ ์ถ์ ํ๋ ค๋ ๊ณ ๊ฐ์ ์ํ ๊ฒ์
๋๋ค. ์ฐ์ ์์ ๋๊ธฐ์ด์์ ์์๋ฅผ ๋๊ธฐ์ด์์ ๋นผ๋ ๋์ ํธ๋ค ์ถ์ ์์คํ
์ ์ํ๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํธ๋ค์ ๋ฐ์ต๋๋ค.
Update
๋๋ Remove
๋ฉ์๋๊ฐ ๋ค๋ฅธ ํ์์ ๋
ธ๋๋ฅผ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?์ฐ์ ์์ ํ์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. LinkedListNode<T>
๊ฐ ์์ ์ด ์ํ LinkedList<T>
์ธ์ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ ๋
ธ๋๋ ์์ ์ด ์ํ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ธ์ํฉ๋๋ค. ๋ํ ๋
ธ๋๊ฐ ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ ํด๋น ๋
ธ๋์์ Update
๋๋ Remove
๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
Merge
๋ฉ์๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?๋ ๊ฐ์ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ณํฉํ๋ ๊ฒ์ ์ผ์ ํ ์๊ฐ์ ๋ฌ์ฑํ ์ ์์ผ๋ฏ๋ก ๊ณ ๊ฐ์๊ฒ ์ ๊ณตํ๋ ๋งค๋ ฅ์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ๋ํ ์์๊ฐ ์์์ ์ ์ฆํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉฐ ์ด๋ฅผ ๊ณต๊ฐ API์ ํฌํจํ๋ ๊ฒ์ ์ ๋นํํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ค๊ณ๋ ์ฌ์ํ์ง ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ ์ ์์ผ๋ฏ๋ก API ํ๋ฉด ๋ฐ ๊ตฌํ์ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ํ์ฌ Merge
๋ฉ์๋๋ฅผ ํฌํจํ์ง ์๋ ๊ฒ์ ์๋ฐฉํฅ ๋์ด์
๋๋ค. ํฅํ ๊ณ ๊ฐ์ด ๋ณํฉ ๊ธฐ๋ฅ ์ง์์ ๊ด์ฌ์ ํ๋ช
ํ๋ฉด PriorityQueue
์ ํ์ ํ์ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ง Merge
๋ฉ์๋๋ฅผ ํฌํจํ์ง ์๊ณ ์ถ์๋ฅผ ์งํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ปฌ๋ ์
์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฆ, ๋ ์์๊ฐ ๋์ผํ ์ฐ์ ์์๋ก ๋๊ธฐ์ด์ ์๋ ๊ฒฝ์ฐ ๊ณ ๊ฐ์ ํน์ ์์๋ก ๋๊ธฐ์ด์์ ์ ๊ฑฐ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ๊ฐ์ด PriorityQueue
์ฌ์ฉํ์ฌ ์์ ์ฑ์ ์ป์ผ๋ ค๋ฉด TPriority
๋ฐ ์ด๋ฅผ ๋ณด์ฅํ๋ ํด๋น IComparer<TPriority>
๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ ์์ง์ ๊ฒฐ์ ์ ์
๋๋ค. ์ฆ, ์ฃผ์ด์ง ์์
์ํ์ค์ ๋ํด ํญ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ์ฌ ์ฌํ์ฑ์ ํ์ฉํฉ๋๋ค.
| ์ธ์ด | ์ ํ | ๋ฉ๋ชจ |
|:-:|:-:|:-:|
| ์๋ฐ | ์ฐ์ ์์ ํAbstractQueue
ํ์ฅํ๊ณ Queue
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. |
| ๋
น | ๋ฐ์ด๋๋ฆฌํ | |
| ์ค์ํํธ | CFBinaryํ | |
| C++ | ์ฐ์ ์์ ๋๊ธฐ์ด | |
| ํ์ด์ฌ | ํQ | |
| ์ด๋ | ํ | ํ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. |
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ ผ์ํ ๋ _heap_์ด๋ผ๋ ์ฉ์ด๋ _priority queue_๋ณด๋ค 4๋ฐฐ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
"array" AND "data structure"
โ 17.400.000 ๊ฒฐ๊ณผ"stack" AND "data structure"
โ 12.100.000 ๊ฒฐ๊ณผ"queue" AND "data structure"
โ 3.850.000 ๊ฒฐ๊ณผ"heap" AND "data structure"
โ 1.830.000 ๊ฒฐ๊ณผ"priority queue" AND "data structure"
โ 430.000๊ฐ์ ๊ฒฐ๊ณผ"trie" AND "data structure"
โ 335.000๊ฐ์ ๊ฒฐ๊ณผ๋ณ๊ฒฝ ๋ก๊ทธ:
void Merge(PriorityQueue<TElement, TPriority> other) // O(1)
๋ฉ์๋๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.Merge
๋ฉ์๋๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?์๋ก์ด FAQ๊ฐ ์ข์ ๋ณด์ ๋๋ค. ํธ๋ค ์ฌ์ ์ ์ฌ์ฉํ์ฌ ์ ์๋ API์ ๋ํด Dijkstra๋ฅผ ์ฝ๋ฉํ๋ฉด์ ๋์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ด์ฐฎ์ ๋ณด์์ต๋๋ค.
์ด ์์
์ ํตํด ์ป์ ์์ ๊ตํ ์ค ํ๋๋ ํ์ฌ ๋ฉ์๋ ์ด๋ฆ/์ค๋ฒ๋ก๋ ์งํฉ์ด out
๋ณ์์ ์์์ ์
๋ ฅ์ ๋ํด ์ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. C# ์ฝ๋๋ก ํ๊ณ ์ถ์๋ ๊ฒ์ TryDequeue(out var node)
. ํ์ง๋ง ๋ถํํ๋ out
๋ณ์์ ๋ช
์์ ์ ํ์ PriorityQueueNode<>
๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ฐ์ ์์ ๋๊ธฐ์ด ๋
ธ๋ ๋๋ ์์๋ฅผ ์ํ์ต๋๋ค.
var shortestDistances = new Dictionary<int, int>();
var queue = new PriorityQueue<int, int>();
var handles = new Dictionary<int, PriorityQueueNode<int, int>>();
handles[startNode] = queue.Enqueue(startNode, 0);
while (queue.TryDequeue(out PriorityQueueNode<int, int> nextQueueNode))
{
int nodeToExploreFrom = nextQueueNode.Element, minDistance = nextQueueNode.Priority;
shortestDistances.Add(nodeToExploreFrom, minDistance);
handles[nodeToExploreFrom] = null; // so it is clearly already visited
foreach (int nextNode in nodes)
{
int candidatePathDistance = minDistance + edgeDistances[nodeToExploreFrom, nextNode];
if (handles.TryGetValue(nextNode, out var nextNodeHandle))
{
if (nextNodeHandle != null && candidatePathDistance < nextNodeHandle.Priority)
{
queue.Update(nextNodeHandle, candidatePathDistance);
}
// or else... we already got there
}
else
{
handles[nextNode] = queue.Enqueue(nextNode, candidatePathDistance);
}
}
}
๋ด๊ฐ ๋ณด๊ธฐ์ ํด๊ฒฐ๋์ง ์์ ์ฃผ์ ์ค๊ณ ์ง๋ฌธ์ ๊ตฌํ์ด ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ธ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ํธ ๋ฐฐํ์ ์ด๋ฉฐ ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
์์ ์ ๊ทผ ๋ฐฉ์ ์ค ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ์ต์์ ๊ฐ์น๋ฅผ ์ ๊ณตํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ํจํด์ด ๋ฌด์์ธ์ง ๋ ์ ์ดํดํ๊ธฐ ์ํด Heap/PriorityQueue ๊ตฌํ์ ์ธ์คํด์ค์ ๋ํด Microsoft ๋ด๋ถ ๋ฐ ๊ณต์ฉ .NET ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ดํด๋ณด์์ต๋๋ค.
๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์ ๋ ฌ ๋๋ ์์ ์ค์ผ์ค๋ง์ ๋ณํ์ ๊ตฌํํฉ๋๋ค. ํ ํด๋ก์ง ์ ๋ ฌ ๋๋ ํํ๋ง ์ฝ๋ฉ๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ๊ฐ์ง ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋์์ต๋๋ค. ๊ทธ๋ํ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ๋ ์์ ์ซ์๊ฐ ์ฌ์ฉ๋์์ต๋๋ค. ์กฐ์ฌ๋ 80๊ฐ์ PriorityQueue ๊ตฌํ ์ค 9๊ฐ๋ง์ด ์ฐ์ ์์ ์ ๋ฐ์ดํธ์ ์ผ๋ถ ํํ๋ฅผ ๊ตฌํํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋์์ Python, Java, C++, Go, Swift ๋๋ Rust ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Heap/PriorityQueue ๊ตฌํ์ API์์ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์ด ๋ฐ์ดํฐ์ ๋น์ถ์ด ๋ณผ ๋ .ฮฮฮค์๋ ํ์ API(heapify/push/peek/pop)๋ฅผ ๋ ธ์ถํ๊ณ ํน์ ์ฑ๋ฅ ๋ณด์ฅ(์: ๋๊ธฐ์ด๋น ์ถ๊ฐ ํ ๋น ์์)์ ์ ๊ณตํ๊ณ ๊ฐ์ ํ์ง ์๋ ๊ธฐ๋ณธ PriorityQueue ๊ตฌํ์ด ํ์ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค. ๊ณ ์ ์ฑ ์ ์ฝ. ์ด๊ฒ์ ๊ตฌํ์ด _O(log n) ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์์ ๊ฒ์์ ์๋ฏธํฉ๋๋ค_.
๋ํ _O(log n)_ ์ ๋ฐ์ดํธ/์ ๊ฑฐ๋ฅผ ์ง์ํ๊ณ ๋๋ฑ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ณ๋์ ํ ๊ตฌํ์ ๋ฐ๋ฅด๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํน์ํ๋ ์ ํ์ด๋ฏ๋ก ๊ณ ์ ์ฑ ์๊ตฌ์ฌํญ์ ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
์ ๋ ๋ ๊ฐ์ง ๊ตฌํ์ ๋ชจ๋ ํ๋กํ ํ์ดํํ๋ ์์ ์ ํ๊ณ ์์ผ๋ฉฐ ๊ณง API ์ ์์ ๋ํ ํ์ ์กฐ์น๋ฅผ ์ทจํ ๊ฒ์ ๋๋ค.
@eiriktsarpalis, ๋ถ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ํนํ Microsoft ๋ด๋ถ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ์ฌ ๊ด๋ จ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐพ๊ณ ๋ฐ์ดํฐ์ ๋ํ ๋ ผ์๋ฅผ ์ง์ํ๋ ์๊ฐ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
ํธ๋ค ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ์์๋น ํ๋ ์ด์์ ์ถ๊ฐ ํ ๋น์ ์๋ฏธํฉ๋๋ค.
์ด ๊ฐ์ ์ ๊ฑฐ์ง์ด๋ฉฐ ๋ ธ๋ ๊ธฐ๋ฐ ํ์ ์ถ๊ฐ ํ ๋น์ด ํ์ํ์ง ์์ต๋๋ค. ํ์ด๋ง ํ์ ์ด๋ ์ด ๊ธฐ๋ฐ ์ด์ง ํ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ฅ์ ๋ํด ์ฑ๋ฅ์ด ๋ ์ฐ์ํฉ๋๋ค. ์ฆ, ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ํด์๋ ์ด ๋ ธ๋ ๊ธฐ๋ฐ ํ์ ์ฌ์ฉํ ์ธ์ผํฐ๋ธ๊ฐ ์์ต๋๋ค. ์์ ์ธ๊ธํ ๋ ผ๋ฌธ ์์ ๋ฒค์น๋งํฌ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์กฐ์ฌ๋ 80๊ฐ์ PriorityQueue ๊ตฌํ ์ค 9๊ฐ๋ง์ด ์ฐ์ ์์ ์ ๋ฐ์ดํธ์ ์ผ๋ถ ํํ๋ฅผ ๊ตฌํํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์ด ์์ ์ํ์ ๊ฐ์ํ๋๋ผ๋ ์ ์ฒด ์ฌ์ฉ๋์ 11-12%์ ๋๋ค. ๋ํ ์ด ๋น์จ์ด ๋ ๋์ ๊ฒ์ผ๋ก ์์๋๋ ๋น๋์ค ๊ฒ์๊ณผ ๊ฐ์ ํน์ ์์ญ์์๋ ์ด ๋น์จ์ด ๊ณผ์ ํ์๋ ์ ์์ต๋๋ค.
์ด ๋ฐ์ดํฐ์ ๋น์ถ์ด ๋ณผ ๋ [...]
ํต์ฌ ๊ฐ์ ์ค ํ๋๊ฐ ๊ฑฐ์ง์ด๊ณ ๊ณ ๊ฐ์ 11-12%๊ฐ ์ถฉ๋ถํ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก์ธ์ง ์ฌ๋ถ๊ฐ ๋ ผ์์ ์ฌ์ง๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ทธ๋ฌํ ๊ฒฐ๋ก ์ด ๋ช ํํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทํ์ ํ๊ฐ์์ ์ ๊ฐ ๋๋ฝ๋ ๊ฒ์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ด์ฌ์ด ์๋ ๊ณ ๊ฐ์ ์ํ "์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ"์ ๋น์ฉ ์ํฅ์ ๋ํ ํ๊ฐ์ ๋๋ค. ํธ๋ค ๋ฉ์ปค๋์ฆ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์๋:
| | 11-12% ์ฌ์ฉ ์ฌ๋ก | 88-89% ์ฌ์ฉ ์ฌ๋ก |
|:-:|:-:|:-:|
| ์
๋ฐ์ดํธ์ ๋ํ ๊ด์ฌ | ๋ค | ์๋ |
| ํธ๋ค์ ์ํด ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฐ์ต๋๋ค | N/A(์ํ๋ ๊ฒ) | ์๋ |
| ํธ๋ค์ ์ํด ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฐ์ต๋๋ค | ๋ค | ์๋ |
๋์๊ฒ ์ด๊ฒ์ 88-89%๋ฟ๋ง ์๋๋ผ 100% ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๋ ๋ฐ ์ฐฌ์ฑํ๋ ๊ฒ์ ๋น์ฐํฉ๋๋ค.
์ด ๊ฐ์ ์ ๊ฑฐ์ง์ด๋ฉฐ ๋ ธ๋ ๊ธฐ๋ฐ ํ์ ์ถ๊ฐ ํ ๋น์ด ํ์ํ์ง ์์ต๋๋ค.
์ฐ์ ์์์ ํญ๋ชฉ์ด ๋ชจ๋ ๊ฐ ์ ํ์ธ ๊ฒฝ์ฐ(๋๋ ๋ ๋ค ์์ ํ์ง ์๊ฑฐ๋ ๊ธฐ๋ณธ ์ ํ์ ๋ณ๊ฒฝํ ์ ์๋ ์ฐธ์กฐ ์ ํ์ธ ๊ฒฝ์ฐ) ์ถ๊ฐ ํ ๋น์ด ํ์ํ์ง ์์์ ๋ณด์ฌ์ฃผ๋ ๊ตฌํ์ ์ฐ๊ฒฐํ ์ ์์ต๋๊น? ๋ฌ์ฑ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ญ์์ค)? ๋ณด์๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์.
๋ ์์ธํ ์ค๋ช ํ๊ฑฐ๋ ๋งํ๋ ค๋ ๋ด์ฉ์ ๋ง์ํด ์ฃผ์๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ช ํํด์ผ ํ๊ณ ํ๊ตฌ๋ฅผ ํ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ ๊ธด ํ ๋ก ์ผ๋ก ๋ฐ๋ ๊ฒ์ ๋๋ค. ๋๋ ์ ํ๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.
ํธ์ถ์ ์ธก์์๋ ๊ตฌํ ์ธก์์๋ ํ ๋น์ ํ์๋ก ํ๋ Enqueue ์์
์ ํผํ๊ณ ์ถ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค(์๋ฅผ ๋ค์ด ๊ตฌํ์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด์ ํ์ฅํ๊ธฐ ์ํด ๋ถํ ๋ด๋ถ ํ ๋น์ ๊ด์ฐฎ์ต๋๋ค). ๋
ธ๋ ๊ธฐ๋ฐ ํ์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ์ดํดํ๋ ค๊ณ ํฉ๋๋ค(์: ํด๋น ๋
ธ๋ ๊ฐ์ฒด๊ฐ ํธ์ถ์์๊ฒ ๋
ธ์ถ๋๋ ๊ฒฝ์ฐ ๋ถ์ ์ ํ ์ฌ์ฌ์ฉ/์จ๋ฆฌ์ด์ฑ์ ๋ํ ์ฐ๋ ค๋ก ์ธํด ๊ตฌํ์ ์ํ ํ๋ง์ ๊ธ์งํจ). ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์๊ธฐ๋ฅผ ์ํ๋ค.
C#
pq.Enqueue(42, 84);
ํ ๋นํ์ง ์๋๋ก ํฉ๋๋ค. ๋น์ ์ด ์ฐธ์กฐํ๋ ๊ตฌํ์ ์ด๋ป๊ฒ ๊ทธ๊ฒ์ ๋ฌ์ฑํฉ๋๊น?
๋๋ ๋น์ ์ด ๋งํ๋ ค๋ ๊ฒ์ ๋งํ์ญ์์ค
๋๋ ๋ด๊ฐ ์๊ฐํ๋ค.
ํ ๋น์ด ํ์ํ Enqueue ์์ ์ ํผํ๊ณ ์ถ์ต๋๋ค. [...] ์ ๋
pq.Enqueue(42, 84);
๋ฅผ ์ฐ๊ณ ํ ๋นํ์ง ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
์ด ์๋ง์ ์ด๋์์ ์ค๋๊ฐ? 99.9% ๊ณ ๊ฐ์ด ๋ง์กฑํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ด ์๋ ์๋ฃจ์ ์ ๋ถ์์ฉ์ด ์๋ค๋ ๊ฒ์ ์ข์ ์ผ์ ๋๋ค. ์๋ฃจ์ ๊ฐ์ ์ค๊ณ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ ์ด ์ํฅ์ด ์ ์ ์ฐจ์์ ์ ํํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ์ฐจ์์ 12%์ ๊ณ ๊ฐ์๊ฒ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ 0.1%์ ๊ณ ๊ฐ์ ์ํ ์ต์ ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ฅผ ์ ํํ์ง ์์ต๋๋ค. "ํ ๋น ์์์ ์ ๊ฒฝ์ฐ์ง ์์" + "๋ ๊ฐ์ง ๊ฐ ์ ํ ๋ค๋ฃจ๊ธฐ"๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค.
์ ๋ ์ง์๋๋ ๋์/๊ธฐ๋ฅ์ ์ฐจ์์ด ํจ์ฌ ๋ ์ค์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ํนํ ๊ด๋ฒ์ํ ์ฒญ์ค๊ณผ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ๋ฒ์ฉ ๋ค๋ชฉ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ๋ ๊ทธ๋ ์ต๋๋ค.
์ด ์๋ง์ ์ด๋์์ ์ค๋๊ฐ?
์ฑ๋ฅ์ ๊ณ ๋ คํ๋ ์๋๋ฆฌ์ค์์ ํต์ฌ ์ปฌ๋ ์
์ ํ์ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋
ธ๋ ๊ธฐ๋ฐ ์๋ฃจ์
์ด ์ฌ์ฉ ์ฌ๋ก์ 100%๋ฅผ ์ง์ํ๋ค๊ณ ๋งํฉ๋๋ค. List<T>
, Dictionary<TKey, TValue>
, HashSet<T>
๋ฑ๊ณผ ๊ฐ์ด ๋ชจ๋ enqueue๊ฐ ํ ๋นํ๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ชจ๋ Add์ ํ ๋น๋๋ ๊ฒฝ์ฐ on์ ๋ง์ ์ํฉ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ํ ๋น ์ค๋ฒํค๋์ ๊ด์ฌ์ด ์๋ ๊ฒ์ด "0.1%"๋ผ๊ณ ์๊ฐํ์ญ๋๊น? ๊ทธ ๋ฐ์ดํฐ๋ ์ด๋์์ ์ค๋๊ฐ?
"ํ ๋น ์์์ ์ ๊ฒฝ์ฐ์ง ์์" + "๋ ๊ฐ์ง ๊ฐ ์ ํ ๋ค๋ฃจ๊ธฐ"๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค.
๊ทธ๋ ์ง ์๋ค. ๋ํ "๋ ๊ฐ์ง ๊ฐ ์ ํ"๋ง์ด ์๋๋๋ค. ๋ด๊ฐ ์ดํดํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ ์๋ ์๋ฃจ์ ์ a) ๊ด๋ จ๋ T์ ๊ด๊ณ์์ด ๋ชจ๋ ๋๊ธฐ์ด์ ํ ๋นํ๊ฑฐ๋ b) ์์ ์ ํ์ด ์๋ ค์ง ๊ธฐ๋ณธ ์ ํ์์ ํ์๋์ด์ผ ํ๋ฏ๋ก ๋ง์ ์์ ๊ฐ๋ฅํ ์ฌ์ฉ์ ๊ธ์งํด์ผ ํฉ๋๋ค. ์ถ๊ฐ ํ ๋น์ ํผํ์ญ์์ค.
@eiriktsarpalis
๋ฐ๋ผ์ ์ต์
์ ์์ง ๋ง์ญ์์ค. ๊ทํ์ ๋ชฉ๋ก์์ ์ต์
1, 2 ๋ฐ 3์ ์ถ๊ฐํ ์ ์๋ ์คํ ๊ฐ๋ฅํ ์ต์
4๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ์ ์ถฉ์์
๋๋ค.
์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ์ํ์ง ์๊ฑฐ๋ ์ฒ์์ ์ต์ ํ๋ ๊ตฌํ์์ 88% ๋๋ 12%์ ์ฌ์ฉํ ์ ์๋ ์ถ๊ฐ ์ฑ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ต์ 2์ 3์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์ฌ์ ํ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ต์ 4. ํ์ง๋ง ๋ค๋ฅธ ์ต์ ์ด ์๋ค๋ ์ฌ์ค์ ์์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํ์ต๋๋ค.
[๋๋ ์ด๊ฒ์ ๋ ๋์ ์ต์ 1๋ก ๋ณด๊ณ 1์ ๋ํ ์ค๋ช ์ ์ ๋ฐ์ดํธํ์ฌ ๋ถ๊ธฐ๊ฐ ๊ฐ์๋์ง๋ ์์ง๋ง ๊ฒ์ผ๋ฅด๊ณ ์ฌ๋ฐ๋ฅธ ๋๋ฑ ๋์์ ์ ๋ฐ์ดํธ๊ฐ ์ฌ์ฉ๋ ๋๋ง ํ์ํ๋ค๊ณ ๋งํ๋๋ก ์ ๋ฐ์ดํธํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค...]
@stephentoub ๋ฑ ์ ๊ฐ ํ๊ณ ์ถ์ ๋ง์ ํ๋ ค๊ณ ๋ง์
์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ํ ๋น ์ค๋ฒํค๋๋ฅผ ์ ๊ฒฝ ์ฐ๋ ์ฌ๋์ด 0.1%์ ๋ถ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๊น? ๊ทธ ๋ฐ์ดํฐ๋ ์ด๋์์ ์ค๋๊ฐ?
์ง๊ด์์, ์ฆ "์ ๋ฐ์ดํธ ์ํ ๋ฅ๋ ฅ"๋ณด๋ค "์ถ๊ฐ ํ ๋น ์์"์ ์ฐ์ ์์๋ฅผ ๋๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ๋์ผํ ์์ค์ ๋๋ค. ์ ์ด๋ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ ๊ฒฝ์ฐ 11-12%์ ๊ณ ๊ฐ์ด ์ด ๋์์ ์ง์ํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. ๋๋ ์๊ฒฉ์ผ๋ก ๊ฐ๊น์ด ๊ณ ๊ฐ์ด "์ถ๊ฐ ํ ๋น ์์"์ ๊ด์ฌ์ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋, ์ด๋ค ์ด์ ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ์ฐจ์์ ๊ณ ์ฐฉํ๊ธฐ๋ก ์ ํํ๊ณ ๋ค๋ฅธ ์ฐจ์(์: ์ ํธํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ๋ ๋ค๋ฅธ ์ ์ถฉ์)์ ์์ด๋ฒ๋ฆฌ๊ฒ ๋ฉ๋๋ค. "์ถ๊ฐ ํ ๋น ์์"์ ์ ๊ณตํ๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๊ตฌํ์ ๋ ธ๋ ๊ธฐ๋ฐ ๊ตฌํ๋ณด๋ค ๋๋ฆฝ๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์๋๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ์์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ๋ฐ ๋ฌผ๋ฌ์์ ๊ณ ๊ฐ์ด ์ํ๋ ๊ฒ์ ์ง์คํฉ์๋ค. ์ฐ๋ฆฌ๋ ๊ณ ๊ฐ์ 12%๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค ์๋ ์๊ณ ์ฌ์ฉํ์ง ์์ ์๋ ์๋ ๋์์ธ์ ์ ํํ ์ ์์ต๋๋ค. ์ง์ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ ์ด์ ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ ์คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
"์ถ๊ฐ ํ ๋น ์์"์ ์ ๊ณตํ๋ ์ด๋ ์ด ๊ธฐ๋ฐ ๊ตฌํ์ ๋ ธ๋ ๊ธฐ๋ฐ ๊ตฌํ๋ณด๋ค ๋๋ฆฝ๋๋ค.
๋น๊ต๋ฅผ ์ํํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ ๊ฐ์ง C# ๊ตฌํ๊ณผ ๊ทธ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ ๋ฒค์น๋งํฌ๋ฅผ ๊ณต์ ํ์ญ์์ค. ์ด๋ก ์ ์ธ ๋ ผ๋ฌธ์ ํ์คํ ๊ฐ์น๊ฐ ์์ง๋ง ํผ์ฆ์ ์์ ์กฐ๊ฐ์ผ ๋ฟ์ ๋๋ค. ๋ ์ค์ํ ๊ฒ์ ๊ณ ๋ฌด๊ฐ ๋๋ก๋ฅผ ๋ง๋ ๋ ์ฃผ์ด์ง ํ๋ซํผ๊ณผ ์ฃผ์ด์ง ๊ตฌํ์ ์ธ๋ถ ์ฌํญ์ ๊ณ ๋ คํ๊ณ ํน์ ๊ตฌํ ๋ฐ ์ผ๋ฐ์ /์์ ๋ฐ์ดํฐ ์ธํธ/์ฌ์ฉ ํจํด์ผ๋ก ํน์ ํ๋ซํผ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋น์ ์ ์ฃผ์ฅ์ด ์ณ์ ์๋ ์์ต๋๋ค. ๋ํ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ๋ ์ ์ดํดํ ์ ์๋๋ก ๊ตฌํ/๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋น๊ต๋ฅผ ์ํํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง C# ๊ตฌํ๊ณผ ํด๋น ๊ฒฐ๋ก ์ ๋๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ ๋ฒค์น๋งํฌ๋ฅผ ๊ณต์ ํ์ธ์.
๋ด๊ฐ ์ธ์ฉํ ๋ ผ๋ฌธ์ C++์์ ๊ตฌํ์ ๋น๊ตํ๊ณ ๋ฒค์น๋งํฌ๋ง ํ๊ณ ์๋ค๋ ์ ์ ๋๋ค. ๋ค์ํ ๋ฐ์ดํฐ ์ธํธ ๋ฐ ์ฌ์ฉ ํจํด์ผ๋ก ์ฌ๋ฌ ๋ฒค์น๋งํฌ๋ฅผ ์ํํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด C#์ผ๋ก ์ด์ ๋ ์ ์๋ค๊ณ ํ์ ํ์ง๋ง ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ ๋ฐฐ๋ก ์ค์ฌ์ผ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ๋๋ฃ์๊ฒ ๊ทธ๋ฌํ ์ฐ๊ตฌ๋ฅผ ์ํํ๋๋ก ์์ฒญํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์กฐ์น๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@pgolebiowski ๊ทํ์ ์ด์ ์ ๊ธฐ์ ์ฑ๊ฒฉ์ ๋ ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค. ์ ์์๋ ๋ ๊ฐ์ง ๊ฐ๋ณ ์ ํ์ ์ง์งํ๋๋ฐ, ์ด๊ฒ์ด ๊ทํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์์ต๋๊น?
- 12%์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๋ ๊ตฌํ๊ณผ ๋๋ฑํ ์ ์๋ ์์์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํ๊ณ ์ ๋ฐ์ดํธ ๋ฉ์๋๊ฐ ์ฒ์ ํธ์ถ๋ ๋ ์ด๋ฌํ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ์กฐํ ํ ์ด๋ธ์ ๋๋ฆฌ๊ฒ ๊ตฌ์ถํ์ฌ ๋๋จธ์ง 88%์ ๋ํด ๊ฑฐ์ ์ต์ ํํฉ๋๋ค( ๋ฐ ํ์ ์ํ์ค ์ ๋ฐ์ดํธ+์ ๊ฑฐ์์ ์ ๋ฐ์ดํธ). ๋ฐ๋ผ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋ ์ฑ์ ๋ํด ๋ ์ ์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
์ต์ 1์ ๋ํ ์ฑ๋ฅ ์ต์ ํ๋ก ๋ถ๋ฅํ ์ ์์ง๋ง ํน์ ์ ๊ทผ ๋ฐฉ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@eiriktsarpalis ๊ทธ๊ฒ์ ์ ์ผํ O(n) ํ ๋ฒ, ๊ทธ๋ฆฌ๊ณ O(1) ์ดํ์ ์๊ฐ๋๋ O(1)์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒซ ๋ฒ์งธ ์ ๋ฐ์ดํธ๊น์ง ๊ณ ์ ์ฑ ๊ฒ์ฆ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ง๋์น๊ฒ ์๋ฆฌํ ๊ฒ์ผ ์๋ ์์ต๋๋ค. 2๊ฐ์ ํด๋์ค๊ฐ ๋ ์ค๋ช ํ๊ธฐ ์ฝ์ต๋๋ค.
์ ๋ ์ง๋ ๋ฉฐ์น ๋์ ๋ ๊ฐ์ง PriorityQueue ๊ตฌํ์ ํ๋กํ ํ์ดํํ๋ ๋ฐ ๋ณด๋์ต๋๋ค. ์
๋ฐ์ดํธ ์ง์์ด ์๋ ๊ธฐ๋ณธ ๊ตฌํ๊ณผ ์์ ๋๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ๊ตฌํ์
๋๋ค. ๋๋ ์ ์์ ์ด๋ฆ์ PriorityQueue
๋ก, ํ์๋ฅผ PrioritySet
์ง์์ต๋๋ค. ๋ด ๋ชฉํ๋ API ์ธ์ฒด ๊ณตํ์ ์ธก์ ํ๊ณ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๊ฒ์
๋๋ค.
๊ตฌํ์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ ํด๋์ค ๋ชจ๋ ์ด๋ ์ด ๊ธฐ๋ฐ ์ฟผ๋ ํ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ๊ตฌํ์ ์์๋ฅผ ๋ด๋ถ ํ ์ธ๋ฑ์ค์ ๋งคํํ๋ ์ฌ์ ๋ ์ฌ์ฉํฉ๋๋ค.
namespace System.Collections.Generic
{
public class PriorityQueue<TElement, TPriority> : IReadOnlyCollection<(TElement Element, TPriority Priority)>
{
// Constructors
public PriorityQueue();
public PriorityQueue(int initialCapacity);
public PriorityQueue(IComparer<TPriority>? comparer);
public PriorityQueue(int initialCapacity, IComparer<TPriority>? comparer);
public PriorityQueue(IEnumerable<(TElement Element, TPriority Priority)> values);
public PriorityQueue(IEnumerable<(TElement Element, TPriority Priority)> values, IComparer<TPriority>? comparer);
// Properties
public int Count { get; }
public IComparer<TPriority> Comparer { get; }
// O(log(n)) push operation
public void Enqueue(TElement element, TPriority priority);
// O(1) peek operations
public TElement Peek();
public bool TryPeek(out TElement element, out TPriority priority);
// O(log(n)) pop operations
public TElement Dequeue();
public bool TryDequeue(out TElement element, out TPriority priority);
// Combined push/pop, generally more efficient than sequential Enqueue();Dequeue() calls.
public TElement EnqueueDequeue(TElement element, TPriority priority);
public void Clear();
public Enumerator GetEnumerator();
public struct Enumerator : IEnumerator<(TElement Element, TPriority Priority)>, IEnumerator;
}
}
๋ค์์ ์ ํ์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ํ์ ๋๋ค.
var queue = new PriorityQueue<string, int>();
queue.Enqueue("John", 1940);
queue.Enqueue("Paul", 1942);
queue.Enqueue("George", 1943);
queue.Enqueue("Ringo", 1940);
Assert.Equal("John", queue.Dequeue());
Assert.Equal("Ringo", queue.Dequeue());
Assert.Equal("Paul", queue.Dequeue());
Assert.Equal("George", queue.Dequeue());
namespace System.Collections.Generic
{
public class PrioritySet<TElement, TPriority> : IReadOnlyCollection<(TElement Element, TPriority Priority)> where TElement : notnull
{
// Constructors
public PrioritySet();
public PrioritySet(int initialCapacity);
public PrioritySet(IComparer<TPriority> comparer);
public PrioritySet(int initialCapacity, IComparer<TPriority>? priorityComparer, IEqualityComparer<TElement>? elementComparer);
public PrioritySet(IEnumerable<(TElement Element, TPriority Priority)> values);
public PrioritySet(IEnumerable<(TElement Element, TPriority Priority)> values, IComparer<TPriority>? comparer, IEqualityComparer<TElement>? elementComparer);
// Members shared with baseline PriorityQueue implementation
public int Count { get; }
public IComparer<TPriority> Comparer { get; }
public void Enqueue(TElement element, TPriority priority);
public TElement Peek();
public bool TryPeek(out TElement element, out TPriority priority);
public TElement Dequeue();
public bool TryDequeue(out TElement element, out TPriority priority);
public TElement EnqueueDequeue(TElement element, TPriority priority);
// Update methods and friends
public bool Contains(TElement element); // O(1)
public bool TryRemove(TElement element); // O(log(n))
public bool TryUpdate(TElement element, TPriority priority); // O(log(n))
public void EnqueueOrUpdate(TElement element, TPriority priority); // O(log(n))
public void Clear();
public Enumerator GetEnumerator();
public struct Enumerator : IEnumerator<(TElement Element, TPriority Priority)>, IEnumerator;
}
}
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ๊ฐ์ง ๊ตฌํ์ ๋น๊ตํ๋ ๊ฐ๋จํ ํ ์ ๋ ฌ ๋ฒค์น๋งํฌ ๋ฅผ ์์ฑํ์ต๋๋ค. ๋ํ ๋น๊ต๋ฅผ ์ํด Linq๋ฅผ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฒค์น๋งํฌ๋ ํฌํจํ์ต๋๋ค.
BenchmarkDotNet=v0.12.1, OS=ubuntu 20.04
AMD EPYC 7452, 1 CPU, 4 logical and 2 physical cores
.NET Core SDK=5.0.100-rc.2.20479.15
[Host] : .NET Core 5.0.0 (CoreCLR 5.0.20.47505, CoreFX 5.0.20.47505), X64 RyuJIT
DefaultJob : .NET Core 5.0.0 (CoreCLR 5.0.20.47505, CoreFX 5.0.20.47505), X64 RyuJIT
| ๋ฐฉ๋ฒ | ํฌ๊ธฐ | ํ๊ท | ์ค๋ฅ | ํ์ค ๊ฐ๋ฐ | ๋น์จ | ๋น์จSD | 0์ธ๋ | 1์ธ๋ | 2์ธ๋ | ํ ๋น๋จ |
|---------------- |------ |-------------:|-------------: |-------------:|------:|--------:|--------:|-------- :|--------:|----------:|
| ๋งํฌ ์ ๋ ฌ | 30 | 1.439 ์ฐ๋ฆฌ | 0.0072 ์ฐ๋ฆฌ | 0.0064 ์ฐ๋ฆฌ | 1.00 | 0.00 | 0.0095 | - | - | 672B |
| ์ฐ์ ์์ ํ | 30 | 1.450 ์ฐ๋ฆฌ | 0.0085 ์ฐ๋ฆฌ | 0.0079 ์ฐ๋ฆฌ | 1.01 | 0.01 | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 30 | 2.778 ์ฐ๋ฆฌ | 0.0217 ์ฐ๋ฆฌ | 0.0192 ์ฐ๋ฆฌ | 1.93 | 0.02 | - | - | - | - |
| | | | | | | | | | | |
| ๋งํฌ ์ ๋ ฌ | 300 | 24.727 ์ฐ๋ฆฌ | 0.1032 ์ฐ๋ฆฌ | 0.0915 ์ฐ๋ฆฌ | 1.00 | 0.00 | 0.0305 | - | - | 3912 B |
| ์ฐ์ ์์ ํ | 300 | 29.510 ์ฐ๋ฆฌ | 0.0995 ์ฐ๋ฆฌ | 0.0882 ์ฐ๋ฆฌ | 1.19 | 0.01 | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 300 | 47.715 ์ฐ๋ฆฌ | 0.4455 ๋ฏธ๊ตญ | 0.4168 ์ฐ๋ฆฌ | 1.93 | 0.02 | - | - | - | - |
| | | | | | | | | | | |
| ๋งํฌ ์ ๋ ฌ | 3000 | 412.015 ์ฐ๋ฆฌ | 1.5495 ๋ฏธ๊ตญ | 1.3736 ์ฐ๋ฆฌ | 1.00 | 0.00 | 0.4883 | - | - | 36312 B |
| ์ฐ์ ์์ ํ | 3000 | 491.722 ์ฐ๋ฆฌ | 4.1463 ์ฐ๋ฆฌ | 3.8785 ์ฐ๋ฆฌ | 1.19 | 0.01 | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 3000 | 677.959 ๋ฏธ๊ตญ | 3.1996 ์ฐ๋ฆฌ | 2.4981 ์ฐ๋ฆฌ | 1.64 | 0.01 | - | - | - | - |
| | | | | | | | | | | |
| ๋งํฌ ์ ๋ ฌ | 30000 | 5,223.560๋ฏธ๊ตญ | 11.9077 ์ฐ๋ฆฌ | 9.9434 ์ฐ๋ฆฌ | 1.00 | 0.00 | 93.7500 | 93.7500 | 93.7500 | 360910 B |
| ์ฐ์ ์์ ํ | 30000 | 5,688.625๋ฏธ๊ตญ | 53.0746 ์ฐ๋ฆฌ | 49.6460 ๋ฏธ๊ตญ | 1.09 | 0.01 | - | - | - | 2B |
| ์ฐ์ ์์ ์ค์ | 30000 | 8,124.306 ์ฐ๋ฆฌ | 39.9498 ๋ฏธ๊ตญ | 37.3691 ์ฐ๋ฆฌ | 1.55 | 0.01 | - | - | - | 4B |
์์ํ ์ ์๋ฏ์ด ์ถ์ ์์ ์์น์ ์ค๋ฒํค๋๋ ๊ธฐ์ค ๊ตฌํ์ ๋นํด ์ฝ 40-50% ๋๋ฆฐ ์๋นํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ชจ๋ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ง์ ์๊ฐ๊ณผ ์๋์ง๊ฐ ํ์ํ์ต๋๋ค.
๋ฐ์ฌ:
(priority: ComputePriority(element), element)
ํํ์ PQ์ ์ ์ฅํ๊ณ ์ฐ์ ์์ getter ํจ์๋ ๋จ์ํ tuple => tuple.priority
์
๋๋ค.์ ๋ ๋ก๋ด ๊ณตํ๊ณผ ๊ฒ์ ๋ชจ๋์ ๊ด๋ จ๋ ๊ณ ์ฑ๋ฅ ๊ฒ์(๋ชจ์ ๊ณํ) ๋ฐ ๊ณ์ฐ ๊ธฐํํ ์ฝ๋(์: ์ค์๋ผ์ธ ์๊ณ ๋ฆฌ์ฆ)์์ ์ผํ๋ฉฐ ์ฌ์ฉ์ ์ง์ ์๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์๊ฐ ์ ์ฉํ์ง ์์ Top-K ์ฟผ๋ฆฌ์ ๋๋ค.
๋ ๊ฐ์ง ๊ตฌํ(์ ๋ฐ ์ ๋ฐ์ดํธ ์ง์ ์์) ํ ๋ก ์ ๋ํ ๋ช ๊ฐ์ง ํผ๋๋ฐฑ์ ๋๋ค.
๋ช ๋ช :
์ฑ๋ฅ:
์ํผ์ค:
Func<TElement, TPriority>
๊ฒ์ด ์ข์ต๋๋ค. ์ปดํจํ
์ฐ์ ์์๊ฐ ๋น์ธ๋ฉด (priority, element)
๋ฅผ ์ฝ์
ํ๊ณ func tuple => tuple.priority
์ ๊ณตํ๋ฉด ๋ฉ๋๋ค.์ฆ, ์๋นํ ์์ ๋ด ์๊ณ ๋ฆฌ์ฆ์์ ์ฐ์ ์์ ๋๊ธฐ์ด ํญ๋ชฉ์ ์ฐ์ ์์๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ๋ ๋ฒ(PQ์ ํ ๋ฒ, ํญ๋ชฉ์ ํ ๋ฒ) ์ ์ฅํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ๋ก ๋ค๋ฆฝ๋๋ค. ์ด๊ฒ์ ํนํ ๋ด๊ฐ ์๋ง์ ํค๋ก ์ฃผ๋ฌธํ๋ ๊ฒฝ์ฐ์ ๋๋ค(OrderBy.ThenBy.ThenBy์ ์ ์ฌํ ์ฌ์ฉ ์ฌ๋ก). ์ด API๋ ๋ํ Insert๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ง Peek์ด ๋ฐํํ์ง ์๋ ๋ง์ ๋ถ์ผ์น๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฐฐ์ด ์์ ์์ฒด๊ฐ ์๋๋ผ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฐ์ ์์ ํ์ ์ฝ์
ํ๋ ์์ต๋๋ค . ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ง๊ธ๊น์ง ๋
ผ์๋ ๋ชจ๋ API์์ ์ง์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, x์ถ ๋ผ์ธ์์ ๊ฐ๊ฒฉ์ ์์/๋์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ฐ์ ์์ ๋๊ธฐ์ด ์ด๋ฒคํธ (x, isStartElseEnd, intervalId)
์๊ณ x ์์ผ๋ก ์ ๋ ฌ๋ ๋ค์ isStartElseEnd ์์ผ๋ก ์ ๋ ฌ๋ ์ ์์ต๋๋ค. ์ด๋ ์ธ๋ฑ์ค์์ ์ผ๋ถ ๊ณ์ฐ๋ ๋ฐ์ดํฐ๋ก ๋งคํ๋๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
@pgolebiowski ์ ์ํ ํ์ด๋ง ํ ๊ตฌํ ์ ๋ฒค์น๋งํฌ์ ํฌํจํ์ฌ ์ธ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์ธ์คํด์ค๋ฅผ ์ง์ ๋น๊ตํ ์ ์๋๋ก ํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ๋ฐฉ๋ฒ | ํฌ๊ธฐ | ํ๊ท | ์ค๋ฅ | ํ์ค ๊ฐ๋ฐ | ์ค์๊ฐ | 0์ธ๋ | 1์ธ๋ | 2์ธ๋ | ํ ๋น๋จ |
|---------------- |-------- |-------------------:|---- ----------:|-----------------:|---------------- ---:|----------:|------:|------:|-------------:|
| ์ฐ์ ์์ ํ | 10 | 774.7ns | 3.30ns | 3.08ns | 773.2ns | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 10 | 1,643.0ns | 3.89ns | 3.45ns | 1,642.8ns | - | - | - | - |
| ํ์ด๋งํ | 10 | 1,660.2ns | 14.11ns | 12.51ns | 1,657.2ns | 0.0134 | - | - | 960B |
| ์ฐ์ ์์ ํ | 50 | 6,413.0ns | 14.95ns | 13.99ns | 6,409.5ns | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 50 | 12,193.1ns | 35.41ns | 29.57ns | 12,188.3ns | - | - | - | - |
| ํ์ด๋งํ | 50 | 13,955.8ns | 193.36ns | 180.87ns | 13,989.2ns | 0.0610 | - | - | 4800B |
| ์ฐ์ ์์ ํ | 150 | 27,402.5ns | 76.52ns | 71.58ns | 27,410.2ns | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 150 | 48,485.8ns | 160.22ns | 149.87ns | 48,476.3ns | - | - | - | - |
| ํ์ด๋งํ | 150 | 56,951.2ns | 190.52ns | 168.89ns | 56,953.6ns | 0.1831 | - | - | 14400B |
| ์ฐ์ ์์ ํ | 500 | 124,933.7ns | 429.20ns | 380.48ns | 124,824.4ns | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 500 | 206,310.0ns | 433.97ns | 338.81ns | 206,319.0ns | - | - | - | - |
| ํ์ด๋งํ | 500 | 229,423.9ns | 3,213.33ns | 2,848.53ns | 230,398.7ns | 0.4883 | - | - | 48000B |
| ์ฐ์ ์์ ํ | 1000 | 284,481.8ns | 475.91ns | 445.16ns | 284,445.6ns | - | - | - | - |
| ์ฐ์ ์์ ์ค์ | 1000 | 454,989.4ns | 3,712.11ns | 3,472.31ns | 455,354.0ns | - | - | - | - |
| ํ์ด๋งํ | 1000 | 459,049.3ns | 1,706.28ns | 1,424.82ns | 459,364.9ns | 0.9766 | - | - | 96000B |
| ์ฐ์ ์์ ํ | 10000 | 3,788,802.4ns | 11,715.81ns | 10,958.98ns | 3,787,811.9ns | - | - | - | 1B |
| ์ฐ์ ์์ ์ค์ | 10000 | 5,963,100.4ns | 26,669.04ns | 22,269.86ns | 5,950,915.5ns | - | - | - | 2B |
| ํ์ด๋งํ | 10000 | 6,789,719.0ns | 134,453.01ns | 265,397.13ns | 6,918,392.9ns | 7.8125 | - | - | 960002 B |
| ์ฐ์ ์์ ํ | 1000000 | 595,059,170.7ns | 4,001,349.38ns | 3,547,092.00ns | 595,716,610.5ns | - | - | - | 4376 B |
| ์ฐ์ ์์ ์ค์ | 1000000 | 1,592,037,780.9ns | 13,925,896.05ns | 12,344,944.12ns | 1,591,051,886.5ns | - | - | - | 288B |
| ํ์ด๋งํ | 1000000 | 1,858,670,560.7ns | 36,405,433.20ns | 59,815,170.76ns | 1,838,721,629.0ns | 1000.0000 | - | - | 96000376 B |
~์์ ๊ด์ ์์ ๋๋ ์ฌ์ ํ ๊ธฐ์ค ์ด๋ ์ด ํ๊ณผ ํ์ด๋ง ํ ์ ๊ทผ ๋ฐฉ์ ์ฌ์ด์ ์ ํจํ ์ ์ถฉ์ ์ด ์๋ค๊ณ ๋ฏฟ์ต๋๋ค~.
ํธ์ง: ๋ด ๋ฒค์น๋งํฌ์์ ๋ฒ๊ทธ ์์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. @VisualMelon ๊ฐ์ฌํฉ๋๋ค.
@eiriktsarpalis PairingHeap
๋ํ ๊ทํ์ ๋ฒค์น๋งํฌ๋ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. Add
๋ํ ๋งค๊ฐ๋ณ์๋ ์๋ชป๋ ๋ฐฉํฅ์
๋๋ค. ๊ตํํ๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋๋ค. https://gist.github.com/VisualMelon/00885fe50f7ab0f4ae5cd1307312109f
(์ฒ์ ๊ตฌํํ ๋์ ๋๊ฐ์ ์์ ์ ์ํํ์ต๋๋ค.)
์ด๊ฒ์ ํ์ด๋ง ํ์ด ๋ ๋น ๋ฅด๊ฑฐ๋ ๋๋ฆฌ๋ค๋ ์๋ฏธ๊ฐ ์๋๋ผ ์ ๊ณต๋ ๋ฐ์ดํฐ์ ๋ฐฐํฌ/์์์ ํฌ๊ฒ ์์กดํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@eiriktsarpalis re: PrioritySet์ ์ ์ฉ์ฑ...
์๋๋ฆฌ์ค์์ ์ฐ์ ์์ ์
๋ฐ์ดํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์
๋ฐ์ดํธ ๊ฐ๋ฅ์ด heapsort์ ๋ํด ๋ ๋๋ฆฌ๋ค๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ๊ฒ์ ๊ธฐ๋ํด์๋ ์ ๋ฉ๋๋ค. (๋ํ ํ ์ ๋ ฌ์ ๊ฒฝ์ฐ ์ค๋ณต์ ์ ์ง ํ๊ธฐ๋ฅผ ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ์ธํธ๊ฐ ์ ์ ํ์ง ์์ต๋๋ค.)
PrioritySet์ด ์ ์ฉํ์ง ์์๋ณด๊ธฐ ์ํ ๋ฆฌํธ๋จธ์ค ํ ์คํธ๋ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฒค์น๋งํน ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ ๋น์ ๋ฐ์ดํธ ๊ตฌํ, ํ์์ ์ค๋ณต ๊ฐ์ ํ์ ๋ฃ๊ณ ํ์์ ์ ๊ฑฐํ ๋ ์ค๋ณต์ ๋ฌด์ํด์ผ ํฉ๋๋ค.
@VisualMelon ๊ฐ์ฌํฉ๋๋ค. ์ ์๋ ์์ ์ฌํญ ์ดํ์ ๊ฒฐ๊ณผ์ ์๊ฒฌ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์คํ๋ ค ์ ๊ณต๋ ๋ฐ์ดํฐ์ ๋ฐฐํฌ/์์์ ํฌ๊ฒ ์์กดํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ธฐ์ด์ ์๋ ์ฐ์ ์์๊ฐ ๋จ์กฐ๋กญ๋ค๋ ์ฌ์ค์์ ์ด์ ์ ์ป์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
PrioritySet์ด ์ ์ฉํ์ง ์์๋ณด๊ธฐ ์ํ ๋ฆฌํธ๋จธ์ค ํ ์คํธ๋ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฒค์น๋งํน ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ ๋น์ ๋ฐ์ดํธ ๊ตฌํ, ํ์์ ์ค๋ณต ๊ฐ์ ํ์ ๋ฃ๊ณ ํ์์ ์ ๊ฑฐํ ๋ ์ค๋ณต์ ๋ฌด์ํด์ผ ํฉ๋๋ค.
@TimLovellSmith ์ฌ๊ธฐ์์ ์ ๋ชฉํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ PriorityQueue ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ ๋ฐ์ดํธ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ธฐ๋ณด๋ค ์ ๋ฐ์ดํธ๊ฐ ์ ํ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ๋ฏธ์น๋ ์ํฅ์ ๋ณด๊ณ ์ถ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด๋ง ํ์ "PrioritySet" ์ ๋ฐ์ดํธ์ ๋น๊ตํ๋ ๋ณ๋์ ๋ฒค์น๋งํฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
@miyu ์์ธํ ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. ๋๋จํ ๊ฐ์ฌํฉ๋๋ค!
@TimLovellSmith ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ๋ฒค์น๋งํฌ ๋ฅผ ์์ฑํ์ต๋๋ค.
| ๋ฐฉ๋ฒ | ํฌ๊ธฐ | ํ๊ท | ์ค๋ฅ | ํ์ค ๊ฐ๋ฐ | ์ค์๊ฐ | 0์ธ๋ | 1์ธ๋ | 2์ธ๋ | ํ ๋น๋จ |
|------------ |-------- |------------------:|------------ -----:|---------------:|---------------:|----:| ------:|------:|-----------:|
| ์ฐ์ ์์ ์ค์ | 10 | 1.052 ์ฐ๋ฆฌ | 0.0106 ์ฐ๋ฆฌ | 0.0099 ์ฐ๋ฆฌ | 1.055 ์ฐ๋ฆฌ | - | - | - | - |
| ํ์ด๋งํ | 10 | 1.055 ์ฐ๋ฆฌ | 0.0042 ์ฐ๋ฆฌ | 0.0035 ์ฐ๋ฆฌ | 1.055 ์ฐ๋ฆฌ | 0.0057 | - | - | 480B |
| ์ฐ์ ์์ ์ค์ | 50 | 7.394 ์ฐ๋ฆฌ | 0.0527 ์ฐ๋ฆฌ | 0.0493 ์ฐ๋ฆฌ | 7.380 ์ฐ๋ฆฌ | - | - | - | - |
| ํ์ด๋งํ | 50 | 8.587 ์ฐ๋ฆฌ | 0.1678 ์ฐ๋ฆฌ | 0.1570 ๋ฏธ๊ตญ | 8.634 ์ฐ๋ฆฌ | 0.0305 | - | - | 2400B |
| ์ฐ์ ์์ ์ค์ | 150 | 27.522 ์ฐ๋ฆฌ | 0.0459 ์ฐ๋ฆฌ | 0.0359 ์ฐ๋ฆฌ | 27.523 ์ฐ๋ฆฌ | - | - | - | - |
| ํ์ด๋งํ | 150 | 32.045 ์ฐ๋ฆฌ | 0.1076 ์ฐ๋ฆฌ | 0.1007 ์ฐ๋ฆฌ | 32.019 ์ฐ๋ฆฌ | 0.0610 | - | - | 7200B |
| ์ฐ์ ์์ ์ค์ | 500 | 109.097 ์ฐ๋ฆฌ | 0.6548 ์ฐ๋ฆฌ | 0.6125 ์ฐ๋ฆฌ | 109.162 ์ฐ๋ฆฌ | - | - | - | - |
| ํ์ด๋งํ | 500 | 131.647 ์ฐ๋ฆฌ | 0.5401 ์ฐ๋ฆฌ | 0.4510 ์ฐ๋ฆฌ | 131.588 ์ฐ๋ฆฌ | 0.2441 | - | - | 24000B |
| ์ฐ์ ์์ ์ค์ | 1000 | 238.184 ์ฐ๋ฆฌ | 1.0282 ์ฐ๋ฆฌ | 0.9618 ์ฐ๋ฆฌ | 238.457 ์ฐ๋ฆฌ | - | - | - | - |
| ํ์ด๋งํ | 1000 | 293.236 ์ฐ๋ฆฌ | 0.9396 ๋ฏธ๊ตญ | 0.8789 ๋ฏธ๊ตญ | 293.257 ์ฐ๋ฆฌ | 0.4883 | - | - | 48000B |
| ์ฐ์ ์์ ์ค์ | 10000 | 3,035.982 ๋ฏธ๊ตญ | 12.2952 ์ฐ๋ฆฌ | 10.8994 ๋ฏธ๊ตญ | 3,036.985๋ฏธ๊ตญ | - | - | - | 1B |
| ํ์ด๋งํ | 10000 | 3,388.685๋ฏธ๊ตญ | 16.0675 ์ฐ๋ฆฌ | 38.1861 ์ฐ๋ฆฌ | 3,374.565 ๋ฏธ๊ตญ | - | - | - | 480002 B |
| ์ฐ์ ์์ ์ค์ | 1000000 | 841,406.888 ๋ฏธ๊ตญ | 16,788.4775 ๋ฏธ๊ตญ | 15,703.9522 ๋ฏธ๊ตญ | 840,888.389 ๋ฏธ๊ตญ | - | - | - | 288B |
| ํ์ด๋งํ | 1000000 | 989,966.501๋ฏธ๊ตญ | 19,722.6687 ๋ฏธ๊ตญ | 30,705.8191 ๋ฏธ๊ตญ | 996,075.410๋ฏธ๊ตญ | - | - | - | 48000448 B |
๋ณ๋์ ๋ฉ๋ชจ์์ ์์ ์ฑ ๋ถ์กฑ์ด ์ฌ๋๋ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ฌธ์ (๋๋ ๋ฌธ์ ๊ฐ ์๋)์ ๋ํ ํ ๋ก /ํผ๋๋ฐฑ์ด ์์์ต๋๊น?
์์ ์ฑ ๋ถ์กฑ์ด ์ฌ๋๋ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ฌธ์ (๋๋ ๋ฌธ์ ๊ฐ ์๋)์ ๋ํ ํ ๋ก /ํผ๋๋ฐฑ์ด ์์์ต๋๋ค.
์ด๋ค ๊ตฌํ๋ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ง๋ง ์ฌ์ฉ์๊ฐ ์ฝ์ ์์๋ก ์์๋ฅผ ๋ณด๊ฐํ์ฌ ์์ ์ฑ์ ์ป๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
var pq = new PriorityQueue<string, (int priority, int insertionCount)>();
int insertionCount = 0;
foreach (string element in elements)
{
int priority = 42;
pq.Enqueue(element, (priority, insertionCount++));
}
์ด์ ๊ฒ์๋ฌผ ์ค ์ผ๋ถ๋ฅผ ์์ฝํ๊ธฐ ์ํด ์ธ๊ธฐ ์๋ .NET ์ฐ์ ์์ ๋๊ธฐ์ด์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ์ธํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ผ๋ก .NET 6์ ๋ํด ๋ค์ ์์ ์ ์ํํ ๊ฒ์ ์ ์ํฉ๋๋ค.
๋จ์ํ๊ณ ๋๋ถ๋ถ์ ์ฌ์ฉ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ฉฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ธ System.Collections.Generic.PriorityQueue
ํด๋์ค๋ฅผ ์๊ฐํฉ๋๋ค. ์ด๋ ์ด ์ง์ 4์ฐจ ํ์ ์ฌ์ฉํ๋ฉฐ ์ฐ์ ์์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๊ตฌํ์ ํ๋กํ ํ์
์ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
ํจ์จ์ ์ธ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ํ์ ํ์์ฑ์ ์ธ์ํ๊ณ ์์ผ๋ฏ๋ก ์ด ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๋ ํน์ ํด๋์ค๋ฅผ ๋์ ํ๊ธฐ ์ํด ๊ณ์ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ด ์๋ ๋ช ๊ฐ์ง ํ๋กํ ํ์ [ 1 , 2 ]์ ํ๊ฐํ๊ณ ์์ต๋๋ค. ๋์์ธ์ ๋ง๋ฌด๋ฆฌํ๋ ๋ฐ ๋ ๋ง์ ์์ ์ด ํ์ํ๋ฏ๋ก ๋์ค์ ์ด ์ ํ์ ๋์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ฌ ์ด ์ค๋ ๋์ ๊ธฐ์ฌ์, ํนํ @pgolebiowski ์ @TimLovellSmith์๊ฒ ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ ์ ํ๊ณ ์ถ์ต๋๋ค. ๊ทํ์ ํผ๋๋ฐฑ์ ๋์์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ดํ๋ ๋ฐ ํฐ ์ญํ ์ ํ์ต๋๋ค. ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋์์ธ์ ๋ค๋ฌ๋ ๋์ ๊ณ์ํด์ ๊ทํ์ ์๊ฒฌ์ ๋ฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์์ผ๋ก .NET 6์ ๋ํด ๋ค์ ์์ ์ ์ํํ ๊ฒ์ ์ ์ํฉ๋๋ค. [...]
์ข์ ์๋ฆฌ :)
๋จ์ํ๊ณ ๋๋ถ๋ถ์ ์ฌ์ฉ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ฉฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ธ
System.Collections.Generic.PriorityQueue
ํด๋์ค๋ฅผ ์๊ฐํฉ๋๋ค. ์ด๋ ์ด ์ง์ 4์ฐจ ํ์ ์ฌ์ฉํ๋ฉฐ ์ฐ์ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์ฝ๋๋ฒ ์ด์ค ์์ ์๊ฐ ์ด ๋ฐฉํฅ์ ์น์ธํ๊ณ ์ํ๋ค๊ณ ๊ฒฐ์ ํ ๊ฒฝ์ฐ ํด๋น ๋นํธ์ ๋ํ API ์ค๊ณ๋ฅผ ๊ณ์ ์ด๋๊ณ ์ต์ข ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๊น?
ํ์ฌ ์ด ์ค๋ ๋์ ๊ธฐ์ฌ์, ํนํ @pgolebiowski ์ @TimLovellSmith์๊ฒ ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ ์ ํ๊ณ ์ถ์ต๋๋ค. ๊ทํ์ ํผ๋๋ฐฑ์ ๋์์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ดํ๋ ๋ฐ ํฐ ์ญํ ์ ํ์ต๋๋ค. ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋์์ธ์ ๋ค๋ฌ๋ ๋์ ๊ณ์ํด์ ๊ทํ์ ์๊ฒฌ์ ๋ฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ฆ ์ฌํ์ด์์ต๋๋ค :D
System.Collections.Generic.PriorityQueue<TElement, TPriority>
๋ํ API๊ฐ ์น์ธ๋์์ต๋๋ค. ์ฐ์ ์์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ์ ์ฌ์ ์ธ ํ ๊ตฌํ์ ๋ํ ๋ํ๋ฅผ ๊ณ์ํ๊ธฐ ์ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ด๋ฒ ํธ๋ฅผ ๋ง์น๊ฒ ์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋๊ตฐ๊ฐ๊ฐ ์ด ์ฌํ์ ๋ํด ๊ธ์ ์ธ ์ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค! ํ๋์ API์ ๋ํด ์ด 6๋ . :) ๊ธฐ๋ค์ค๋ฅผ ํ๋ํ ๊ธฐํ๊ฐ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ leetcode๋ฅผ ์ํํ๊ธฐ ์ํ ํ์ ์์์ ๋๋ค.
๋ ๋ง์ leetcode, ๋ ๋ง์ C# ์ฝ๋ ์ธํฐ๋ทฐ๋ ๋ ๋ง์ C# ๊ฐ๋ฐ์๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ ๋ง์ ๊ฐ๋ฐ์๋ ๋ ๋์ ์ํ๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ ๋์ ์ํ๊ณ๋ ์ฐ๋ฆฌ๊ฐ ๋ด์ผ C#์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ฝํ์๋ฉด ์ด๊ฒ์ ๊ธฐ๋ฅ์ผ ๋ฟ๋ง ์๋๋ผ ๋ฏธ๋์ ๋๋ค. ์ด๊ฒ์ด ์ด์๊ฐ '๋ฏธ๋'๋ก ๋ถ๋ฅ๋๋ ์ด์ ์ ๋๋ค.