Runtime: PriorityQueue ์ถ”๊ฐ€<t>์ปฌ๋ ‰์…˜์œผ๋กœ</t>

์— ๋งŒ๋“  2015๋…„ 01์›” 30์ผ  ยท  318์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

corefxlab repo์—์„œ ์ตœ์‹  ์ œ์•ˆ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‘ ๋ฒˆ์งธ ์ œ์•ˆ ์˜ต์…˜

https://github.com/dotnet/corefx/issues/574#issuecomment -307971397์—์„œ ์ œ์•ˆ

๊ฐ€์ •

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์š”์†Œ๋Š” ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ๋ชฉ์˜ 'ํ•ธ๋“ค'์„ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์ฒซ ๋ฒˆ์งธ/์ „์ฒด์— ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

Queue<T> ( MSDN ๋งํฌ )

API

```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์šฐ์„ ์ˆœ์œ„ ์„ ํƒ๊ธฐ, IComparer๋น„๊ต);

public Func<TElement, TPriority> PrioritySelector { get; }

public void Enqueue(TElement element);
public void Update(TElement element);

}
````

์—ด๋ฆฐ ์งˆ๋ฌธ:

  1. ํด๋ž˜์Šค ์ด๋ฆ„ PriorityQueue ๋Œ€ Heap
  2. IHeap ๋ฐ ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๋„์ž…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋‚˜?)
  3. IPriorityQueue ์†Œ๊ฐœ ? (๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ ค์•ผ ํ• ๊นŒ์š” - IDictionary ์˜ˆ์‹œ)
  4. ์„ ํƒ๊ธฐ ์‚ฌ์šฉ(๊ฐ’ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์šฐ์„  ์ˆœ์œ„) ์—ฌ๋ถ€(5๊ฐœ์˜ API ์ฐจ์ด)
  5. (TElement element, TPriority priority) ๋Œ€ KeyValuePair<TPriority, TElement> ํŠœํ”Œ ์‚ฌ์šฉ

    • Peek ๋ฐ Dequeue ์—๋Š” ํŠœํ”Œ ๋Œ€์‹  out ์ธ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

  6. 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์˜ ์ผ๋ถ€๋กœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ API

``` C#
๋„ค์ž„์ŠคํŽ˜์ด์Šค System.Collections.Generic
{
///


/// ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ์ œ๊ฑฐ๋˜๋Š” ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
///

///ํ์˜ ์š”์†Œ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
[DebuggerDisplay("์นด์šดํŠธ = {count}")]
[DebuggerTypeProxy(typeof(System_PriorityQueueDebugView<>))]
๊ณต๊ฐœ ํด๋ž˜์Šค PriorityQueue: IEnumerable, ICollection, IEnumerable, IReadOnlyCollection
{
///
/// ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์—…
/// ๊ธฐ๋ณธ ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
///

๊ณต๊ฐœ ์šฐ์„  ์ˆœ์œ„ ํ();

    /// <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) | |

  • System.Comparison์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€ ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋“œ๋Œ€๋ฆฌ์ž๋Š” ๋‹จ์ˆœํ™”๋œ API ๋…ธ์ถœ ์˜์—ญ์„ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค..Create ํ•จ์ˆ˜ ๋˜๋Š” Lambda ํ‘œํ˜„์‹์„ IComparer๋กœ ๋ณ€ํ™˜ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ์ผํšŒ์„ฑ ํž™ ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • System.Collections.Generic์€ ์•„์ง corefx์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ ๋™์•ˆ ์ด ํด๋ž˜์Šค๋ฅผ corefxlab์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. System.Collections.Generic์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ธฐ๋ณธ corefx ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ƒํƒœ๊ฐ€ ์‹คํ—˜์  API์—์„œ ๊ณต์‹ API๋กœ ์Šน๊ฒฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
  • Count๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ถ”๊ฐ€ ์„ฑ๋Šฅ ํŒจ๋„ํ‹ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— IsEmpty ์†์„ฑ์€ ํฌํ•จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋Œ€๋ถ€๋ถ„์€ IsEmpty๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ICollection์˜ IsSynchronized ๋ฐ SyncRoot ์†์„ฑ์€ ์‚ฌ์‹ค์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ System.Collection.Generic ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด๋„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • Dequeue ๋ฐ Peek์€ System.Collections.Queue์˜ ์„ค์ •๋œ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์„ ๋•Œ InvalidOperationException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค..
  • IProducerConsumerCollection๋ฌธ์„œ์— ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ด๋ฆฐ ์งˆ๋ฌธ

  • foreach๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ GetEnumerator๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ ์ถ”๊ฐ€ ํž™ ํ• ๋‹น์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์ฒฉ๋œ ๊ณต๊ฐœ ์—ด๊ฑฐ์ž ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • CopyTo, ToArray ๋ฐ GetEnumerator๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์šฐ์„  ์ˆœ์œ„(์ •๋ ฌ๋œ) ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๋ถ€ ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ๊ฐ€์ •์€ ๋‚ด๋ถ€ ์ฃผ๋ฌธ์ด ์ถ”๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ์•„๋‹Œ "์ •๋ ฌ๋œ ๋Œ€๊ธฐ์—ด"๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” ์ž ์žฌ์ ์ธ ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • PriorityQueue๋ผ๋Š” ํ˜•์‹์„ System.Collections.Generic์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ ๊ณ ์œ ํ•œ ์šฐ์„  ์ˆœ์œ„ ํ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์†Œ์Šค ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • IComparer์˜ ์ถœ๋ ฅ์— ๋”ฐ๋ผ ํ•ญ๋ชฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋Œ€๊ธฐ์—ด์—์„œ ๋นผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.? (๋‚ด ๊ฐ€์ •์€ IComparer์˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ ฌ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์˜ค๋ฆ„์ฐจ์ˆœ์ž…๋‹ˆ๋‹ค.).
  • ์ปฌ๋ ‰์…˜์ด '์•ˆ์ •์ '์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, IComparison์ด ๋™์ผํ•œ ๋‘ ํ•ญ๋ชฉ์ด๊ฒฐ๊ณผ๋Š” ๋Œ€๊ธฐ์—ด์— ๋„ฃ์€ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ˆœ์„œ๋กœ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๊นŒ? (๋‚ด ๊ฐ€์ •์€ ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค)

    ์—…๋ฐ์ดํŠธ

  • 'IEnumerable์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ'์˜ ๋ณต์žก์„ฑ์„ ฮ˜(n)์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. @svic๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • IComparer์™€ ๋น„๊ตํ•˜์—ฌ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค..
  • ์ƒˆ๋กœ์šด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ System.Collection.Generic ํ˜•์‹์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋ช…์‹œ์  SyncRoot ์†์„ฑ์—์„œ NotSupportedException์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์šฉ GetEnumerator ๋ฉ”์„œ๋“œ๊ฐ€ IEnumerable ๋Œ€์‹  ์ค‘์ฒฉ๋œ Enumerator ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค., ๊ธฐ์กด System.Collections.Generic ์œ ํ˜•๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ foreach ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํž™(GC) ํ• ๋‹น์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค.
  • ComVisible ์†์„ฑ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Clear์˜ ๋ณต์žก๋„๋ฅผ ฮ˜(n)์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. @mbeidler๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
api-needs-work area-System.Collections wishlist

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํž™ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” leetcode๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
๋” ๋งŽ์€ leetcode, ๋” ๋งŽ์€ C# ์ฝ”๋“œ ์ธํ„ฐ๋ทฐ๋Š” ๋” ๋งŽ์€ C# ๊ฐœ๋ฐœ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋Š” ๋” ๋‚˜์€ ์ƒํƒœ๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋” ๋‚˜์€ ์ƒํƒœ๊ณ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‚ด์ผ C#์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ์ด๊ฒƒ์€ ๊ธฐ๋Šฅ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฏธ๋ž˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด์Šˆ๊ฐ€ '๋ฏธ๋ž˜'๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  318 ๋Œ“๊ธ€

| ์šด์˜ | ๋ณต์žก์„ฑ |
| --- | --- |
| IEnumerable์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๊ธฐ | ฮ˜(๋กœ๊ทธ n) |

๋‚˜๋Š” ์ด๊ฒƒ์ด ฮ˜(n)์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ตœ์†Œํ•œ ์ž…๋ ฅ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1

Rx์—๋Š” ๊ณ ๋„๋กœ ํ”„๋กœ๋•์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Core/Reactive/Internal/PriorityQueue.cs

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 ์ข‹์€ ํ”ผ๋“œ๋ฐฑ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

  • ์—ด๊ฑฐ์ž๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค..Reset์€ ์—ด๊ฑฐ์ž์˜ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ์ถœ ์—ฌ๋ถ€๋Š” ์ปฌ๋ ‰์…˜ ์œ ํ˜• ๊ฐ„์— ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์†Œ์ˆ˜๋งŒ์ด ๋ช…์‹œ์  ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • _index๋ฅผ ์œ„ํ•ด _disposed ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋‚  ๋ฐค ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์— ๊ทธ๊ฒƒ์„ ๋˜์กŒ๊ณ  ๋ช…๋ฐฑํ•œ ๊ฒƒ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ด์ „ System.Collections.Generic ํ˜•์‹์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์ตœ์‹  ์ปฌ๋ ‰์…˜ ํ˜•์‹์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ObjectDisposedException์„ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Array.Empty๋Š” F# ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์Šฌํ”„๊ฒŒ๋„ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!
  • null์„ ํ—ˆ์šฉํ•˜๋„๋ก ๋น„๊ต๊ธฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค!
  • ToArray ์ตœ์ ํ™”๋Š” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. _๊ธฐ์ˆ ์ ์œผ๋กœ_ ๋งํ•ด์„œ ๋ฐฐ์—ด์€ ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋„ C#์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ํ• ๋‹น์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋ถ€์ž‘์šฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ข€ ๋” ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ์ƒ ํ˜ธ์ถœ์ž๋Š” ์—ฌ์ „ํžˆ ํ•ด๋‹น ํ• ๋‹น์„ ๊ธฐ๋Œ€ํ•˜๋ฉฐ ์ด๋Š” ์‚ฌ์†Œํ•œ ํ• ๋‹น์ž…๋‹ˆ๋‹ค.

@์—๋น„ํด

Array.Empty๋Š” F# ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์Šฌํ”„๊ฒŒ๋„ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

๋” ์ด์ƒ: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Array.cs#L1060 -L1069

issue-574 ๋ธŒ๋žœ์น˜์˜ eickle/corefx ๋กœ ์ฝ”๋“œ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Array.Empty ๊ตฌํ˜„() ๋ณ€๊ฒฝํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์ผ๋ฐ˜ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์•ฝ๊ฐ„์˜ ์ผ์‹œ์ ์ธ ๋ฌธ์ œ๋Š” System.Collections ํ”„๋กœ์ ํŠธ๊ฐ€ Comparer๋กœ System.Collections nuget ํŒจํ‚ค์ง€์— ์ข…์†๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.์•„์ง ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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 ํŒ€์—์„œ ์ด๋Ÿฌํ•œ ์Šคํƒ€์ผ์˜ ๊ตฌํ˜„์„ ์„ ํƒํ•œ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ๋ชฉ๋ก์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค., ๋Œ€๊ธฐ ์ค„, Queue ๋ฐ ArrayList - ์ œ๊ฑฐ/๋Œ€๊ธฐ์—ด์—์„œ ๋‚ด๋ถ€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ถ•์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Enqueue๋Š” null์„ ์ง€์›ํ•ด์•ผ ํ•˜๋ฉฐ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์•„์ง ๊ทธ ์ง€์—ญ์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์˜์—ญ์ด ์–ผ๋งˆ๋‚˜ ๊ฒฌ๊ณ ํ•œ์ง€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š๋Š”๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ @svick ์ด ๋งํฌํ•œ ์ฐธ์กฐ ์†Œ์Šค์—์„œ Queue<T> _ShrinkThreshold ๋ผ๋Š” ์ด๋ฆ„์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐœ์ธ ์ƒ์ˆ˜๊ฐ€ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ ๋™์ž‘์€ ์ด์ „ ๋ฒ„์ „์— ์กด์žฌํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Contains ๊ตฌํ˜„์—์„œ Equals IComparer ๋Œ€์‹  https://gist.github. com/mbeidler/9e9f566ba7356302c57e

@mbeidler ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. MSDN์— ๋”ฐ๋ฅด๋ฉด IComparer/ I๋น„๊ต ๊ฐ€๋Šฅ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ์—๋งŒ ์ •๋ ฌ ์ˆœ์„œ๊ฐ€ ๋™์ผํ•จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. SortedList์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์—ฌ์ „ํžˆ ContainsKey์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. SortedList์˜ ๊ตฌํ˜„.ContainsKey๋Š” Array.BinarySearch๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ IComparer์— ์˜์กดํ•˜์—ฌ ๊ฐ™์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. SortedSet๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค..

ํ‹€๋ฆผ์—†์ด ๊ธฐ์กด ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์˜ ๋ฒ„๊ทธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด๊ณ  IComparer๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋™๋“ฑ์„ฑ์„ ๋ณ„๋„๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ๋งž์•„์š”. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๊ฒฝ์šฐ ํ‰๋“ฑ๊ณผ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ์‚ฌ์šฉ์ž ์ง€์ • ์ˆœ์„œ ์ง€์ • ๋™์ž‘์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํฌํฌ ๋ถ„๊ธฐ์— ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฐ‹ํ–ˆ์Šต๋‹ˆ๋‹ค. Contains์˜ ์ƒˆ๋กœ์šด ๊ตฌํ˜„์€ List์˜ ๋™์ž‘์„ ์ง์ ‘ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค..ํฌํ•จ. ๋ชฉ๋ก ์ดํ›„IEqualityComparer๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋™์ž‘์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ๋˜๋ฉด ๋‹ค๋ฅธ ๋‚ด์žฅ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํšŒ๊ท€ ๋™์ž‘์œผ๋กœ ์ธํ•ด ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ตœ์†Œํ•œ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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 ์ œ์•ˆ์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: PriorityQueueIReadOnlyCollection์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.๋Œ€๊ธฐ์—ด๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด(๋Œ€๊ธฐ ์ค„์ด์ œ 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> ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ์„  ์ˆœ์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ์€ T ๋กœ๋งŒ ์•”์‹œ๋ฉ๋‹ˆ๋‹ค.
  2. ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? (๊ฝค ํŽธ๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

๋…ธํŠธ:

  • ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ API๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ธฐ์—ด์— Remove ๋ฐ Add ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์— ๋ช…ํ™•ํ•œ ๊ณ ๊ฐ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ(์œ ํ˜•์„ ์›ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐ”๋žŒ) ์„ฑ๋Šฅ, ์‚ฌ์šฉ์„ฑ, ๋‹ค๋ฅธ ๋ฌด์—‡์„ ์œ„ํ•ด ์ตœ์ ํ™”ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ CoreFX์— ์žˆ์œผ๋ฉด ์ •๋ง ์œ ์šฉํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ์„ ์žก๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™์— ๊ณ ์ •์‹œํ‚ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ AlgoKit ์œ„ํ‚ค ํŽ˜์ด์ง€ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋น ๋ฅธ ์ƒ๊ฐ:

  • ๊ตฌํ˜„์„ ํŠน์ • ์œ ํ˜•์˜ ํž™์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ 4-ary ํž™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ผ๋ถ€ ์œ ํ˜•์˜ ํž™์ด ๋‹ค๋ฅธ ์œ ํ˜•๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๋ฏ€๋กœ ํž™ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌํ˜„์„ ํŠน์ • ํž™ ์œ ํ˜•์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ๊ณ ๊ฐ์ด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์œ ํ˜•์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ ๊ฐ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ „์ฒด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ํ‹€๋ ธ์–ด์š”. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ๋” ์œ ์—ฐํ•ด์•ผ ํ•˜๊ณ  ๊ทธ๊ฐ€ CoreFX ์ฝ”๋“œ์˜ ์ผ๋ถ€(์ ์–ด๋„ ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋…„์— ๋ช‡ ๊ฐ€์ง€ ํž™ ์œ ํ˜•์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” IHeap ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์™œ ๊ทธ๋ƒฅ ํž™์ด๋ผ๊ณ  ํ•˜์ง€...? ํž™์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ €๋Š” IHeap ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์€ ๊ตฌํ˜„(์ ์–ด๋„ ํ•ด๋‹น ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜)์„ ์†Œ๊ฐœํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. API ๋ฐ ๊ตฌํ˜„์€ ์œ„์—์„œ ๋งํฌํ•œ ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ _์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด_์ด ์—†์Šต๋‹ˆ๋‹ค. ํž™ .

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

@karelz @safern @danmosemsft

@pgolebiowski ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์ด ์ข‹์€ API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ์Œ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. PriorityQueue (์ปดํ“จํ„ฐ ๊ณผํ•™ ์šฉ์–ด๋กœ ์ •๋ฆฝ๋œ)๋ฅผ ์›ํ•˜๋ฉด ๋ฌธ์„œ์—์„œ / ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๊ตฌํ˜„์ด ํž™(๊ฐœ์ธ์ ์œผ๋กœ ์™œ ๊ทธ๋Ÿฐ์ง€ ๊ถ๊ธˆํ•จ)์ด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ๋ณด๋‹ค ์ธก์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์ž…์ฆํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด(์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๋„ ์–ด๋Š ์ •๋„ ์ค‘์š”ํ•œ ๋ฉ”ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ์—ฌ์ „ํžˆ ํž™ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„( IHeap API ์ œ์™ธ)์ด ์ผ๋ถ€ ๊ฐ„๋‹จํ•œ ๋ชฉ๋ก ๊ธฐ๋ฐ˜ ๋˜๋Š” ๋ฐฐ์—ด ๋ชฉ๋ก ์ฒญํฌ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค(๋ช‡ ๋ฌธ์žฅ/๋‹จ๋ฝ ์ด์ƒ์ ์œผ๋กœ๋Š” ), ๊ตฌํ˜„ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(PR ๊ฒ€ํ†  ์‹œ ๊ฑฐ์ ˆ๋  ์ˆ˜ ์žˆ๋Š” ๋ณต์žกํ•œ ๊ตฌํ˜„์— ์‹œ๊ฐ„ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€).

๋“œ๋กญ ICollection , IEnumerable ? ์ผ๋ฐ˜ ๋ฒ„์ „๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ IEnumerable<T> ๋Š” IEnumerable ).

@pgolebiowski ๊ตฌํ˜„์ด ์™ธ๋ถ€ API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•. PriorityQueue ๋Š” ํ–‰๋™/๊ณ„์•ฝ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Heap ๋Š” ํŠน์ • ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋Œ€ ํž™

๊ธฐ๋ณธ ๊ตฌํ˜„์ด ํž™(๊ฐœ์ธ์ ์œผ๋กœ ์™œ ๊ทธ๋Ÿฐ์ง€ ๊ถ๊ธˆํ•จ)์ด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ๋ณด๋‹ค ์ธก์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์ž…์ฆํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด(์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๋„ ์–ด๋Š ์ •๋„ ์ค‘์š”ํ•œ ๋ฉ”ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ์—ฌ์ „ํžˆ ํž™ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•œ ๋ชฉ๋ก ๊ธฐ๋ฐ˜ ๋˜๋Š” ๋ฐฐ์—ด ๋ชฉ๋ก ์ฒญํฌ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์—ฌ(์ด์ƒ์ ์œผ๋กœ๋Š” ๋ช‡ ๋ฌธ์žฅ/๋‹จ๋ฝ์œผ๋กœ) ๊ตฌํ˜„ ๋ฐฉ์‹ [...]

์ข‹์•„์š”. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํž™๊ณผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ:

  • ์šฐ์„  ์ˆœ์œ„ ํ์™€ ํž™์€ ์ข…์ข… ๋™์˜์–ด๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (์ด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ์˜ˆ๋Š” ์•„๋ž˜ Python ๋ฌธ์„œ ์ฐธ์กฐ).
  • ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ "์šฐ์„ ์ˆœ์œ„ ํ" ์ง€์›์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ํž™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜์˜ ๋ชจ๋“  ์˜ˆ ์ฐธ์กฐ).

๋‚ด ๋ง์„ ๋’ท๋ฐ›์นจํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ก ์  ์ง€์›๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์†Œ๊ฐœ , Cormen:

[...] ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ์ตœ๋Œ€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด๊ณผ ์ตœ์†Œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” max-heap์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” max-priority ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ํž™์ž„์„ ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก  ์ง€๋ฆ„๊ธธ์ด์ง€๋งŒ ์•„์ด๋””์–ด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋…ผ์˜ ์ค‘์ธ ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Java: PriorityQueue<T> โ€” ํž™์œผ๋กœ ๊ตฌํ˜„๋œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด.
  • Rust: BinaryHeap โ€” API์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํž™์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™์œผ๋กœ ๊ตฌํ˜„๋œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค
  • Swift: CFBinaryHeap โ€” ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ "์šฐ์„ ์ˆœ์œ„ ํ"๋ผ๋Š” ์ถ”์ƒ์  ์šฉ์–ด์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ: ์ด์ง„ ํž™์€ ์šฐ์„  ์ˆœ์œ„ ํ๋กœ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.
  • C++: priority_queue โ€” ๋‹ค์‹œ ํ•œ ๋ฒˆ, ๋ฐฐ์—ด์˜ ๋งจ ์œ„์— ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™์œผ๋กœ ์ •์‹ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Python: heapq โ€” ํž™์ด API์— ๋ช…์‹œ์ ์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ๋ฌธ์„œ์—์„œ๋งŒ ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ํž™ ๋Œ€๊ธฐ์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Go: heap package โ€” ํž™ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ์—†์ง€๋งŒ ๋‹ค์‹œ ๋ฌธ์„œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํž™์€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๊ตฌํ˜„ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ Rust/Swift/Python/Go ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์„œ ๋ช…์‹œ์ ์œผ๋กœ ํž™์„ ๋…ธ์ถœ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์œผ๋ฉฐ ๋ฌธ์„œ์—์„œ ์šฐ์„  ์ˆœ์œ„ ํ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ณ  API๊ฐ€ ๋ฏธ๋ž˜์— ํ–ฅ์ƒ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์–ด๋–ค ์ธก๋ฉด์—์„œ ๋” ๋‚˜์€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ๋กญ๊ณ  ํ˜์‹ ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋‚ธ๋‹ค๋ฉด(๊ทธ๋ฆฌ๊ณ  ์„ ํƒ ํž™ ๋Œ€ ์ƒˆ๋กœ์šด ์œ ํ˜•์€ ๋‹ค์Œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค), API๋Š” ์—ฌ์ „ํžˆ ์†์ƒ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ƒˆ๋กœ์šด ํ˜์‹ ์ ์ธ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ํž™ ํด๋ž˜์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•ˆ์ •์ ์ธ์ง€ ๊ถ๊ธˆํ•ดํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ๋”ฐ๋ฅด๋Š” ์†”๋ฃจ์…˜์ด ์šฐ์„ ์ˆœ์œ„ ํ์ธ ๊ฒฝ์šฐ ์ด๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์šฉ์–ด๋Š” ์ถ”์ƒ์ ์ด๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์•„๋ž˜์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ํž™์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ •์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ API๋ฅผ ํ†ตํ•ด ์ด๊ฒƒ์ด ํž™์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•จ์œผ๋กœ์จ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํž™ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๊ณ  ๋ฌธ์„œ์—์„œ๋งŒ ์šฐ์„  ์ˆœ์œ„ ํ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

API ๋ฐ ๊ตฌํ˜„

์šฐ๋ฆฌ๋Š” ์œ„์˜ ๋ฌธ์ œ์— ๋™์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ฃผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• . ์—ฌ๊ธฐ์—์„œ ๋‘ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 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 ํž™, ์ˆœ์œ„ ์Œ ํž™, ์ง€์ง„ ํž™, ์œ„๋ฐ˜ ํž™, ์ˆœ์œ„ ์™„ํ™”๋œ ์•ฝํ•œ ํž™ ๋ฐ ์—„๊ฒฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ํž™ ์ค‘์—์„œ ๋‹ค์Œ ์œ ํ˜•์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

    • ์•”์‹œ์  d-ary ํž™(ArrayHeap), <- ํ™•์‹คํžˆ ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ํž™ ํŽ˜์–ด๋ง, <- ๋ฉ‹์ง€๊ณ  ๊น”๋”ํ•œ 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 ๋Œ€ํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค . ์—„์ฒญ๋‚œ ์ฐจ์ด.
  • ํ† ๋ก ์€ ๋ฉ‹์ง„ ์ด๋ฆ„์„ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠน์ • ๋””์ž์ธ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค.
  • ํ•ด์‹œ ํ…Œ์ด๋ธ” , ArrayList . ๊ทธ๋“ค์€ ์กด์žฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. BTW, "๋ชฉ๋ก"์€ IMO ์ด๋ฆ„ ์ง€์ •์— ์žˆ์–ด ๋งค์šฐ ์ž˜๋ชป๋œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ 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 ์˜ ํ”Œ๋žซํผ ํ˜ธํ™˜์„ฑ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ "ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋ชฉ๋ก์€ ๋ชฉ๋ก์ด์ง€๋งŒ ๋ชฉ๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์‹œํ€€์Šค๋ผ๊ณ ๋„ ํ•˜๋Š” ๋ชฉ๋ก(์ถ”์ƒ ๋ฐ์ดํ„ฐ ์œ ํ˜•) ์ž…๋‹ˆ๋‹ค.

๋™๋“ฑ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์€ ์‚ฌ์šฉ ์‹œ ๋‹ฌ์„ฑํ•œ ๋‚ด์šฉ์„ ์•Œ๋ ค์ฃผ๋Š” ์ถ”์ƒ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์‹œ ์ˆ˜ํ–‰ ๋ฐฉ์‹์ด ์•„๋‹˜(๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)

๋งŽ์€ ํ›Œ๋ฅญํ•œ ํ† ๋ก !

์›๋ž˜ ์‚ฌ์–‘์€ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฒ”์šฉ - CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„ ๊ฐ„์˜ ๊ท ํ˜•์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  • System.Collections.Generic์˜ ๊ธฐ์กด ํŒจํ„ด ๋ฐ ๊ทœ์น™์— ์ตœ๋Œ€ํ•œ ๋งž์ถฐ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ์š”์†Œ์˜ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด BCL ๋น„๊ต ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํด๋ž˜์Šค(์˜ˆ: Comparer).*
  • ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™” - ์ด ์‚ฌ์–‘์€ ๊ธฐ๋ณธ ๊ตฌํ˜„ ๊ธฐ์ˆ ๋กœ๋ถ€ํ„ฐ ์†Œ๋น„์ž๋ฅผ ๋ณดํ˜ธํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@karelz @pgolebiowski
"ํž™"์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ตฌํ˜„์— ๋งž์ถฐ ์ •๋ ฌ๋œ ๋‹ค๋ฅธ ์šฉ์–ด๋Š” ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ BCL ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ .NET ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ/ํŒจํ„ด์— ์ค‘์ ์„ ๋‘์ง€ ์•Š๊ณ  ๋ฒ”์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์›๋ž˜ ์ƒ๊ฐ์€ .NET ์—์ฝ”์‹œ์Šคํ…œ ์ดˆ๊ธฐ์— API ๋””์ž์ด๋„ˆ๊ฐ€ ์˜๋„์ ์œผ๋กœ "ArrayList"์—์„œ "List"๋กœ ์ด๋™ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.". ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์–ด๋ ˆ์ด์™€์˜ ํ˜ผ๋™์œผ๋กœ ์ธํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž๋Š” "ArrayList? ๋‚˜๋Š” ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ชฉ๋ก์„ ์›ํ•ฉ๋‹ˆ๋‹ค."

ํž™์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋Š” (์Šฌํ”„๊ฒŒ๋„) "ํž™"์„ ๋ณด๊ณ  "์ผ๋ฐ˜ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํž™"ํ•˜๋Š” ๋Œ€์‹  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ํž™(์˜ˆ: ํž™ ๋ฐ ์Šคํƒ)์œผ๋กœ ํ˜ผ๋™ํ•ฉ๋‹ˆ๋‹ค. System.Collections.Generic์˜ ๋ณด๊ธ‰์œผ๋กœ ์ธํ•ด ๊ฑฐ์˜ ๋ชจ๋“  .NET ๊ฐœ๋ฐœ์ž์˜ ์ง€๋Šฅ์ ์ธ ์ œ์•ˆ์— ๋‚˜ํƒ€๋‚˜๋ฉฐ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ ํž™์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ๊ถ๊ธˆํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์ด์— ๋น„ํ•ด PriorityQueue๋Š” ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ณ  ํ˜ผ๋™์„ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค. "Queue"๋ฅผ ์ž…๋ ฅํ•˜๊ณ  PriorityQueue์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์ˆ˜ ์šฐ์„  ์ˆœ์œ„ ๋˜๋Š” ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜(TKey, Tpriority ๋“ฑ)์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ ๋ฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์  ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์†Œ๋น„์ž๊ฐ€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋งคํ•‘ํ•˜๊ณ  API์˜ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ž์ฒด ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ IComparer ์‚ฌ์šฉ๊ธฐ์กด BCL ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  Comparer์— ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.์ž„์‹œ ๋žŒ๋‹ค ์‹/์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์šฐ์„  ์ˆœ์œ„ ๋น„๊ต๋กœ ๋” ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์–‘์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์Šฌํ”„๊ฒŒ๋„ ๊ทธ๊ฒƒ์€ BCL์˜ ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์ด ๊ณ ์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Enqueue()๋Š” ArgumentException์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ณ ์œ ์„ฑ ์กฐํšŒ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ญ๋ชฉ์„ ๋‘ ๋ฒˆ ์ด์ƒ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์œ ํšจํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋น„๊ณ ์œ ์„ฑ ๋””์ž์ธ์€ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Update() ์ž‘์—…์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๊ฒƒ์€ "๋…ธ๋“œ" ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API์— ๋“ค์–ด๊ฐ€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ํ•„์š”ํ•œ ํ• ๋‹น์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒฝ์šฐ์—๋„ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์š”์†Œ๋‹น ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๋•Œ ์‚ฌ์–‘์„ ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— API์— ์‚ฌ์šฉ์ž ์ง€์ • IpriorityQueue ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ชฉํ‘œ๋กœ ํ–ˆ๋˜ ์‚ฌ์šฉ ํŒจํ„ด์€ Enqueue, Dequeue ๋ฐ Iterate์˜€์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค ์„ธํŠธ์—์„œ ์ด๋ฏธ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋Œ€๊ธฐ์—ด๋กœ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ํ•ญ๋ชฉ์ด IComparer๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€๊ธฐ์—ด์—์„œ ์ž์ฒด(์ดˆ๊ธฐ) ์œ„์น˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•œ, ํ˜ธ์ถœ์ž๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•œ ์ด์ „ ์ฐธ์กฐ ๊ตฌํ˜„์—์„œ (์ œ ๊ธฐ์–ต์ด ๋งž๋‹ค๋ฉด!) ์šฐ์„  ์ˆœ์œ„๋Š” ์ „ํ˜€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ IComparer๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.๋˜๋Š” ๋น„๊ต.

์ผ๋ถ€ ๊ณ ๊ฐ ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ๋ชจ๋‘ ๊ท€ํ•˜์—๊ฒŒ ๋นš์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ๊ณ„ํš์€ ์˜ˆ์ œ์˜ ๊ธฐ์ดˆ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด PriorityQueue์˜ ๊ธฐ์กด BCL ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝ API์—์„œ ๋น„๊ต๋Š” ์ œ๊ณต๋œ ๋น„๊ต์ž IComparer์— ์˜ํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.๋น„๊ต์ž, ๋ž˜ํผ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์ข… ์šฐ์„  ์ˆœ์œ„๋Š” ์œ ํ˜•์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ๊ฐ„ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์œ ํ˜•์˜ ์†์„ฑ์œผ๋กœ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ OP API์—์„œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฏธ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ์„  ์ˆœ์œ„ ๊ฐ’์ด ํฌํ•จ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์œ ํ˜•์„ ๋ž˜ํ•‘ํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜•์‹์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • IComparer๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ ค๋Š” ๊ฐ’์ด ์ด๋ฏธ ์œ ํ˜•์— ์˜ํ•ด ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด์ค‘ํ˜• 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์— ๊ฐ„๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋Œ€๋ฉด์€API ์Šคํƒ€์ผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์œ ํ˜•์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ์ „์— ๋‚ด๋ถ€ ScheduledTask ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๋งค์šฐ ๊ฐ€๋ฒผ์šด ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ScheduledTask๋Š” IComparer๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์— ๋˜์ง€์‹ญ์‹œ์˜ค. ์ข‹์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ๋œ ๋ชฉ๋กํ‚ค/๊ฐ’ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ "๋ชฉ๋ก์— ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” N๊ฐœ์˜ ๊ฐ’์ด ์žˆ๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€๋” ๊ฐ’์ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. "ํ‚ค"๋Š” ํ•ด๋‹น ๋ฐฉ์ •์‹์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ชฉ๋ก์€ ์‚ฌ์ „์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋™์ผํ•œ ์›์น™์ด ๋Œ€๊ธฐ์—ด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ๋Š” ์—ญ์‚ฌ์ ์œผ๋กœ 1์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๋‚ด ํ˜„๋Œ€ C++ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์‹์€ ์•ฝ๊ฐ„ ๋…น์Šฌ์—ˆ์ง€๋งŒ std::priority_queue์กฐ์ฐจ๋„ ํ‘ธ์‹œ, ํŒ ๋ฐ ๋น„๊ต์ž๋ฅผ ํ…œํ”Œ๋ฆฟ(์ผ๋ฐ˜) ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒ€์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

๋ฐฉ๊ธˆ ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์šฐ์„ ์ˆœ์œ„ ํ์™€ ํž™ ๊ตฌํ˜„์„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์Šค์บ”ํ–ˆ์Šต๋‹ˆ๋‹ค. C++, Java, Rust ๋ฐ Go๋Š” ๋ชจ๋‘ ๋‹จ์ผ ์œ ํ˜•์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์— ๊ฒŒ์‹œ๋œ ์›๋ž˜ API์™€ ์œ ์‚ฌ). NPM์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํž™/์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„์„ ์–ผํ• ๋ณด์•„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@pgolebiowski ๋Š” ํŠน์ • ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…๋ช…๋œ ํŠน์ • ๊ตฌํ˜„์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์˜คํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์›ํ•˜๋Š” ์„ฑ๋Šฅ ๋ชฉํ‘œ์™€ ์ผ์น˜ํ•˜๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ๊ณ  ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ˆ์ถฉ์•ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ ์ปฌ๋ ‰์…˜์€ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘์„ ์›ํ•˜๋Š” ์šฉ๋„์˜ 90%๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์ด๋‚˜ ๊ตฌํ˜„์„ ์›ํ•  ๊ฒฝ์šฐ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์ด๋ฆ„์„ ๋”ฐ์„œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ํ•„์š”์— ๋งž๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋™์ž‘ ์œ ํ˜•์„ ํŠน์ • ๊ตฌํ˜„์— ๋ฌถ๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์ด๋ฆ„์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๊ณ  ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

๋…ผ์˜๊ฐ€ ํ•„์š”ํ•œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌธ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์†Œ ์—…๋ฐ์ดํŠธ ๋ฐ ์ œ๊ฑฐ .

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์—์„œ ๋””์ž์ด๋„ˆ๋“ค์€ ๊ทธ๊ฒƒ๋“ค์„ ์ƒ๋žตํ–ˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ:

  1. ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฌ๋Ÿผ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ž์ฒด ๊ตฌํ˜„์„ ๋Œ€์ฒดํ•  ํž™/์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ํƒ€์‚ฌ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฑฐ์˜ ์“ธ๋ชจ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•œ์‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ทธ๋Ÿฐ ๊ธธ์„ ๊ฐ€๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์„๊นŒ? ๊ทธ๋Ÿฐ ๋น„ํ™œ์„ฑํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ๋ถ€๋„๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@pgolebiowski ๋Š” ์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์ตœ์„ ์˜ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๊นจ์ง„ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์‹ค์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์œ ์šฉํ•œ ๊ด€๋ จ ์ •๋ณด(์˜ˆ: ์ž๋ฐ” ์ด์•ผ๊ธฐ)๋ฅผ ๊ณ„์† ๊ฐ€์ ธ์˜ค์„ธ์š”.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ํ•˜๋ฃป๋ฐค ์‚ฌ์ด์— ๋ณ€ํ™”๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋””์ž์ธ ํ† ๋ก ์ž…๋‹ˆ๋‹ค. ํ•ฉ์˜์ ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” API๋ฅผ ์„œ๋‘๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜๊ฒฌ์„ ๊ฒฝ์ฒญํ•˜๊ณ  ๊ณ ๋ คํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์ด ์‹คํ–‰/์ˆ˜์šฉ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์ œ๊ณตํ•˜๊ณ  ๋ฐ์ดํ„ฐ์™€ ์ฆ๊ฑฐ๋กœ ๋’ท๋ฐ›์นจํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฃผ์žฅ์„ ๋“ฃ๊ณ  ์ธ์ •ํ•˜์‹ญ์‹œ์˜ค. ๋‹น์‹ ์ด ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋•Œ๋กœ๋Š” ์–ด๋–ค ์ ์—์„œ ์ด๊ฒฌ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋™์˜ํ•˜์‹ญ์‹œ์˜ค. SW, ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. API ๋””์ž์ธ์€ ํ‘๋ฐฑ/์˜ณ๊ณ  ๊ทธ๋ฆ„์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ํ† ๋ก ์„ ์‹œ๋ฏผ์œผ๋กœ ํ•ฉ์‹œ๋‹ค. ๊ฐ•ํ•œ ๋ง๊ณผ ๋ง์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง™์‹œ๋‹ค. ์€ํ˜œ์— ๋™์˜ํ•˜์ง€ ์•Š๊ณ  ๋…ผ์˜๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ์‹œ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ๊ธฐ์—ฌ์ž ํ–‰๋™ ๊ฐ•๋ น ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” .NET์— ๋Œ€ํ•œ ์—ด์ •์„ ์ธ์‹ํ•˜๊ณ  ์žฅ๋ คํ•˜์ง€๋งŒ ์„œ๋กœ์˜ ๊ธฐ๋ถ„์„ ์ƒํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ์‹œ๋‹ค.
  • ๋””์ž์ธ ํ† ๋ก ์˜ ์†๋„, ๋ฐ˜์‘ ๋“ฑ์— ๊ด€ํ•œ ์šฐ๋ ค/์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์ €์—๊ฒŒ ์ง์ ‘ ์—ฐ๋ฝํ•˜์‹ญ์‹œ์˜ค(์ œ ์ด๋ฉ”์ผ์€ ์ œ GH ํ”„๋กœํ•„์— ์žˆ์Šต๋‹ˆ๋‹ค). ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ณต๊ฐœ์ ์œผ๋กœ ๋˜๋Š” ์˜คํ”„๋ผ์ธ์—์„œ ๊ธฐ๋Œ€, ๊ฐ€์ • ๋ฐ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  ์‹ถ์œผ๋ƒ๊ณ  ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ํ•ฉ์˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์ข‹์€ ์˜๋„๋ฅผ ์˜์‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋•Œ๋กœ๋Š” ์งˆ๋ฌธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ƒ๋Œ€๋ฐฉ์˜ ํ…์ŠคํŠธ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ๊ฐ์ •์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€๋กœ ์ ์œผ๋ฉด ๋‹ค๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ2์™ธ๊ตญ์–ด๋กœ์„œ์˜ ์˜์–ด๋Š” ํ›จ์”ฌ ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๊ทธ๊ฒƒ์„ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์˜คํ”„๋ผ์ธ์—์„œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ฑ„ํŒ…ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค... ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋ฅผ ๊ธฐ์ˆ  ํ† ๋ก ์œผ๋กœ ๋‹ค์‹œ ๋Œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค...

Heap vs. PriorityQueue ๋…ผ์Ÿ์— ๋Œ€ํ•œ ๋‚˜์˜ 2์„ผํŠธ: ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ์œ ํšจํ•˜๋ฉฐ ๋ถ„๋ช…ํžˆ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, "PriorityQueue"๋Š” ๊ธฐ์กด .NET ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ›จ์”ฌ ๋” ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์˜ ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜์€ List์ž…๋‹ˆ๋‹ค., ์‚ฌ์ „, ์Šคํƒ, ๋Œ€๊ธฐ ์ค„, ํ•ด์‹œ์…‹, SortedDictionary, ๋ฐ SortedSet. ์ด๊ฒƒ๋“ค์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ๊ณผ ์˜๋ฏธ๋ฅผ ๋”ฐ์„œ ๋ช…๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œ์…‹์œ ์ผํ•œ ์ด์ƒ๊ฐ’์ด์ง€๋งŒ ์ด๊ฒƒ์กฐ์ฐจ๋„ ์ง‘ํ•ฉ ํ‰๋“ฑ ์˜๋ฏธ๋ก (SortedSet๊ณผ ๋น„๊ตํ•˜์—ฌ)๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ•ฉ๋ฆฌํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.). ๊ฒฐ๊ตญ ์ด์ œ ImmutableHashSet์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด๊ฒƒ์€ ํ›„๋“œ ์•„๋ž˜์˜ ๋‚˜๋ฌด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ปฌ๋ ‰์…˜์ด ์—ฌ๊ธฐ์—์„œ ์ถ”์„ธ๋ฅผ ๊ฑฐ์Šค๋ฅด๋Š” ๊ฒƒ์€ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” PriorityQueue ์ƒ๊ฐ: PriorityQueue(์•„์ดํž™)๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IHeap ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ ํž™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ PrioriryQueue(๋Œ€๋ถ€๋ถ„์˜ C# ์ปฌ๋ ‰์…˜์œผ๋กœ) ์ถ”์ƒ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๊ณ  IpriorityQueue๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.์ธํ„ฐํŽ˜์ด์Šค์ด์ง€๋งŒ @pgolebiowski๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํž™ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค 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> ๋˜๋Š” ์œ ํ˜•์ด ์ด๋ฏธ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ •๋‹นํ™”

  • ๊ฐœ๋ฐœ์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ: ์ข…์†์„ฑ ์—ญ์ „ ์›๋ฆฌ , ์ข…์†์„ฑ ์ฃผ์ž… , ๊ณ„์•ฝ์— ๋”ฐ๋ฅธ ์„ค๊ณ„ , ์ œ์–ด ์—ญ์ „ .
  • ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ํž™ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋„๋ก ์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์€ PowerCollections ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ IHeap ํ•˜๋ฉด ํŽ˜์–ด๋ง ํž™ , ์ดํ•ญ ํž™, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ์‚ฌ๋ž‘ํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ค ์œ ํ˜•์ด ๊ฐ€์žฅ ์ข‹์€์ง€ ์ƒ๊ฐํ•  ํ•„์š” ์—†์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฒ”์šฉ Heap ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 98%์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์œ ์šฉํ•œ ๋งค์šฐ ์ ์ ˆํ•œ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ๊ฐ€์ง„ ๋‹จ์ผ ์„ ํƒ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ .NET ์—์ฝ”์‹œ์Šคํ…œ์˜ ํฐ ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋™์‹œ์— ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๊ณ  ๋ฐœ๊ตดํ•  ์˜ํ–ฅ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ณ ์„ฑ๋Šฅ ํ™•์žฅ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นŠ์ด ๋ฐฐ์šฐ๊ณ  ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค / ๊ต์œก๋ฐ›์€ ์„ ํƒ๊ณผ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.
  • ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ˜„์žฌ ๊ทœ์น™์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

    • ISet ๋ฐ HashSet

    • IList ๋ฐ List

    • IDictionary ๋ฐ Dictionary

  • ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋”ฐ๋ผ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค์˜ ํ–‰๋™์— ๋”ฐ๋ผ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ง€๋ฆ„๊ธธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋งŽ์€ ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ ์ ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์˜ˆ๋Š” ๊ธฐ๋ณธ ์œ ํ˜•, ์—ด๊ฑฐ ์œ ํ˜• ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์›์น™์€ ๋‹จ์ˆœํžˆ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจํ˜ธํ•˜์ง€ ์•Š์Œ). ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์€ Python, Java, C++, Go, Swift ๋˜๋Š” Rust์™€ ๊ฐ™์ด ํ•ญ์ƒ ํž™์œผ๋กœ ์ œ๊ณต๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ํž™์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Heap ๋Š” ์‹ค์ œ๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. Stack , Queue , List ๋ฐ Array ์™€๋„ ์กฐํ™”๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ˜„๋Œ€์ ์ธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Go, Swift, Rust)์—์„œ๋„ ์ด๋ฆ„ ์ง€์ •๊ณผ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ช…์‹œ์ ์œผ๋กœ ํž™์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

@pgolebiowski Heap<T> / IHeap<T> ์ด๋ฆ„์ด Stack<T> , Queue<T> ๋ฐ/๋˜๋Š” List<T> ์•Š์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ด๋ฆ„ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฐœ์ƒํ•˜๋Š” T ๋ฐฐ์—ด).

@SamuelEnglard

Heap ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค ์—๊ฒŒ ํž™ ์ด ํŠน์ • ๊ตฌํ˜„์„ ์ฆ‰์‹œ ๋”ฐ๋ฅด๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋™์ผํ•œ API๋ฅผ ๊ณต์œ ํ•˜๋Š” ํž™์˜ ๋ณ€ํ˜•์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • d-ary ํž™,
  • 2-3 ํž™,
  • ์ขŒํŒŒ ๋”๋ฏธ,
  • ๋ถ€๋“œ๋Ÿฌ์šด ํž™,
  • ์•ฝํ•œ ๋”๋ฏธ,
  • B-ํž™,
  • ๊ธฐ์ˆ˜ ํž™,
  • ๋น„๋šค์–ด์ง„ ๋”๋ฏธ,
  • ํŽ˜์–ด๋ง ํž™,
  • ํ”ผ๋ณด๋‚˜์น˜ ํž™,
  • ์ดํ•ญ ํž™,
  • ์ˆœ์œ„ ํŽ˜์–ด๋ง ํž™,
  • ์ง€์ง„ ๋”๋ฏธ,
  • ์œ„๋ฐ˜ ๋”๋ฏธ.

์šฐ๋ฆฌ๊ฐ€ ํž™์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งค์šฐ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์šฐ๋ฆฌ๊ฐ€ 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
์ปดํ“จํ„ฐ ๊ณผํ•™์˜ ์„ธ๊ณ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€์— ๊ด€ํ•ด์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

  • ๊ตฌํ˜„ : ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์•”์‹œ์  4์ฐจ ํž™
  • ์ถ”์ƒํ™” : 4์ฐจ ํž™
  • ์ถ”์ƒํ™” : ํž™ ํŒจ๋ฐ€๋ฆฌ
  • ์ถ”์ƒํ™” : ์šฐ์„ ์ˆœ์œ„ ํ์˜ ๊ณ„์—ด

๊ทธ๋ฆฌ๊ณ  ์˜ˆ, 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์— ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค).

  • 2๊ฐœ์˜ ๋Œ€์•ˆ ์ œ์•ˆ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ํ•˜๋‚˜๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๊ฐ„๋‹จํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ œ์•ˆํ•œ ๋Œ€๋กœ ํž™์ด ํฌํ•จ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. API ๊ฒ€ํ† ์— ๊ฐ€์ ธ์˜ค๊ณ  ๊ฑฐ๊ธฐ์—์„œ ํ† ๋ก ํ•˜๊ณ  ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ๊ทธ๋ฃน์—์„œ Heaps ์ œ์•ˆ์— ํˆฌํ‘œํ•˜๋Š” ์‚ฌ๋žŒ์ด ํ•œ ๋ช…์ด๋ผ๋„ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์ œ ๊ด€์ ์„ ์žฌ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

... ๋‚ด ์˜๊ฒฌ(๊ท€ํ•˜๊ฐ€ ์š”์ฒญํ•œ)์— ๋Œ€ํ•ด ์™„์ „ํžˆ ํˆฌ๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚™๋‹ดํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฃจ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. API ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.

@karelz

์ด๋ฆ„์€ PriorityQueue ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ฃผ์žฅ? ๊ทธ๋ƒฅ ์•„๋‹ˆ์˜ค ๋ผ๊ณ  ๋งํ•˜๋Š” ๋Œ€์‹  ์œ„์— ๋‚ด๊ฐ€ ์“ด ๊ฒƒ์„ ํ•ด๊ฒฐํ•ด ์ฃผ์‹œ๋ฉด ์ ์–ด๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค .

์ด์ „์— ์ด๋ฆ„์„ ๊ฝค ์ž˜ ์ง€์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. _์ž…๋ ฅ์ด ์žˆ์œผ๋ฉด ์ œ๊ณตํ•˜๊ณ  ๋ฐ์ดํ„ฐ์™€ ์ฆ๊ฑฐ๋กœ ๋’ท๋ฐ›์นจํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฃผ์žฅ์„ ๋“ฃ๊ณ  ์ธ์ •ํ•˜์‹ญ์‹œ์˜ค. ๋‹น์‹ ์ด ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค._

๊ฒŒ๋‹ค๊ฐ€, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์ด๋ฆ„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค . ๊ทธ๋ ‡๊ฒŒ ์–•์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์“ด ๊ธ€์„ ์ฝ์–ด์ฃผ์„ธ์š”. ์ถ”์ƒํ™” ์ˆ˜์ค€ ์‚ฌ์ด์—์„œ ์ž‘์—…ํ•˜๊ณ  ๊ทธ ์œ„์— ์ฝ”๋“œ๋ฅผ ํ–ฅ์ƒ/๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„, ์ด ํ† ๋ก ์—์„œ ๋…ผ์Ÿ์ด ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํž™์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๊ฐ€ (์Šฌํ”„๊ฒŒ๋„) "ํž™"์„ ๋ณด๊ณ  "์ผ๋ฐ˜ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํž™" ๋Œ€์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํž™(์˜ˆ: ํž™ ๋ฐ ์Šคํƒ)์œผ๋กœ ํ˜ผ๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. [...] ๊ทธ๋“ค์€ ์™œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ํž™์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ˜›

์šฐ๋ฆฌ๋Š” IHeap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. IHeap ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค์šฐ ๊ณ ๊ธ‰ ์ „๋ฌธ๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. PowerCollections ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@bendono ๊ฐ€ ์ด์— ๋Œ€ํ•ด ์•„์ฃผ ์ข‹์€ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. @safern ์€ ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„์„ ์ง€์›ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€ ๋”.

๋˜ ๋‹ค๋ฅธ ์ฐธ๊ณ  ์‚ฌํ•ญ -- ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ์ž๋Š” ์•„๋งˆ๋„ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋“ค์€ ์šฐ๋ฆฌ์˜ ๋น„ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ์„ ๊ณ ์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋ฌด์‹œํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ต์…˜์€ ์—†์œผ๋ฉฐ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์šฐ๋ฆฌ ์†”๋ฃจ์…˜์€ ์ „ํ˜€ ํ™•์žฅํ•  ์ˆ˜ ์—†์–ด ์‚ฌ๋žŒ๋“ค ์ด ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋™์ผํ•œ ์•„ํ‚คํ…์ฒ˜ ์ฝ”์–ด์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ๋น„ํ™œ์„ฑํ™”๋œ ์†”๋ฃจ์…˜์ด๋‚˜ ์ผ๋ถ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Java์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํƒ€์‚ฌ ์†”๋ฃจ์…˜์— ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ, ๋‹น์‹ ์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๊นจ์ง„ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ์˜ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ œ์•ˆ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. [...] 2๊ฐœ์˜ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค [...] API ๊ฒ€ํ† ์— ๊ฐ€์ ธ์˜ค๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋…ผ์˜ํ•˜๊ณ  ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์ž. ํ•ด๋‹น ๊ทธ๋ฃน์—์„œ Heaps ์ œ์•ˆ์— ํˆฌํ‘œํ•˜๋Š” ์‚ฌ๋žŒ์ด ํ•œ ๋ช…์ด๋ผ๋„ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์ œ ๊ด€์ ์„ ์žฌ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ API์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • PriorityQueue ๋Œ€ Heap
  • ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€
  • ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐ ์ง€์›

๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค ์ด ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์™œ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํž™์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๊ฐ€ (์Šฌํ”„๊ฒŒ๋„) "ํž™"์„ ๋ณด๊ณ  "์ผ๋ฐ˜ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํž™" ๋Œ€์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํž™(์˜ˆ: ํž™ ๋ฐ ์Šคํƒ)์œผ๋กœ ํ˜ผ๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜, ๋‚˜์•ผ. ์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋…ํ•™์œผ๋กœ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— " Heap "์ด(๊ฐ€) ํ† ๋ก ์— ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋ฌด์Šจ ๋ง์„ ํ–ˆ๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋งํ•  ๊ฒƒ๋„ ์—†์ด ์ปฌ๋ ‰์…˜์˜ ๊ด€์ ์—์„œ "์‚ฌ๋ฌผ ๋”๋ฏธ"๊ฐ€ ๋ชจ๋“  ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋” ์ง๊ด€์ ์œผ๋กœ ์•”์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์ฃผ์žฅ? ๊ทธ๋ƒฅ ์•„๋‹ˆ์˜ค๋ผ๊ณ  ๋งํ•˜๋Š” ๋Œ€์‹  ์œ„์— ๋‚ด๊ฐ€ ์“ด ๊ฒƒ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค๋ฉด ์ ์–ด๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋Œ€๋‹ต์„ ์ฝ์œผ๋ฉด ๋‚ด ์ž…์žฅ์— ๋Œ€ํ•œ ์ฃผ์š” ์ฃผ์žฅ์„ ์–ธ๊ธ‰ํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • IHeap ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค์šฐ ๊ณ ๊ธ‰ ์ „๋ฌธ๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ •๋‹นํ™”ํ•  ๋งŒํผ BCL์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์œ ์šฉ/์ •๋ ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ์—์„œ 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๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋‹น์‹ ์ด ์œ„์˜ ๊ฒฐ๊ณผ ๋กœ ๋‚ด๊ฐ€ ์ œ์‹œํ•œ ๋ฌธ์ œ๋ฅผ ์ „ํ˜€ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ์—ฌ๊ธฐ์„œ ๋‚ด ๋ง์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ผ๋‹ค:

๊ทธ๋“ค์€ ์šฐ๋ฆฌ์˜ ๋น„ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ์„ ๊ณ ์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋ฌด์‹œํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ต์…˜์€ ์—†์œผ๋ฉฐ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ๊ทธ๋ฃน์˜ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ์ˆœ์ „ํžˆ ํƒ€์‚ฌ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๊ทธ๊ฒƒ๋“ค์ด ๋ถ„๋ฆฌ๋œ ์‚ฌ๋žŒ๋“ค์˜ ๊ทธ๋ฃน์ด๋ผ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๊ณตํ†ต ์•„ํ‚คํ…์ฒ˜ ์ฝ”์–ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค _. ๋‚˜์ค‘์— ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์€ ๋‚˜์ค‘์— 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 ์ด๋ฆ„ ์ง€์ •์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค .NET ํ”Œ๋žซํผ ๋‚ด์—์„œ ์ผ๊ด€์„ฑ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” API๊ฐ€ ์นœ์ˆ™ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ „์— ์‚ฌ์šฉํ•œ ์šฉ์–ด๋ผ๋ฉด ๊ทธ ์ด๋ฆ„์ด 100% ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

  2. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™์— ๋Œ€ํ•œ ์ •์‹ ๊ต์œก์„ ๋ฐ›์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” .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 ์œ„์˜ ๋…ผ์˜๊ฐ€

  • ๊ทผ๋ณธ์ ์ธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ฐจ๋ก€๋กœ ํˆฌํ‘œ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ๋ถ€ํ„ฐ ๋ช…ํ™•ํ•œ ์˜๊ฒฌ์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” API ๊ฒ€ํ† ์ž๊ฐ€ ์—ฌ๊ธฐ์— ์™€์„œ ๊ณง ์˜๊ฒฌ์„ ์ œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • "ํˆฌํ‘œ ๊ฒŒ์‹œ๋ฌผ"์—๋Š” ์œ„์˜ ์ „์ฒด ํ…์ŠคํŠธ ๋ฒฝ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ํˆฌํ‘œ ์„ธ์…˜์ด ๋๋‚˜๋ฉด API ๊ฒ€ํ† ์ž๋“ค์—๊ฒŒ ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋ฉฐ ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทผ๋ณธ์ ์ธ ์ธก๋ฉด์— ๋™์˜ํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ซํžˆ๊ณ  ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•  ๊ฒƒ). ์ด๋ฒˆ ํ˜ธ์—์„œ๋Š” ์šฐ๋ฆฌ์˜ ๊ฒฐ๋ก ์„ ์š”์•ฝํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์„ ๋ฐ˜์˜ํ•œ API ์ œ์•ˆ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊ธฐ์—์„œ ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์š”์†Œ ์—…๋ฐ์ดํŠธ ๋ฐ ์ œ๊ฑฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” 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, ICollection, IEnumerable, IReadOnlyCollection
{
๊ณต๊ฐœ ์šฐ์„  ์ˆœ์œ„ ํ();
๊ณต๊ฐœ PriorityQueue(int ์šฉ๋Ÿ‰);
๊ณต๊ฐœ PriorityQueue(IComparer๋น„๊ต);
๊ณต๊ฐœ PriorityQueue(IEnumerable์ˆ˜์ง‘);
๊ณต๊ฐœ PriorityQueue(IEnumerable์ปฌ๋ ‰์…˜, IComparer๋น„๊ต);
๊ณต๊ฐœ 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();
    }
}

}
```

ํ•  ๊ฒƒ:

  • ๋ˆ„๋ฝ๋œ ์‚ฌ์šฉ ์˜ˆ(ํ•ญ๋ชฉ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”์ง€ ๋ถˆ๋ถ„๋ช…ํ•จ) -- ์šฐ์„  ์ˆœ์œ„ ๊ฐ’ ์ž…๋ ฅ์œผ๋กœ 'int'๋ฅผ ๊ฐ–๋„๋ก ๋‹ค์‹œ ๋””์ž์ธํ•ด์•ผ ํ• ๊นŒ์š”? ์–ด์ฉŒ๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ถ”์ƒํ™”? (์œ„์—์„œ ๋…ผ์˜ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด ์ฝ๊ธฐ์— ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ๋” ์ด์ƒ์˜ ๋…ผ์˜๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด ํ•„์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.)
  • UpdatePriority ์‹œ๋‚˜๋ฆฌ์˜ค ๋ˆ„๋ฝ
  • ์œ„์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ ์ค‘ ์—ฌ๊ธฐ์— ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@karelz ์ข‹์•„, ๋ด์ค˜ ! :์›ƒ๋‹ค:

๊ดœ์ฐฎ์€. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํž™์€ API ๊ฒ€ํ† ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด 4์ฐจ ํž™์„ ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ  ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” Python , Java , C++ , Go , Swift ๋ฐ Rust (์ ์–ด๋„ ํ•ด๋‹น)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋ช‡ ๊ฐ€์ง€ ๋ฉด์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฃผ์š” ์ดˆ์ ์€ ์ตœ์ ์˜ ๋ณต์žก์„ฑ๊ณผ ๋›ฐ์–ด๋‚œ ์‹ค์ œ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •ํ™•์„ฑ, ๊ธฐ๋Šฅ ์ธก๋ฉด์˜ ์™„์ „์„ฑ ๋ฐ ์ง๊ด€์„ฑ์— ์žˆ์Šต๋‹ˆ๋‹ค.

@karelz @terrajobst

์ œ์•ˆ

์ด๋ก ์  ํ•ด์„

์‚ฌ์šฉ์ž์—๊ฒŒ ๋งŽ์€ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ์š”์†Œ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๊ทธ๋“ค์€ ๋‹ค์Œ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์š”์†Œ ๋ฌถ์Œ์„ ํŠน์ • ์ˆœ์„œ๋กœ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ปฌ๋ ‰์…˜์— ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์š”์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  5. ๋‘ ์ปฌ๋ ‰์…˜์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์šฉ๋ฒ•

์šฉ์–ด ์‚ฌ์ „

  • ๊ฐ’ โ€” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ.
  • ํ‚ค โ€” ์ฃผ๋ฌธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ

๋จผ์ € ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋ฐ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์š”์†Œ ์ถ”๊ฐ€๋งŒ). ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 1

  • TKey ๋ฐ TValue ๋Š” ๋ณ„๋„์˜ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
  • TKey ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
var queue = new PriorityQueue<int, string>();

queue.Enqueue(5, "five");
queue.Enqueue(1, "one");
queue.Enqueue(3, "three");

์‹œ๋‚˜๋ฆฌ์˜ค 2

  • 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");

์‹œ๋‚˜๋ฆฌ์˜ค 3

  • 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 .

์‹œ๋‚˜๋ฆฌ์˜ค 4

  • 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 ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 5

  • TKey ๋ฐ TValue ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ์ฒด์ด์ง€๋งŒ ๋™์ผํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  • TKey ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
var queue = new PriorityQueue<int, int>();

queue.Enqueue(5, 50);
queue.Enqueue(1, 10);
queue.Enqueue(3, 30);

์‹œ๋‚˜๋ฆฌ์˜ค 6

  • ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
  • ๋ฌผ๋ฆฌ์  ํ‚ค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค๋งŒ ํ™•์ธํ–ˆ๋‹ค. ๊ฒฐ๊ณผ? ์‹ค๋งํ•œ ๊ฐœ๋ฐœ์ž:

์—ฌ๊ธฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Java ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค(์ด ๋‹จ๋…์œผ๋กœ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ์ถ”ํ•˜๊ณ  ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ฐœ๋…์˜ ํ•ธ๋“ค์„ ์†Œ๊ฐœ

ํ•ธ๋“ค

์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์„ ์ˆœ์œ„ ํ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ•ธ๋“ค์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

์œ„์˜ ์˜ˆ์—์„œ๋Š” ํŠน์ • ์„ ํƒ์ž๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ฐœ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ˆœํžˆ ์ž์ฒด ์žฌ์ •๋ ฌ์„ ์œ„ํ•ด ์•Œ๋ฆผ์„ ๋ฐ›๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋Š” ์•Š์Œ).

์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ๊ตฌ์„ฑ๋˜๊ณ  ์š”์†Œ๋กœ ์ฑ„์›Œ์ง€๋Š” ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹๋„ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์“ธ์ง€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฒˆ์—๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋” ์งง๊ฒŒ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 7
  • 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)).

์‹œ๋‚˜๋ฆฌ์˜ค 8
  • TKey ์€ TValue ๋‚ด์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
var queue = new PriorityQueue<int, MyClass>(selector);

/* adding some elements */

queue.Update(handle);

์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํ•ธ๋“ค ์„น์…˜์—์„œ ์˜ˆ๋กœ ์ œ๊ณต๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„๋Š” O(log n)์—์„œ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์‚ฌ์šฉ์ž๋Š” ์ง€์ •๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ฐพ๊ณ  ๋‚ด๋ถ€ ์žฌ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Update(TValue) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ O(n)์ž…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 9
  • TKey ๋ฐ TValue ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ์ฒด์ด์ง€๋งŒ ๋™์ผํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๋ชจํ˜ธํ•จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ โ€” ๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœ์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์ •ํ™•์„ฑ(๋ฐ์ดํ„ฐ ๋ณต์ œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„) ๊ฐ„์˜ ์ ˆ์ถฉ์ ์ž…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 10
  • ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ๋‹จ์ผ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.

ํ•ธ๋“ค์ด ์žˆ์œผ๋ฉด ๋‹ค์‹œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ํ†ตํ•œ ์—…๋ฐ์ดํŠธ๋Š” ๋” ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ณ  ํ•ญ์ƒ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(ํ•ญ๋ชฉ์ด ๋™์ผ).

์š”์†Œ ์ œ๊ฑฐ

์†์žก์ด๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” 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 ์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ API

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 ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๊ณ  ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋‚ด์˜ ์ผ๋ถ€ ์š”์†Œ๋ฅผ ์žฌ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ

ํ•ธ๋“ค์ด ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํšจ์œจ์„ฑ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋‘๋ ค์›€์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํž™์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ํ• ๋‹น์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ฝ์–ด.

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์ œ๊ณตํ•˜๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ž˜์— ๋ฐฐ์—ด๋กœ ํ‘œ์‹œ๋˜๋Š” ์ด์ง„ ํž™์œผ๋กœ ๊ตฌํ˜„๋œ ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„์ƒ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์–ด๋ง ํž™ ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํŠธ๋ฆฌ๋ฅผ ๋Œ€์‹  ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ์„ฑ๋Šฅ์ด ์ข‹์„๊นŒ?

  • ์ผ๋ฐ˜์ ์ธ ์ž„์˜ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ 4์ฐจ ํž™์ด ์•ฝ๊ฐ„ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋น ๋ฅด๋ ค๋ฉด ์–ด๋ ˆ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ธ๋“ค์€ ๋‹จ์ˆœํžˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ถ”๊ฐ€ ํ• ๋‹น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด โ€” ์šฐ๋ฆฌ๋Š” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์„ค๊ณ„๋œ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ๋„ ๊ฝค ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์•„๋ž˜์— ํŽ˜์–ด๋ง ํž™์ด ์žˆ๋Š” ์ถ”๊ฐ€ ์ด์ ์€ ์ด์ง„/4์ฐจ ํž™์—์„œ์™€ ๊ฐ™์ด O(n) ๋Œ€์‹  O(1)์—์„œ ๋‘ ๊ฐœ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํž™ ํŽ˜์–ด๋ง์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋•Œ๋กœ๋Š” 4์ฐจ ํž™๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค(๋ณ‘ํ•ฉ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ˆ˜ํ–‰๋œ ์ž‘์—… ๋ฐ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

์ฐธ๊ณ ๋ฌธํ—Œ

  • Michael L. Fredman, Robert Sedgewick, Daniel D. Sleator ๋ฐ Robert E. Tarjan(1986), ํŽ˜์–ด๋ง ํž™: ์ž์ฒด ์กฐ์ • ํž™์˜ ์ƒˆ๋กœ์šด ํ˜•ํƒœ , ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1:111-129 .
  • Daniel H. Larkin, Siddhartha Sen ๋ฐ Robert E. Tarjan(2014), ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์— ๋Œ€ํ•œ ๊ธฐ์ดˆ๋กœ ๋Œ์•„๊ฐ€ ๊ฒฝํ—˜์  ์—ฐ๊ตฌ , arXiv:1403.0252v1 [cs.DS].

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๋ฅผ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ์„ ํƒ€ํ˜‘ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

  • ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์—ผ๋‘์—๋‘๊ณ  ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ง€์ผœ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @karelz , ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ํˆฌํ‘œํ•œ ์ด์ „ ๊ฒŒ์‹œ๋ฌผ(์ œ์•ˆ ๋ฐ”๋กœ ์•ž์— ์žˆ์Œ)๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? API ๊ฒ€ํ† ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต ํ›„์— ๋‚˜์ค‘์— ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋“  ๊ธฐ๋Šฅ์€ ๋งค์šฐ ์œ ์‚ฌํ•  ๊ฒƒ์ด๋ฉฐ ๊ฒ€ํ† ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ธ๋“ค์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๊ฑฐ๋ถ€๋˜๊ณ  ์š”์†Œ๋ฅผ ์ œ๋Œ€๋กœ ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(๋˜๋Š” TKey ๋ฐ TValue ๋ณ„๋„๋กœ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ) ์ด ํด๋ž˜์Šค๋Š” ์‹ค์ œ๋กœ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. - ํ˜„์žฌ Java์—์„œ์™€ ๊ฐ™์ด.
  • ํŠนํžˆ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ๋‚ด AlgoKit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Š” CoreFX์™€ ํ•จ๊ป˜ ํž™์— ๋Œ€ํ•œ ๊ณตํ†ต ์ฝ”์–ด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ €์—๊ฒŒ ์ •๋ง ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด Microsoft์—์„œ ๋‹จ์ ์œผ๋กœ ์ธ์‹๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ๋†€๋ผ์šด ์ผ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๋‚ด ์˜๋„๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค.

๋ฏธ์•ˆ, ๊ทธ๋Ÿผ ๋‚ด ์‹ค์ˆ˜.

๋””์ž์ธ์— ๋Œ€ํ•œ ๋‚ด ์งˆ๋ฌธ(๋ฉด์ฑ… ์กฐํ•ญ: ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ ๋ฐ ์„ค๋ช…, ํ•˜๋“œ ํ‘ธ์‹œ๋ฐฑ ์—†์Œ(์•„์ง)):

  1. ์ •๋ง PriorityQueueHandle ํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๊ธฐ์—ด์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ธฐ๋Œ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

    • ๋™๊ธฐ: ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ฐœ๋…์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์™œ ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด API ํ‘œ๋ฉด์œผ๋กœ ๋ˆ„์ถœ๋˜๋Š” ํŠน์ • ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด์ž…๋‹ˆ๊นŒ? API์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  2. Merge ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜์—๋„ ์žˆ๋‚˜์š”? ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— API๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. API์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • IEnumerable<KeyValuePair<TKey, TValue>> ์—์„œ ์ดˆ๊ธฐํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ• ๊นŒ์š”? + Linq์— ์˜์กด

  3. comparer ๊ณผ๋ถ€ํ•˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ํ•ญ์ƒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (๋ฉด์ฑ… ์กฐํ•ญ: ์ด ๊ฒฝ์šฐ ์ง€์‹/์ „๋ฌธ ์ง€์‹์ด ๋ถ€์กฑํ•˜๋ฏ€๋กœ ์งˆ๋ฌธ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.)
  4. keySelector ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์น˜์˜ ์ผ๋ถ€๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ณ„๋„์˜ ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ข€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์žฅ๋‹จ์ ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐœ๋ณ„/๋ณ‘๋ ฌ ๊ฒฐ์ • ์‚ฌํ•ญ:

  1. ํด๋ž˜์Šค ์ด๋ฆ„ PriorityQueue ๋Œ€ Heap
  2. 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 ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์š”์†Œ

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ "ํ”Œ๋Ÿฌ๊ทธ ์•ค ํ”Œ๋ ˆ์ด"๋งŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์†Œ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋ฐฐ์šธ ๊ฒƒ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ๋งŽ์€ API. ๋‘ ๊ฐœ์˜ ์ถ”๊ฐ€ ์ƒ์„ฑ์ž, ํ•˜๋‚˜์˜ ์ถ”๊ฐ€ 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์šฐ์„ ์ˆœ์œ„ ์„ ํƒ๊ธฐ, IComparer๋น„๊ต);

public Func<TElement, TPriority> PrioritySelector { get; }

public void Enqueue(TElement element); // O(log n)
public void Update(TElement element); // O(log n)

}
````

์—ด๋ฆฐ ์งˆ๋ฌธ:

  1. ํด๋ž˜์Šค ์ด๋ฆ„ PriorityQueue ๋Œ€ Heap
  2. IHeap ๋ฐ ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๋„์ž…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋‚˜?)
  3. IPriorityQueue ์†Œ๊ฐœ ? (๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ ค์•ผ ํ• ๊นŒ์š” - IDictionary ์˜ˆ์‹œ)
  4. ์„ ํƒ๊ธฐ ์‚ฌ์šฉ(๊ฐ’ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์šฐ์„  ์ˆœ์œ„) ์—ฌ๋ถ€(5๊ฐœ์˜ API ์ฐจ์ด)
  5. (TElement element, TPriority priority) ๋Œ€ KeyValuePair<TPriority, TElement> ํŠœํ”Œ ์‚ฌ์šฉ

    • Peek ๋ฐ Dequeue ์—๋Š” ํŠœํ”Œ ๋Œ€์‹  out ์ธ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด ๋‚ด์ผ API ๊ฒ€ํ†  ๊ทธ๋ฃน์—์„œ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Peek ๋ฐ Dequeue ํŠœํ”Œ ํ•„๋“œ ์ด๋ฆ„์„ priority (์ด๋ฅผ ์ง€์ ํ•ด ์ฃผ์‹  @pgolebiowski ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค).
์ƒ๋‹จ ๊ฒŒ์‹œ๋ฌผ์€ ์œ„์˜ ์ตœ์‹  ์ œ์•ˆ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @safern ์˜ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‘ ๋ฒˆ์งธ๋กœ - ์•ž์œผ๋กœ ์ถ”์ง„ํ•ด ์ค€ @pgolebiowski ์—๊ฒŒ

์—ด๋ฆฐ ์งˆ๋ฌธ:

์—ฌ๊ธฐ์— ํ•˜๋‚˜ ๋” ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ณ ์œ ํ•œ ์š”์†Œ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค(์ค‘๋ณต ํ—ˆ์šฉ ์•ˆ ํ•จ).

์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์•„๋‹Œ ์ƒ์œ„ ๊ฒŒ์‹œ๋ฌผ์˜ '๊ฐ€์ •'์œผ๋กœ ์บก์ฒ˜๋œ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋Œ€๋Š” 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" ๋ฐ IComparer๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์—๋Š” Count, Clear, Offer(enqueue/push), Poll(dequeue/pop), Peek, Remove(๋Œ€๊ธฐ์—ด์—์„œ ์ฐพ์€ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ํ•ญ๋ชฉ ์ œ๊ฑฐ), Add(Offer์˜ ๋™์˜์–ด)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋Œ€๊ธฐ์—ด์— ๋Œ€ํ•œ ์—ด๊ฑฐ ์ง€์›๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Lucene์˜ PriorityQueue์—์„œ ์šฐ์„  ์ˆœ์œ„๋Š” ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋œ ๋น„๊ต์ž์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฉฐ, ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋น„๊ต๋œ ๊ฐœ์ฒด๊ฐ€ IComparable์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ๋œ ์›๋ž˜ API ๋””์ž์ธ์€ ๊ฐ’ ์œ ํ˜•์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ํ†ตํ•ด ๋งŽ์€ ์‚ฌ์šฉ ์˜ˆ๊ฐ€ ์žˆ์œผ๋ฉฐ 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 ์ด์™ธ์˜ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์šฐ์„  ์ˆœ์œ„ ํ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์ด ํ•„์š”ํ• ๊นŒ์š”? ๋Œ€๊ธฐ์—ด์€ ์ •์˜์— ๋”ฐ๋ผ ๋Œ€๊ธฐ์—ด์— ์‚ฝ์ž…ํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋กœ.

  • ๊ฒฐ๋ก ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ์•ˆ?
  • ๊ทธ๊ฒƒ์€ ์ง„์‹ค๊ณผ ๋งค์šฐ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ‰๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ•œ Dijkstra์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์š”์†Œ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์€ ํŠน์ • ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ํ† ๋ก ์ž…๋‹ˆ๋‹ค. @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๊ฐœ์˜ ๊ณต๊ฐœ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • [6] Peek ๋ฐ Dequeue ๋˜์ง€๊ธฐ๊ฐ€ ์ „ํ˜€ ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ?
  • [7] 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 ๊ฒ€ํ†  ํ† ๋ก :

  • ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ฐฌ๋ฐ˜ ์–‘๋ก ์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ๋””์ž์ธ ํšŒ์˜(2์‹œ๊ฐ„) ๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ํˆฌ์žํ•œ 30๋ถ„์€ ์—ด๋ฆฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ฉ์˜/๋งˆ๊ฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

    • ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ฐ€์žฅ ๋งŽ์ด ํˆฌ์žํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›์„ ์ดˆ๋Œ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @pgolebiowski , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์ฃผ์š” ์›์‹œ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค.

  • ์‹คํ—˜ - CoreFxLabs์—์„œ ์‹คํ—˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹œํ—˜ํŒ NuGet ํŒจํ‚ค์ง€๋กœ ์ถœ์‹œํ•˜๊ณ  ์†Œ๋น„์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ํ†ตํ•ด). ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ์—†์ด API๋ฅผ ๋ชป ๋ฐ•์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ์šฐ๋ฆฌ๋Š” ๊ณผ๊ฑฐ์— ImmutableCollections ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค(๋น ๋ฅธ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ๊ฐ€ ํ•ต์‹ฌ์ด๋ฉฐ API๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋จ).

    • ์ด ์‹คํ—˜์„ ์ด๋ฏธ CoreFxLab์— ์žˆ๋Š” MultiValueDictionary ์™€ ํ•จ๊ป˜ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TODO: ํ›„๋ณด์ž๊ฐ€ ๋” ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ธ”๋กœ๊ทธ์— ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ์‹คํ—˜์ ์ธ NuGet ํŒจํ‚ค์ง€๋Š” ์‹คํ—˜์ด ์ข…๋ฃŒ๋œ ํ›„ ํ•ต์ด ์ œ๊ฑฐ๋˜๋ฉฐ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ CoreFX ๋˜๋Š” CoreFXExtensions(๋‚˜์ค‘์— ๊ฒฐ์ •๋จ)๋กœ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์•„์ด๋””์–ด : ๋ฐ˜ํ™˜ ๋‹จ์ง€ TElement ์—์„œ Peek & Dequeue , ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” TPriority (์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” Try* ๊ทธ ๋ฐฉ๋ฒ•).
  • ์•ˆ์ •์„ฑ (๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„์˜ ๊ฒฝ์šฐ) - ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋™์ผํ•œ ํ•ญ๋ชฉ์€ ๋Œ€๊ธฐ์—ด์— ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ ๋Œ€๊ธฐ์—ด ๋™์ž‘).
  • ๋ณต์ œ ๋ฅผ

    • Update - ์‚ฌ์šฉ์ž๋Š” Remove ํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„๋กœ ๋‹ค์‹œ Enqueue ํ•ญ๋ชฉ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Remove ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐœ๊ฒฌ ํ•ญ๋ชฉ๋งŒ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( List ์ฒ˜๋Ÿผ).

  • ์•„์ด๋””์–ด : ์ˆ˜ ์šฐ๋ฆฌ๋Š” ์ถ”์ƒ์  ์ธ IQueue ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒ์ ์— Queue ๋ฐ PriorityQueue ( Peek ๋ฐ Dequeue ๋ฐ˜ํ™˜์€ TElement ๋ฐ ๋„์›€์ด ์—ฌ๊ธฐ)

    • ์ฐธ๊ณ : ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋  ์ˆ˜ ์žˆ์ง€๋งŒ API์— ์ •์ฐฉํ•˜๊ธฐ ์ „์— ํƒ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด ์˜ค๋žซ๋™์•ˆ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์œ„์˜ IQueue ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?). ๋Œ€๋‹ค์ˆ˜๊ฐ€ ์„ ํƒ๊ธฐ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ–ฅํ›„ API ๊ฒ€ํ†  ํšŒ์˜์—์„œ ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์—ด๋ฆฐ ์งˆ๋ฌธ์€ ๋…ผ์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ œ์•ˆ์€ ๋‚˜์—๊ฒŒ ๊ฝค ์ข‹์•„ ๋ณด์ธ๋‹ค. ๋‚ด ์˜๊ฒฌ/์งˆ๋ฌธ:

  1. Peek ๋ฐ Dequeue ๊ฐ€ priority ๋Œ€ํ•ด out ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ „ํ˜€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ๋ฒ•. ์šฐ์„  ์ˆœ์œ„๋Š” ํ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์‹œํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‚˜๋Š” ์„ ํƒ๊ธฐ ๋ฒ„์ „์ด ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ณ„๋˜๊ณ  ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ PriorityQueue<T> ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” PriorityQueue<T, T> ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ์ •์  ๋ฐ ํ™•์žฅ ๋ฉ”์„œ๋“œ ์„ธํŠธ?
  3. ์—ด๊ฑฐํ•  ๋•Œ ์š”์†Œ๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ƒ๊ฐ ์—” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ํ•ญ๋ชฉ๋งŒ ์—ด๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด priorityQueue.Select(t => t.element) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  5. ์šฐ์„  ์ˆœ์œ„ ํ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ ์œ ํ˜•์— Dictionary ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ IEqualityComparer<TElement> ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  6. ์šฐ์„  ์ˆœ์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 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์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋น„๊ต ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๋น„๊ต์™€ ์œ ์‚ฌ).) ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Lucene์˜ "์•”์‹œ์ " ๋น„๊ต ํŒจํ„ด์€ ํ˜„์žฌ API ์ œ์•ˆ์˜ ๋ช…์‹œ์  Tpriority ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ž˜ ๋งคํ•‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋˜๋Š” Tpriority๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” '๋น„๊ต ๊ฐ€๋Šฅํ•œ' ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ์ผ์ข…์˜ ๋งคํ•‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ:
1) ์šฐ์„ ์ˆœ์œ„ ํ์œ„์˜ ์›๋ž˜ ์ œ์•ˆ(Original Proposal ์ œ๋ชฉ ์•„๋ž˜์— ๋‚˜์—ด๋จ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. Update(T), Remove(T) ๋ฐ Contains(T) ํŽธ์˜ ๊ธฐ๋Šฅ์„ ์ž ์žฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ธฐ์กด ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋Œ€๋ถ€๋ถ„์— ๋งž์Šต๋‹ˆ๋‹ค.
2) ์šฐ์„ ์ˆœ์œ„ ํdotnet/corefx#1์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. Dequeue() ๋ฐ Peek()๋Š” ํŠœํ”Œ ๋Œ€์‹  TElement๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Try* ๊ธฐ๋Šฅ ์—†์Œ, Remove()๋Š” List์— ๋งž๊ฒŒ ๋˜์ง€๋Š” ๋Œ€์‹  bool์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.๋ฌด๋Šฌ. 'ํŽธ์˜ํ˜•' ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋ช…์‹œ์  ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์˜ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‘ ์œ ํ˜• ๋ชจ๋‘ ์ค‘๋ณต ์š”์†Œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„์˜ ์š”์†Œ์— ๋Œ€ํ•ด 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๊ฐ€ ์•„๋‹Œ ์˜ˆ์™ธ ๋ฐœ์ƒ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒฝ์šฐ

  • ๊ฒฐ๊ณผ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์ „ ํ™•์ธํ•˜๊ฑฐ๋‚˜ try/catch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด; catch ๋ฉ”์„œ๋“œ๋ฅผ ๋น„์šฐ๊ฑฐ๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ˆ์™ธ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ๋ฆ„ ์ œ์–ด์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์•ฝ๊ฐ„ ๋ถˆํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด 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);
}

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. IQueue<TElement> ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  2. IQueue<(TElement, TPriority)> ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์ˆซ์ž (1)๊ณผ (2)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฒฝ๋กœ์˜ ์˜๋ฏธ๋ฅผ ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ธฐ

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์š”์†Œ์™€ ์šฐ์„  ์ˆœ์œ„(ํ˜„์žฌ ์†”๋ฃจ์…˜)๋ฅผ ๋ชจ๋‘ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํž™์—์„œ๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์— Enqueue(TElement) ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์—†๋Š” ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋Œ€ํ•ด ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด... ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? default(TPriority) ? ์•„๋‹ˆ...
  2. ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” Enqueue((TElement, TPriority) element) ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ํŠœํ”Œ์„ ๋ฐ›์•„ ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด์ƒ์ ์ธ API๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฟ๋ณด๊ธฐ ๋ฐ ๋Œ€๊ธฐ์—ด์—์„œ ๋นผ๊ธฐ

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ TElement ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” (TElement, TPriority) ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋‹ค

  1. ๊ณ ๊ฐ์€ ์š”์†Œ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” LINQ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ํšจ๊ณผ๊ฐ€์žˆ๋‹ค.

๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ณ„๋„์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†๋Š” PriorityQueue<T> ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์šฐ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ๊ฒฝ์šฐ์— IComparable ๋„ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹นํžˆ ๋งŽ์€ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค ์ฝ”๋“œ์— ์ƒˆ ํŒŒ์ผ์ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ).
  • ์›ํ•œ๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ๋‹ค์‹œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์•„๋ž˜์— ๋Œ€์•ˆ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด

๋‘ ๊ฐœ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์ œ๊ณตํ•˜๋ฉด ์ „์ฒด ์†”๋ฃจ์…˜์ด ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋…ธ์ถœํ•˜์ง€๋งŒ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ž…๋ ฅ ํ˜•์‹์—๋งŒ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PriorityQueue<T> ๋Š” ์ž ์žฌ์ ์œผ๋กœ IQueue<T> ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PriorityQueue<TElement, TPriority> ๋Š” IQueue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ด์ƒํ•œ API๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”... ํšจ๊ณผ ๊ฐ€ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋ฐ ์ œ๊ฑฐ

์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ณ  ํ•ธ๋“ค ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์š”์†Œ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์™„์ „ํžˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ
  • ๋˜ํ•œ ๋‘ ์ž‘์—…์„ ๋ชจ๋‘ O(n)์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ, O(log n)์—์„œ ๋‘ ์ž‘์—…์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์•ˆํƒ€๊นŒ์šด ์ผ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ ์ „์ฒด ์ปฌ๋ ‰์…˜์„ ์ˆœ์ง„ํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ž์ฒด ๊ตฌํ˜„์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” 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 ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•œ API์™€ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์€ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค PriorityQueue ๋ฐ”๋กœ ์ž‘์—…์— ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด -.
  • ์šฐ๋ฆฌ๋Š” Java์˜ ๋ฌธ์ œ์— ๋ถ€๋”ช์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ PriorityQueue ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ ˆ์ถฉ์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์†”๋ฃจ์…˜์€ ์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ฐฐ๊ฒฝ์ด ๋” ๊ฐ•ํ•œ ์‚ฌ๋žŒ๋“ค์ด Heap ์˜ ์กด์žฌ๋ฅผ ์ธ์‹ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋Š๋‚Œ๊ณผ ์กฐํ™”๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ PriorityQueue ์˜ ์ œํ•œ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์‹  Heap ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์š”์†Œ ์—…๋ฐ์ดํŠธ/์ œ๊ฑฐ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ œ์–ด ๊ถŒํ•œ์„ ์›ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ). ์†๋„์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ์ƒํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๊ตฌ์กฐ).
  • ์šฐ์„  ์ˆœ์œ„ ํ์™€ ํž™ ๋ชจ๋‘ ๊ธฐ๋Šฅ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ๋ณต์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชฉ์ ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—).
  • ์ผ๋ฐ˜์ ์ธ IQueue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํž˜๊ณผ ๊ธฐ๋Šฅ์ด ํž™ ํ•„๋“œ์— ๋˜์ ธ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. PriorityQueue ์˜ API๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด Queue ์™€ ํ˜ธํ™˜๋˜๋„๋ก ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณต ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค IPriorityQueue ์ด์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ (์šฐ๋ฆฌ๋Š” ์˜คํžˆ๋ ค์˜ ๊ธฐ๋Šฅ ์œ ์ง€์— ์ดˆ์  PriorityQueue ๋ฐ Queue ์œ ์‚ฌํ•œ). ๋Œ€์‹  ํž™ ์˜์—ญ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฐ๊ธฐ์— IHeap ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ ์œ„์— ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์˜ณ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ํž™ ์„ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋ณด๋‹ค ๋” ๋ฐœ์ „๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์˜์—ญ์—์„œ ํ™•์žฅ์ด ์ œ๊ณต๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™•์žฅ์€ PriorityQueue ์—์„œ ์ˆ˜ํ–‰ํ•  ์„ ํƒ๊ณผ ๋ณ„๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋” ์ด์ƒ PriorityQueue ๋Œ€ํ•œ IHeap ์ƒ์„ฑ์ž๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ CoreFX์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ ์šฉํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ •์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์†”๋ฃจ์…˜๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๊ฒƒ์ด ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ Heap ๊ฐ€ ์šฐ๋ฆฌ์˜ ๋ช…๋ น์— ๋”ฐ๋ผ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ์„ฑ๋Šฅ, ์„ฑ๋Šฅ ๋ฐ ์œ ์—ฐ์„ฑ์„ ํฌ์ƒํ•˜๋ฉด์„œ ์ฃผ๋กœ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ํž™์€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ๊ฒฐ์ •์˜ ์„ฑ๋Šฅ๊ณผ ๊ธฐ๋Šฅ์  ์˜๋ฏธ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ ˆ์ถฉ์•ˆ์œผ๋กœ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ—˜์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ์ง€๊ธˆ์€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฌผ์–ด๋ณด์ž. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ท€์ค‘ํ•œ ์˜๊ฒฌ๊ณผ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”? ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ํ–‰๋ณตํ•  ๊ฒƒ ๊ฐ™์•„์š”.

์ค‘์š” ์ฐธ๊ณ  ์‚ฌํ•ญ: ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์›ํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด๊ณผ ํž™์„ ํ•จ๊ป˜ ์„ค๊ณ„ํ•ด์•ผ

๊ทธ๋Ÿฐ ๋‹ค์Œ IQueue ์ „๋‹ฌ

์œ„์— ์ œ์‹œ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด 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 ๊ฐ€ ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค(์ธ์ˆ˜ ์—†์ด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ).
  • ์„ ํƒ๊ธฐ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋Š” ์šฐ์„  ์ˆœ์œ„
    2. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์—๋Š” ์šฐ์„  ์ˆœ์œ„
    3. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๊ฐ€ ์šฐ์„ ์ž…๋‹ˆ๋‹ค.
    4. ๋“œ๋ฌธ ๊ฒฝ์šฐ: ์šฐ์„  ์ˆœ์œ„๋Š” ๋‹ค๋ฅธ ๋…ผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์žˆ์Œ).

    ๋“œ๋ฌธ ๊ฒฝ์šฐ๋Š” 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์—์„œ ์ฐธ์กฐํ•˜๋Š” ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค").

ํ•ธ๋“ค ์•„์ด๋””์–ด๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋œ๋‹ค๋ฉด ์ด ์ •๋ณด๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด...

ํ™•์‹คํžˆ ๋” ๋งŽ์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค : ์œ™ํฌ :. ํŠนํžˆ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

@karelz @safern @ianhays @terrajobst @bendono @svick @ ์•Œ๋ ‰์„ธ์ด-dvortsov @SamuelEnglard @ xied75 ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด - ๋‹น์‹ ์€ ๊ทธ๋Ÿฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‚˜์„ ์ƒ๊ฐ (์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์ด ์™€ ์ด ๊ฒŒ์‹œ๋ฌผ)? ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ๋ชจ๋“  ๊ธฐ๋Œ€์™€ ์š”๊ตฌ๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๋Š” ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ 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 .
  • ๊ทธ๊ฒƒ์€ ์•ˆ์ •์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค).
  • ์ง€์›, ์ ์ ˆํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ์ œ๊ฑฐ ์ฒ˜๋ฆฌ

    • O(n) ๋Œ€์‹  O(log n)์—์„œ ๋น ๋ฅด๊ฒŒ ์™„๋ฃŒ

    • ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์™„๋ฃŒ

  • ์—ด๊ฑฐ๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋” ๋น ๋ฆ„).
  • ์ค‘๋ณต์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

IQueue์— ๋™์˜์ œ์•ˆ. ๋‚˜๋Š” ์˜ค๋Š˜ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐœํ‘œํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ค€์—์„œ ๊ฐ€์ ธ์•ผ ํ•  ์˜ฌ๋ฐ”๋ฅธ ์ถ”์ƒํ™” ์ˆ˜์ค€์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. "ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฃผ๋ฌธํ•œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค."

  • IQueue์˜ ์‚ฌ์–‘์ข‹์•„ ๋ณด์ธ๋‹ค.

  • IQueue์— "int Count { get; }" ์ถ”๊ฐ€ ๊ณ ๋ คIReadOnlyCollection์—์„œ ์ƒ์†ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด Count๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋„๋ก.

  • IQueue์˜ TryPeek, TryDequeue์— ๊ด€ํ•œ ์šธํƒ€๋ฆฌ์—์„œ๋Œ€๊ธฐ์—ด์— ์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋„์šฐ๋ฏธ๋Š” Queue ๋ฐ Stack์—๋„ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • IsEmpty๋Š” ์ด์ƒ์น˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. BCL์˜ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์—๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Queue์— ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค., ๊ทธ๋ฆฌ๊ณ  Queue์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๊ฒƒ๋„. ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค์—์„œ๋„ ์‚ญ์ œํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • TryRemove๋ฅผ ์‚ญ์ œํ•˜๊ณ  Remove๋ฅผ "bool Remove"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์™€ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” "์ปฌ๋ ‰์…˜์˜ remove()๋Š” throwํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋งŽ์€ ๊ทผ์œก ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž˜ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๋Š” ์˜์—ญ์ด๋ฉฐ ์ •์ƒ์ ์ธ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋งŽ์€ ๋†€๋ผ์›€์„ ์œ ๋ฐœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „ ์ธ์šฉ์—์„œ @pgolebiowski

  1. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ์šฐ์„  ์ˆœ์œ„์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค(๋ฌผ๋ฆฌ์  ์ธ์Šคํ„ด์Šค 2๊ฐœ).
  2. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์—๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ์„ ์ž…๋‹ˆ๋‹ค.
  4. ๋“œ๋ฌธ ๊ฒฝ์šฐ: ์šฐ์„  ์ˆœ์œ„๋Š” ๋‹ค๋ฅธ ๋…ผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์žˆ์Œ).

๋˜ํ•œ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. 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 ).

  1. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์—๋Š” ์—ฌ๋Ÿฌ ํ•„๋“œ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์œ ํšจํ•œ ์ ์ด์ง€๋งŒ ์‚ฌ์‹ค ์ด๊ฒƒ์€ ์„ ํƒ๊ธฐ๋กœ๋„ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฒฐ๊ตญ ๋ชจ๋“  ํ•จ์ˆ˜์ž„) -- ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํž™์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

  • ์šฐ์„ ์ˆœ์œ„ ํ์ค‘์ฒฉ๋œ Enumerator ๊ตฌ์กฐ์ฒด๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ €๋Š” ์˜ค๋žซ๋™์•ˆ 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 ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์—ฌ๊ธฐ์— ๋„ฃ์œผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  • @ebickle @jnm2 -- ์ถ”๊ฐ€๋จ
  • @karelz @SamuelEnglad -- ์ฐธ์กฐ

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# ์šฐ์„  ์ˆœ์œ„ ํ"; ์ฒซ ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Github ๋ฐ ๊ธฐํƒ€ ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ตฌํ˜„
  2. Collections.Generic์— ๊ณต์‹ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ์—†๋Š” ์ด์œ ๋ฅผ ๋ฌป๋Š” ์‚ฌ๋žŒ๋“ค
  3. ๊ณ ์œ ํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ตฌํ˜„์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์Šต์„œ

@terrajobst ์ž˜ ์•Œ๋ ค์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ž˜ ์•Œ๋ ค์ง„ ํŒจํ„ด์ธ๋ฐ ์˜์›… ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? ์—ฌ๊ธฐ์—๋Š” ๊ฑฐ์˜ ํ˜์‹ ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝํ—˜์ƒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์•…๋งˆ๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์žˆ์œผ๋ฉฐ ์ผ๋‹จ API๋ฅผ ์ถœ์‹œํ•˜๋ฉด ์‹ค์ œ๋กœ ํฐ ๋ณ€ํ™”๋ฅผ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ตฌํ˜„ ์„ ํƒ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. API๋ฅผ ์ž ์‹œ ๋™์•ˆ OOB๋กœ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ”ผ๋“œ๋ฐฑ์„ ํ™•์‹คํžˆ ์ˆ˜์ง‘ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์˜์›… ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํƒ€์ด ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ข…์ข… ์˜์›…์ด ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@masonwheeler ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋งํฌ๊ฐ€ ์ด๊ฒƒ์œผ๋กœ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„ ์ด์ œ ๋‚ด ๋จธ๋ฆฌ ์†์— ์žˆ์Šต๋‹ˆ๋‹ค.

@terrajobst๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๋ฆฌ์†Œ์Šค/์ฃผ์˜์˜€์Šต๋‹ˆ๋‹ค(์›ํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋ฅผ ๋น„๋‚œํ•  ์ˆ˜ ์žˆ์Œ). ๋Œ€๋ณธ.

[๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ํŽธ์ง‘๋จ]

@danmosemsft ์•„๋‹ˆ, ๊ทธ ๋…ธ๋ž˜๋ฅผ

Hero ์•ฑ ํ›„๋ณด #1: TimerQueue.Portable์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

https://github.com/dotnet/runtime/blob/4f9ae42d861fcb4be2fcd5d3d55d5f227d30e723/src/libraries/System.Private.CoreLib/src/System/Threading/TimerQueue.Portable.cs

Hero ์•ฑ ํ›„๋ณด #1: TimerQueue.Portable์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด๋ฏธ ๊ณ ๋ คํ•˜๊ณ  ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ํ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธ๋˜๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ(์˜ˆ: ํƒ€์ž„์•„์›ƒ์˜ ๊ฒฝ์šฐ)๋Š” ๋œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

@stephentoub ํƒ€์ด๋จธ ์ˆ˜๊ฐ€ ์ ์€ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ํšจ์œจ์„ฑ์ด

ํƒ€์ด๋จธ ์ˆ˜๊ฐ€ ์ ์€ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋–ค ์ˆœ๊ฐ„์—๋„ ๋งŽ์€ ํƒ€์ด๋จธ๊ฐ€ ์žˆ์ง€๋งŒ ์•„์ฃผ ์ ์€ ์ˆ˜์˜ ํƒ€์ด๋จธ๊ฐ€ ๋ฐœ์‚ฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ํƒ€์ž„์•„์›ƒ์— ์‚ฌ์šฉ๋  ๋•Œ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์†๋„์ž…๋‹ˆ๋‹ค... 0(1)์ด๊ณ  ๋งค์šฐ ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. O(log N)๊ฐ€ ๋˜๋ฉด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ์žˆ์œผ๋ฉด ํ™•์‹คํžˆ C#์ด ์ธํ„ฐ๋ทฐ์— ๋” ์นœ์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ์žˆ์œผ๋ฉด ํ™•์‹คํžˆ C#์ด ์ธํ„ฐ๋ทฐ์— ๋” ์นœ์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค.

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค.
์ €๋„ ๊ฐ™์€ ์ด์œ ๋กœ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@stephentoub ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚˜์—๊ฒŒ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐ‘์ž๊ธฐ ํŒจํ‚ท์ด ์†์‹ค๋˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๋“ฑ์˜ ์ด์œ ๋กœ ์‹œ์Šคํ…œ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ System.Timer์—์„œ ๋ฐ˜๋ณต ํƒ€์ด๋จธ๊ฐ€ ๋™์ผํ•œ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๊ฑฐ๊ธฐ์—์„œ ๋งŒ๋ฃŒ๋˜๋Š” ํƒ€์ž„์•„์›ƒ์€ 'ํ–‰๋ณตํ•œ ๊ธธ'์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์‹œ์Šคํ…œ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ ํ•ด๋ด. :)

์šฐ๋ฆฌ๋Š” ์ด์ „ ๊ตฌํ˜„์—์„œ ๋งŽ์€ ์‹ค์ œ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ดํŽด๋ณธ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ƒˆ๋กœ์šด ๊ฒƒ(์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹ ์— ๊ณง ํƒ€์ด๋จธ์™€ ์กฐ๋งŒ๊ฐ„ ํƒ€์ด๋จธ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ„ํ• ๋จ)์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ.

๋˜ํ•œ System.Timer์—์„œ ๋ฐ˜๋ณต ํƒ€์ด๋จธ๊ฐ€ ๋™์ผํ•œ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

5๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ PriorityQueue๋Š” ์—†์Šต๋‹ˆ๋‹ค.

Rx์—๋Š” ๊ณ ๋„๋กœ ํ”„๋กœ๋•์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Core/Reactive/Internal/PriorityQueue.cs

image

5๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ PriorityQueue๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค ...

๊ทธ๋“ค์€ repo ๋ ˆ์ด์•„์›ƒ์„ ์ค‘์‹ฌ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์œ„์น˜๋Š” https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Internal/PriorityQueue.cs์ž…๋‹ˆ๋‹ค.

@stephentoub ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” @eiriktsarpalis ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์ด์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? API ๋””์ž์ธ์ด ์™„์„ฑ๋˜๋ฉด ๊ธฐ๊บผ์ด ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์•„์ง ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ์„ ์–ธ์„ ๋ณด์ง€ ๋ชปํ–ˆ๊ณ  ์ง€์ •๋œ ํ‚ฌ๋Ÿฌ ์•ฑ ์—†์ด ์ตœ์ข… API ๋””์ž์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ...
์ตœ๊ณ ์˜ ํ‚ฌ๋Ÿฌ ์•ฑ ํ›„๋ณด๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝ์—ฐ/๊ฐ•์˜/์ธํ„ฐ๋ทฐ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ƒ๋‹จ์— ์žˆ๋Š” Eric์˜ ๋””์ž์ธ์€ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•ด ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ์ œ ๋ฐ˜๋Œ€ ์ œ์•ˆ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค(์ƒˆ๋กœ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์•„์ง ์ฒ ํšŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!)

https://github.com/TimLovellSmith/corefxlab/blob/priorityQueueSpecSolved/docs/specs/priority-queue.md

๋‚ด๊ฐ€ ๊ทธ๋“ค ์‚ฌ์ด์—์„œ ์•Œ์•„์ฐจ๋ฆฐ ์ฃผ์š” ์ฐจ์ด์ ์€ ์‚ฌ์ „์ฒ˜๋Ÿผ ๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์„ ํƒ์ž๊ฐ€ ์‚ฌ๋ฌผ์ด์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๊ฒƒ์ด ์‚ฌ์ „์ด ๋˜๊ณ  ์‹ถ์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์žŠ์–ด๋ฒ„๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ธํ™”๋œ ํ• ๋‹น์ž๊ฐ€ ์žˆ๊ณ  ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ํ‚ค๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์€ ์ผ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ  ๋งค์šฐ ์‚ฌ์ „๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ์—์„œ ์‚ฌ์ „์œผ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํƒ์ž๋Š” ์‹ค์ œ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค์ธ 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๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ICollectionKeyValuePair์™€ ๊ด€๋ จ๋œ api๋Š” ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒดํ•  ๋” ๋‚˜์€ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ฐ™์€ ํ™๋ณด ๋งํฌ์ž…๋‹ˆ๋‹ค. ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด ์ œ์ถœํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/TimLovellSmith/corefxlab/blob/priorityQueueSpecSolved/docs/specs/priority-queue.md

๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ํž™๋งŒํผ ๋น ๋ฅด๊ฑฐ๋‚˜ ๊ทธ ์ด์ƒ์ธ ํ•œ ์–ด๋–ค ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@TimLovellSmith ์‹ค์ œ๋กœ API ๊ฒ€ํ† ์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์—†์ง€๋งŒ @danmosemsft ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ

๋‚ด ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€์ด๋‹ค? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด int ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋Œ€๊ธฐ์—ด์— "๋‚ด๋ถ€"์ธ ์ˆซ์ž๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์‹ค์ œ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@eiriktsarpalis @layomia ๋Š” ์ง€์—ญ ์†Œ์œ ์ž ์ด๋ฉฐ API ๊ฒ€ํ† ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ† ๋ก ์„ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ฉ์˜์ ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๊นŒ?

๊ณผ๊ฑฐ์— ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜, ํŠนํžˆ ๋…๋‹จ์ ์ด๊ฑฐ๋‚˜ ํ‹ˆ์ƒˆ ์‹œ์žฅ์ธ ์ปฌ๋ ‰์…˜์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์žฅ์†Œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค๋…„ ๋ฐฐ์†กํ•ฉ๋‹ˆ๋‹ค. ๋„์„œ๊ด€๋งŒํผ ๋นจ๋ฆฌ ์ด๋™ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ปฌ๋ ‰์…˜ ํŒฉ์„ ์ค‘์‹ฌ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์— ๋Œ€ํ•œ 84๊ฐœ์˜ ์—„์ง€์†๊ฐ€๋ฝ์€ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ํ•„์š”์„ฑ์ด ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Jlalond ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Tpriority๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ด์œ ๋ฅผ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ˆซ์ž์—ฌ์•ผ ํ•˜๋‚˜์š”? ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์šฐ์„  ์ˆœ์œ„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ byte, int, long, float, double ๋˜๋Š” enum์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@TimLovellSmith ์˜ˆ, ๊ทธ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ธ์ง€ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@danmosemsft ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค Dan. ๋‚ด ์ œ์•ˆ[1]์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ˜๋Œ€/๋Œ“๊ธ€์˜ ์ˆ˜๋Š” ๋Œ€๋žต 0์ด๋ฉฐ ๋งจ ์œ„์— ์žˆ๋Š” @eickle ์˜ ์ œ์•ˆ(์ ์ฐจ ์œ ์‚ฌํ•ด์ง€๊ณ  ์žˆ์Œ)์— ์˜ํ•ด ์—ด๋ฆฐ ์ƒํƒœ๋กœ ๋‚จ๊ฒจ์ง„ ๋ชจ๋“  ์ค‘์š”ํ•œ ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊ฑด์ „์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. IReadOnlyCollection์„ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ณ„๋กœ ์œ ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค). @eiriktsarpalis @layomia ์ด๊ฑฐ ์ข€ ๋ด๋‹ฌ๋ผ๊ณ  ํ•ด๋„ ๋ ๊นŒ์š”?

[1] https://github.com/TimLovellSmith/corefxlab/blob/priorityQueueSpecSolved/docs/specs/priority-queue.md

[์ถ”์‹  - ์Šค๋ ˆ๋“œ ๊ฐ์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜„์žฌ ์ œ์•ˆ๋œ ํ‚ฌ๋Ÿฌ ์•ฑ์€ ์ฝ”๋”ฉ ๋Œ€ํšŒ, ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ ๋“ฑ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํด๋ž˜์Šค ๋˜๋Š” ๊ตฌ์กฐ์ฒด์™€ ํ•จ๊ป˜ ์˜ค๋Š˜์˜ ์ข‹์•„ํ•˜๋Š” ์ˆซ์ž ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅธ 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์˜ ์ฝ”๋“œ ๋‚ด์šฉ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ํ™•์ธ๋œ '๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ'์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋…ผ์˜ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋“ค ๋ชจ๋‘์— ๋Œ€ํ•œ ๋‚˜์˜ ์˜๊ฒฌ์„ ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค ์ด๋ฆ„ PriorityQueue vs. Heap <-- ์ด๋ฏธ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ PriorityQueue๊ฐ€ ๋” ๋‚ซ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

  2. IHeap ๋ฐ ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๋„์ž…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? <-- ๋‚˜๋Š” ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ธ๊ณ„์˜ 95%์— ๋Œ€ํ•ด ๋‹ค์ค‘ ํž™ ๊ตฌํ˜„์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ด์œ (์˜ˆ: ์„ฑ๋Šฅ ๋ธํƒ€)๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‚˜๋จธ์ง€ 5%๋Š” ์•„๋งˆ๋„ ์ž์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  3. IpriorityQueue๋ฅผ ์†Œ๊ฐœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? <-- ์ €๋„ ํ•„์š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด๋„ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

  4. ์„ ํƒ๊ธฐ(๊ฐ’ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์šฐ์„ ์ˆœ์œ„)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ(5๊ฐœ์˜ API ์ฐจ์ด) <-- ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์„ ํƒ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค. IComparer<> ์ด๋ฏธ ํ•ญ๋ชฉ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ง ์ข‹์€ ์ตœ์†Œ ํ™•์žฅ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์„ ํƒ๊ธฐ๋Š” ํฐ ๊ฐœ์„ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•(๋˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•)์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ํŠœํ”Œ(TElement ์š”์†Œ, Tpriority ์šฐ์„  ์ˆœ์œ„) ๋Œ€ KeyValuePair ์‚ฌ์šฉ<-- ๊ฐœ์ธ์ ์œผ๋กœ KeyValuePair ๋Š” ํ•ญ๋ชฉ์ด ์„ธํŠธ/์‚ฌ์ „์—์„œ ํ‚ค๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ๋ชฉ์ด ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์— ์„ ํ˜ธ๋˜๋Š” ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  6. Peek๊ณผ Dequeue๋Š” ํŠœํ”Œ ๋Œ€์‹ ์— out ์ธ์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๊นŒ? <-- ๋ชจ๋“  ์žฅ๋‹จ์ , ํŠนํžˆ ์„ฑ๋Šฅ์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ์—์„œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

  7. Peek and Dequeue ๋˜์ง€๊ธฐ๊ฐ€ ์ „ํ˜€ ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ? <-- ์˜ˆ... ๋Œ€๊ธฐ์—ด์— ์—ฌ์ „ํžˆ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๊ณ  ์ž˜๋ชป ๊ฐ€์ • ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด๋ฅผ ๊ฐ€์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด Peek ๋ฐ Dequeue API๋ฅผ ์ „ํ˜€ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  TryPeek ๋ฐ TryDequeue๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. [ํŠน์ • ๊ฒฝ์šฐ์— Peek ๋˜๋Š” Dequeue๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์œผ๋ฉฐ Peek/Dequeue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์„ฑ์ด ์•ฝ๊ฐ„ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.]

๊ทธ ์™ธ์—๋„ ๊ณ ๋ ค ์ค‘์ธ ์ œ์•ˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ์„ ์ˆœ์œ„ ํ๊ณ ์œ ํ•œ ํ•ธ๋“ค์ด ์žˆ๋Š” ๊ณ ์œ ํ•œ ํ•ญ๋ชฉ์—์„œ๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด(์˜ˆ: ๋ฌธ์ž์—ด)๋ฅผ ๋น„๊ตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • IEqualityComparer๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ์šฐ์„ ์ˆœ์œ„ ํ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํšจ์œจ์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด '์ œ๊ฑฐ', '์ž‘์€ ๊ฒฝ์šฐ ์šฐ์„  ์ˆœ์œ„ ๊ฐ์†Œ', ํŠนํžˆ 'ํ•ญ๋ชฉ์„ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์ด ์ž‘์€ ๊ฒฝ์šฐ ์šฐ์„  ์ˆœ์œ„ ๊ฐ์†Œ'์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ O(log n)์ž…๋‹ˆ๋‹ค.

  3. PriorityQueue๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒŒ์œผ๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.๊ธฐ์กด ํ•ญ๋ชฉ์˜ ์šฐ์„  ์ˆœ์œ„ ๊ฐ€์ ธ์˜ค๊ธฐ/์„ค์ •์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž[]๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. get์˜ ๊ฒฝ์šฐ O(1), set์˜ ๊ฒฝ์šฐ O(log n)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ฐ€์žฅ ์ž‘์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— '์ตœ์†Œ ๋น„์šฉ'์œผ๋กœ ์ตœ์ ํ™” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ์—ด๊ฑฐํ˜•์€ ์ฃผ๋ฌธ ๋ณด์ฆ์„ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ - ์ฒ˜๋ฆฌ:
์šฐ์„ ์ˆœ์œ„ ํํ•ญ๋ชฉ ๋ฐ ์šฐ์„  ์ˆœ์œ„๋Š” ์ค‘๋ณต ๊ฐ’์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜๋„๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์€ '๋ถˆ๋ณ€'์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปฌ๋ ‰์…˜์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ค‘๋ณต์ด ๋ณ€๊ฒฝ๋œ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—… this??)... ์ด ๋ชจ๋“  ๊ฒƒ์ด ์œ ์šฉํ•œ์ง€, ์ด๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์ปฌ๋ ‰์…˜์— ์—…๋ฐ์ดํŠธ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์ด ๋Š๋ฆฌ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉ์„ ์ž‘์—…ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„... ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ฒ„๋กœ๋“œ๋œ ๋ฉ”์„œ๋“œ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•ญ๋ชฉ ์ž์ฒด์™€ ๊ตฌ๋ณ„๋˜๋Š” ํ•ญ๋ชฉ ํ•ธ๋“ค์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํ•ด์‹œ ํ‚ค๋กœ ์‚ฌ์šฉ๋จ)?

์ด ์œ ํ˜•์„ ๋” ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก 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์ผ ๋•Œ ์ ์ ˆํ•œ ๋™๋“ฑ์„ฑ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?). ์—ฌ๊ธฐ์—์„œ ์„ธ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ๊ณ ์œ ์„ฑ/๋™๋“ฑ์„ฑ์„ ์š”๊ตฌํ•˜๊ณ  ์›๋ณธ ์š”์†Œ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(์ตœ๋Œ€ ๊ฐ™์Œ).
    2. ๊ณ ์œ ์„ฑ/๋™๋“ฑ์„ฑ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„ ํƒ์  Enqueue ๋ฉ”์†Œ๋“œ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค ํ• ๋‹น์ด ์ถฉ๋ถ„ํžˆ ํฐ ๋ฌธ์ œ๋ผ๋ฉด ValueTask๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
    3. ๊ณ ์œ ์„ฑ/๋™๋“ฑ์„ฑ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ‘ํ•ฉ ๋Œ€๊ธฐ์—ด์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? -- ๋ณ‘ํ•ฉ์ด ํšจ์œจ์ ์ด์ง€ ์•Š์€ ํ•˜๋‚˜์˜ ๊ตฌํ˜„(์•„๋งˆ๋„ ๋ฐฐ์—ด ํž™ ์‚ฌ์šฉ)๋งŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? -- 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 ๋ฉ”์„œ๋“œ ์†์„ฑ์„ ์‹ค์ œ๋กœ ์ง€์›ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์ด๋ฏธ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ ํ•˜๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์—).

ํ•ธ๋“ค ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋น„ํŒ ์ค‘ ํ•˜๋‚˜๋Š” ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ

  1. PriorityQueue ์‚ฌ์šฉ์ง€์ง€/์ ์ˆ˜ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฉ”์‹œ์ง€/๊ฐ์ •/ํƒœ๊ทธ/์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ๊ณ ์œ  ๊ฐ’์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  2. PriorityQueue ์‚ฌ์šฉ, double> ๊ณ ์œ ํ•œ ํŠœํ”Œ์„ ์ฃผ๋ฌธํ•˜๋ ค๋ฉด [์šฐ์„ ์ˆœ์œ„ ๋ณ€๊ฒฝ ์—ฌ๋ถ€] - ์–ด๋”˜๊ฐ€์— ์ถ”๊ฐ€ ํ•ธ๋“ค์„ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ๊ทธ๋ž˜ํ”„ ์ธ๋ฑ์Šค ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์ฒด ID์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ์ด์ œ ๊ตฌํ˜„์„ ํ†ตํ•ด ํ•ธ๋“ค์„ ๋ฟŒ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹ 

๋ฌผ๋ก , ๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋•Œ๋กœ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ํ‰๋“ฑ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IEqualityComparer์™€ ๊ฐ™์€ ํƒˆ์ถœ ํ•ด์น˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋” ํ’๋ถ€ํ•œ ์œ ํ˜•์œผ๋กœ ์ƒํ–ฅ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿฅณ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ž…๋ ฅ์„ ๊ณ ๋ คํ•˜์—ฌ ์ฃผ๋ง ๋™์•ˆ ์ œ์•ˆ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ผ์šด๋“œ๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ˆ˜์ •๋ณธ์„ ๊ณต์œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ •์ผ 2020-09-20.

์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์ œ์•ˆ(v2.0)

์š”์•ฝ

.NET Core ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _priority queue_ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ฐ ์š”์†Œ์— ์ถ”๊ฐ€๋กœ ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ System.Collections.Generic ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— PriorityQueue<TElement, TPriority> ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์‹ ์กฐ

์šฐ๋ฆฌ์˜ ์„ค๊ณ„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์น™์— ๋”ฐ๋ผ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋” ๋‚˜์€ ์›์น™์„ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ).

  • ๋„“์€ ๋ฒ”์œ„. ์šฐ๋ฆฌ๋Š” .NET Core ๊ณ ๊ฐ์—๊ฒŒ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ๊ท€์ค‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ ค์ง„ ์‹ค์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” Java, Python, C++, Rust์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์–ธ์–ด์— ์กด์žฌํ•˜๋Š” ๊ณ ๊ฐ ๋Œ€๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์„ ๋ถˆํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์œ ์šฉ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋””์ž์ธ ์„ ํƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐฉํ†ตํ–‰ ๊ฒฐ์ •์œผ๋กœ ๊ทน๋„์˜ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค. API๋Š” ํ•œ ๋ฒˆ ๋„์ž…๋˜๋ฉด ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์ด ์˜์›ํžˆ ๊ณ ์ฐฉ๋  ์ฐจ์„ ์˜ ์†”๋ฃจ์…˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ ์„ ํƒ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๋ถ„์„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ ๋งˆ๋น„๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์ด ์—†์„ ์ˆ˜ ์žˆ์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ ˆ์ถฉ์•ˆ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ณ  ๋‚ฉํ’ˆ์„ ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ ๋งˆ์นจ๋‚ด ๊ณ ๊ฐ์ด ์ˆ˜๋…„ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

๊ณ ๊ฐ์˜ ์ž…์žฅ์—์„œ

๊ฐœ๋…์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ๊ฐ ์š”์†Œ์— ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ์š”์†Œ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ปฌ๋ ‰์…˜์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์š”์†Œ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์•ก์„ธ์Šค์™€ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 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();
    }
}

์‚ฌ์šฉ ์˜ˆ

1) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š” ๊ณ ๊ฐ

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 }

2) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ณ ๊ฐ

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) ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์œผ๋กœ ์—ด๊ฑฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ์—ด๊ฑฐ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ก

๋ถ€๋ก A: ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ธฐํƒ€ ์–ธ์–ด

| ์–ธ์–ด | ์œ ํ˜• | ๋ฉ”๋ชจ |
|:-:|:-:|:-:|
| ์ž๋ฐ” | ์šฐ์„ ์ˆœ์œ„ ํ | ์ถ”์ƒ ํด๋ž˜์Šค AbstractQueue ํ™•์žฅํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค Queue ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. |
| ๋…น | ๋ฐ”์ด๋„ˆ๋ฆฌํž™ | |
| ์Šค์œ„ํ”„ํŠธ | CFBinaryํž™ | |
| C++ | ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด | |
| ํŒŒ์ด์ฌ | ํž™Q | |
| ์ด๋™ | ํž™ | ํž™ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. |

๋ถ€๋ก B: ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋…ผ์˜ํ•  ๋•Œ _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 , ๋‹น์‹ ์€ ํ–‰๋™์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํŽ˜์–ด๋ง ํž™์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ์•„๋งˆ๋„ ๋‘ ํž™์ด ๊ทธ ์ดํ›„์— ๊ฒน์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” 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) ์˜ค๋ฒ„๋กœ๋“œ๋„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
  • ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์ค‘๋ณต ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ 'dequeue'๊ฐ€ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ธ๋“ค ์ถ”์  ์‹œ์Šคํ…œ์—์„œ ์ •ํ™•ํ•œ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ์˜ ์‚ฌ๋ณธ์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด Remove(PriorityQueueNode) ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?
  • Remove๊ฐ€ throw๋˜๋ฉด throw๋˜์ง€ ์•Š๋Š” TryRemove() ๋ฒ„์ „์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • Contains() api๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ ์šฉํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. 'ํฌํ•จ'์€ ๋ณด๋Š” ์‚ฌ๋žŒ์˜ ๋ˆˆ์— ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‹ค๋ฅธ '์ค‘๋ณต' ์š”์†Œ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋˜๋Š” ๊ธฐํƒ€ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค! ์ด ๊ฒฝ์šฐ ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ์–ด์จŒ๋“  ์ž์‹ ์˜ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ์ค‘๋ณต์ด ์—†๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@pgolebiowski ์‹œ๊ฐ„์„ ๋‚ด์–ด ์ƒˆ ์ œ์•ˆ์„œ๋ฅผ

  • @TimLovellSmith ์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ Contains() ๋˜๋Š” TryGetNode() ์ด ํ˜„์žฌ ์ œ์•ˆ๋œ ํ˜•์‹์œผ๋กœ API์— ์กด์žฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. TElement ๋Œ€ํ•œ ํ‰๋“ฑ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋ฉฐ, ์ด๋Š” ์•„๋งˆ๋„ ํ•ธ๋“ค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ”ผํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์•„๋งˆ๋„ public void Dequeue(out TElement element); ๋ฅผ public TElement Dequeue(); ๋กœ ๋ฐ”๊พธ์–ด ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • TryDequeue() ๋ฉ”์„œ๋“œ๊ฐ€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ํด๋ž˜์Šค๋„ ICollection<T> ๋˜๋Š” IReadOnlyCollection<T> ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ PriorityQueue ์ธ์Šคํ„ด์Šค์—์„œ ๋ฐ˜ํ™˜๋œ PriorityQueueNode๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?
  • ํšจ์œจ์ ์ธ ๋ณ‘ํ•ฉ ์ž‘์—…์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? AFAICT๋Š” ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ• ๋‹น ์ธก๋ฉด์—์„œ ๊ตฌํ˜„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋Š” ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™ ๊ตฌํ˜„์—๋งŒ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ด์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๊ตฌํ˜„์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ž„์˜ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ ๋” ํšจ์œจ์ ์ธ ํž™ ์œ ํ˜•์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ๋Š” 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๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.์ƒˆ๋กœ์šด ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ณด๋‹ค

  • ์ ์€ API ํ‘œ๋ฉด
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `new PriorityQueue(์ƒˆ ์‚ฌ์ „() {{1, 1}, {2,2}, {3,3}, {4,4}, {5,5}}); ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ‚ค์˜ ๊ณ ์œ ์„ฑ์— ์˜ํ•ด ์ œํ•œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ IDictionary ๊ธฐ๋ฐ˜์˜ ์ปฌ๋ ‰์…˜์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐ์ฒด์ด๋ฏ€๋กœ NullReference ์˜ˆ์™ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์–ด๋Š ์‹œ์ ์—์„œ PrioirtyQueue๋Š” ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋˜์–ด์•ผ ํ•˜๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋ฌด์—‡์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ ์€ TPriority Key ์— ๋Œ€ํ•ด ๋งŒ๊ฐ์ด ๊ต์ฐจํ•˜์ง€๋งŒ ์ข‹์€ ๋ฌธ์„œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
`

Dijkstra์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€๊ธฐ์—ด์— ๊ฐ€์งœ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž‘๋™ํ•˜๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ๊ฐ€์žฅ์ž๋ฆฌ์˜ ์ด ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒ˜๋ฆฌ ์—์ง€์—์„œ ์ƒ์„ฑ๋œ ํž™์— ์ƒ์ฃผํ•˜๋Š” ์ž„์‹œ ๋…ธ๋“œ์˜ ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜๋ฉฐ ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ธฐ ๋ฐ ๋Œ€๊ธฐ์—ด์—์„œ ๋นผ๋Š” ํšจ์œจ์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IReadOnlyCollection์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” Add() ๋ฐ Remove()๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ๋ฌด์Šจ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€...)

@Ivanidzo4ka ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋”์šฑ ํ™•์‹ ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™(์ฆ‰, ์—…๋ฐ์ดํŠธ ์—†์Œ)์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค.

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™์€ ๊ฐ„๋‹จํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ์ž‘์€ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์ค‘์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‹ค์ œ๋กœ ์ž˜ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™„์ „ํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค(์ฆ‰, ์กฐ๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณต๊ฐ„ ๋ณต์žก์„ฑ ๊ฐ์†Œ ๋ฐ ์‹œ๊ฐ„ ๋ณต์žก์„ฑ ๊ฐ์†Œ)์— ๋Œ€ํ•œ ์ด๋ก ์  ์ด์ ์„ ์ œ๊ณตํ•˜๊ณ  ๋” ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์—๋Š” 10๋…„ ์ „ ๊ฐ€์žฅ ์ข‹์€ ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํž™๊ณผ SortedSet / Dictionary ์กฐํ•ฉ์„ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค(KSSP๊ฐ€ ๋– ์˜ค๋ฆ„).

ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐ์ฒด์ด๋ฏ€๋กœ NullReference ์˜ˆ์™ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฐ˜๋Œ€๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค๋ฉด NRE๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ณณ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ/ํ•ธ๋“ค์€ ์•„๋งˆ๋„ ํด๋ž˜์Šค์—ฌ์•ผ ํ•˜์ง€๋งŒ, ๋‹จ์ง€ ํ•œ ์Œ์„ ์ฝ๊ณ /๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ตฌ์กฐ์ฒด์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.


ํ•ธ๋“ค ๊ธฐ๋ฐ˜ ์ œ์•ˆ์—์„œ ์š”์†Œ์™€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ํ•ธ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ์šฉํ•œ ์ž‘์—…์ด๋ฉฐ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ผ๋ถ€ ํž™์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ €๋ ดํ•˜๊ฒŒ ๋ฌด์–ธ๊ฐ€์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ). ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋Š” (์˜ˆ๋ฅผ ๋“ค์–ด,์ด ์ •๋ˆ ๋งŽ์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ๊ฒƒ ์ด ๊ธฐ์กด AlgoKit ParingHeap์— ๋”ฐ๋ผ ๋‹ค์†Œ ์•…๋ชฝ ์œ ๋„ ์˜ˆ) ์ƒํƒœ ๊ณต๊ฐ„์˜ ์•Œ ์ˆ˜์—†๋Š” ์ง€์—ญ์—์„œ ์ œํ’ˆ์ด ํŠนํžˆ์ž…๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์ œ์•ˆ(v2.1)

์š”์•ฝ

.NET Core ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _priority queue_ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ฐ ์š”์†Œ์— ์ถ”๊ฐ€๋กœ ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ System.Collections.Generic ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— PriorityQueue<TElement, TPriority> ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์‹ ์กฐ

์šฐ๋ฆฌ์˜ ์„ค๊ณ„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์น™์— ๋”ฐ๋ผ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋” ๋‚˜์€ ์›์น™์„ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ).

  • ๋„“์€ ๋ฒ”์œ„. ์šฐ๋ฆฌ๋Š” .NET Core ๊ณ ๊ฐ์—๊ฒŒ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ๊ท€์ค‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ ค์ง„ ์‹ค์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” Java, Python, C++, Rust์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์–ธ์–ด์— ์กด์žฌํ•˜๋Š” ๊ณ ๊ฐ ๋Œ€๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์„ ๋ถˆํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์œ ์šฉ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋””์ž์ธ ์„ ํƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐฉํ†ตํ–‰ ๊ฒฐ์ •์œผ๋กœ ๊ทน๋„์˜ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค. API๋Š” ํ•œ ๋ฒˆ ๋„์ž…๋˜๋ฉด ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์ด ์˜์›ํžˆ ๊ณ ์ฐฉ๋  ์ฐจ์„ ์˜ ์†”๋ฃจ์…˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ ์„ ํƒ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๋ถ„์„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ ๋งˆ๋น„๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์ด ์—†์„ ์ˆ˜ ์žˆ์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ ˆ์ถฉ์•ˆ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ณ  ๋‚ฉํ’ˆ์„ ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ ๋งˆ์นจ๋‚ด ๊ณ ๊ฐ์ด ์ˆ˜๋…„ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

๊ณ ๊ฐ์˜ ์ž…์žฅ์—์„œ

๊ฐœ๋…์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ๊ฐ ์š”์†Œ์— ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ์š”์†Œ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ปฌ๋ ‰์…˜์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์š”์†Œ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์•ก์„ธ์Šค์™€ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 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();
    }
}

์‚ฌ์šฉ ์˜ˆ

1) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š” ๊ณ ๊ฐ

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 }

2) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ณ ๊ฐ

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

์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ

1. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์š”์†Œ๋ฅผ ์—ด๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

HashSet ์™€ ์œ ์‚ฌํ•˜๊ฒŒ O(n) ์—์„œ ์—ด๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋˜์ง€ ์•Š์€ ์ˆœ์„œ๋กœ. ํšจ์œจ์ ์ธ ๊ตฌํ˜„์€ ์š”์†Œ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์—ด๊ฑฐ๋˜๋„๋ก ๋ณด์žฅํ•˜๋ฉด์„œ ์„ ํ˜• ์‹œ๊ฐ„์— ํž™์„ ์—ด๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” O(n log n)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฃผ๋ฌธ์€ .OrderBy(x => x.Priority) ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์œผ๋กœ ์—ด๊ฑฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ์—ด๊ฑฐ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2. Contains ๋˜๋Š” TryGet ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํž™์˜ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธ, ์ „์ฒด ์ปฌ๋ ‰์…˜์˜ ์—ด๊ฑฐ๋ฅผ ํ•„์š”๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€, ๋ฌด์‹œํ•  ๊ฐ’์„ ๊ฐ€์ง€๊ณ  Contains ๋˜๋Š” TryGet ๋ฐฉ๋ฒ•์ด ์—ด๊ฑฐ ๋ž˜ํผ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปฌ๋ ‰์…˜์— ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ TElement ๊ฐœ์ฒด์˜ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์ฑ…์ž„์— ์†ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. PriorityQueueNode ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Dequeue ๋ฐ TryDequeue ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ Update ๋˜๋Š” Remove ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ธ๋“ค์„ ์ถ”์ ํ•˜๋ ค๋Š” ๊ณ ๊ฐ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์š”์†Œ๋ฅผ ๋Œ€๊ธฐ์—ด์—์„œ ๋นผ๋Š” ๋™์•ˆ ํ•ธ๋“ค ์ถ”์  ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

4. Update ๋˜๋Š” Remove ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํ์—์„œ ๋…ธ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. LinkedListNode<T> ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ LinkedList<T> ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ก

๋ถ€๋ก A: ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ธฐํƒ€ ์–ธ์–ด

| ์–ธ์–ด | ์œ ํ˜• | ๋ฉ”๋ชจ |
|:-:|:-:|:-:|
| ์ž๋ฐ” | ์šฐ์„ ์ˆœ์œ„ ํ | ์ถ”์ƒ ํด๋ž˜์Šค AbstractQueue ํ™•์žฅํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค Queue ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. |
| ๋…น | ๋ฐ”์ด๋„ˆ๋ฆฌํž™ | |
| ์Šค์œ„ํ”„ํŠธ | CFBinaryํž™ | |
| C++ | ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด | |
| ํŒŒ์ด์ฌ | ํž™Q | |
| ์ด๋™ | ํž™ | ํž™ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. |

๋ถ€๋ก B: ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋…ผ์˜ํ•  ๋•Œ _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 ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • FAQ #2 ์ถ”๊ฐ€: _ 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) ์˜ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • FAQ #3 ์ถ”๊ฐ€: _ PriorityQueueNode ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Dequeue ๋ฐ TryDequeue ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?_
  • FAQ #4 ์ถ”๊ฐ€: _ Update ๋˜๋Š” Remove ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋Œ€๊ธฐ์—ด์—์„œ ๋…ธ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?_

๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ;)

์„ค๋ช…์„ ์œ„ํ•œ ์ž‘์€ ์š”์ฒญ:

  • ๋Œ€๊ธฐ์—ด์— ์—†๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ์œ ์ง€๋˜๋„๋ก FAQ 4๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ฆ‰, ์ œ๊ฑฐ๋œ ๊ฒƒ)
  • ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ FAQ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐํ•  ๋•Œ ๋ณด์žฅ(์žˆ๋Š” ๊ฒฝ์šฐ)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@pgolebiowski ์ œ์•ˆ๋œ Merge ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด:

public void Merge(PriorityQueue<TElement, TPriority> other); // O(1)

๋ถ„๋ช…ํžˆ ๊ทธ๋Ÿฌํ•œ ์ž‘์—…์—๋Š” ๋ณต์‚ฌ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ this ๋ฐ other _after_ ๋ณ‘ํ•ฉ์ด ์ˆ˜ํ–‰๋œ ํ›„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋‘ ์ธ์Šคํ„ด์Šค ๋ชจ๋‘ ์‹คํŒจ ํž™ ์†์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด).

@eiriktsarpalis @VisualMelon โ€” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ œ๊ธฐ๋œ ์‚ฌํ•ญ, ETA 2020-10-04๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ/์งˆ๋ฌธ/๊ฑฑ์ •/์ƒ๊ฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต์œ ํ•ด ์ฃผ์„ธ์š” ๐Ÿ˜Š

์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์ œ์•ˆ(v2.2)

์š”์•ฝ

.NET Core ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _priority queue_ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ฐ ์š”์†Œ์— ์ถ”๊ฐ€๋กœ ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ System.Collections.Generic ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— PriorityQueue<TElement, TPriority> ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์‹ ์กฐ

์šฐ๋ฆฌ์˜ ์„ค๊ณ„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์น™์— ๋”ฐ๋ผ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋” ๋‚˜์€ ์›์น™์„ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ).

  • ๋„“์€ ๋ฒ”์œ„. ์šฐ๋ฆฌ๋Š” .NET Core ๊ณ ๊ฐ์—๊ฒŒ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ๊ท€์ค‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ ค์ง„ ์‹ค์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” Java, Python, C++, Rust์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์–ธ์–ด์— ์กด์žฌํ•˜๋Š” ๊ณ ๊ฐ ๋Œ€๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์„ ๋ถˆํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์œ ์šฉ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋””์ž์ธ ์„ ํƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐฉํ†ตํ–‰ ๊ฒฐ์ •์œผ๋กœ ๊ทน๋„์˜ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค. API๋Š” ํ•œ ๋ฒˆ ๋„์ž…๋˜๋ฉด ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์ด ์˜์›ํžˆ ๊ณ ์ฐฉ๋  ์ฐจ์„ ์˜ ์†”๋ฃจ์…˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ ์„ ํƒ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๋ถ„์„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ ๋งˆ๋น„๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์ด ์—†์„ ์ˆ˜ ์žˆ์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ ˆ์ถฉ์•ˆ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ณ  ๋‚ฉํ’ˆ์„ ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ ๋งˆ์นจ๋‚ด ๊ณ ๊ฐ์ด ์ˆ˜๋…„ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

๊ณ ๊ฐ์˜ ์ž…์žฅ์—์„œ

๊ฐœ๋…์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์€ ๊ฐ ์š”์†Œ์— ์—ฐ๊ฒฐ๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ์š”์†Œ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ปฌ๋ ‰์…˜์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์š”์†Œ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์•ก์„ธ์Šค์™€ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 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();
    }
}

์‚ฌ์šฉ ์˜ˆ

1) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š” ๊ณ ๊ฐ

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 }

2) ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ณ ๊ฐ

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

์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ

1. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์š”์†Œ๋ฅผ ์—ด๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

HashSet ์™€ ์œ ์‚ฌํ•˜๊ฒŒ O(n) ์—์„œ ์—ด๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋˜์ง€ ์•Š์€ ์ˆœ์„œ๋กœ. ํšจ์œจ์ ์ธ ๊ตฌํ˜„์€ ์š”์†Œ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์—ด๊ฑฐ๋˜๋„๋ก ๋ณด์žฅํ•˜๋ฉด์„œ ์„ ํ˜• ์‹œ๊ฐ„์— ํž™์„ ์—ด๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” O(n log n)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฃผ๋ฌธ์€ .OrderBy(x => x.Priority) ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ณ ๊ฐ์ด ์ด ์ฃผ๋ฌธ์œผ๋กœ ์—ด๊ฑฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ์—ด๊ฑฐ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2. Contains ๋˜๋Š” TryGet ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํž™์˜ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธ, ์ „์ฒด ์ปฌ๋ ‰์…˜์˜ ์—ด๊ฑฐ๋ฅผ ํ•„์š”๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€, ๋ฌด์‹œํ•  ๊ฐ’์„ ๊ฐ€์ง€๊ณ  Contains ๋˜๋Š” TryGet ๋ฐฉ๋ฒ•์ด ์—ด๊ฑฐ ๋ž˜ํผ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปฌ๋ ‰์…˜์— ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ TElement ๊ฐœ์ฒด์˜ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ์ฑ…์ž„์— ์†ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. PriorityQueueNode ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Dequeue ๋ฐ TryDequeue ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ Update ๋˜๋Š” Remove ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ธ๋“ค์„ ์ถ”์ ํ•˜๋ ค๋Š” ๊ณ ๊ฐ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์š”์†Œ๋ฅผ ๋Œ€๊ธฐ์—ด์—์„œ ๋นผ๋Š” ๋™์•ˆ ํ•ธ๋“ค ์ถ”์  ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

4. Update ๋˜๋Š” Remove ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํ์—์„œ ๋…ธ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. LinkedListNode<T> ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ LinkedList<T> ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ Update ๋˜๋Š” Remove ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

5. Merge ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‘ ๊ฐœ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ผ์ •ํ•œ ์‹œ๊ฐ„์— ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ๊ฐ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋งค๋ ฅ์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์žˆ์Œ์„ ์ž…์ฆํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉฐ ์ด๋ฅผ ๊ณต๊ฐœ API์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ์„ค๊ณ„๋Š” ์‚ฌ์†Œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ API ํ‘œ๋ฉด ๋ฐ ๊ตฌํ˜„์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ˜„์žฌ Merge ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์–‘๋ฐฉํ–ฅ ๋„์–ด์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ๊ณ ๊ฐ์ด ๋ณ‘ํ•ฉ ๊ธฐ๋Šฅ ์ง€์›์— ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ•˜๋ฉด PriorityQueue ์œ ํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„์ง Merge ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์ถœ์‹œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

6. ์ปฌ๋ ‰์…˜์ด ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๊นŒ?

์ปฌ๋ ‰์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ ์š”์†Œ๊ฐ€ ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋กœ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ ๊ฐ์€ ํŠน์ • ์ˆœ์„œ๋กœ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๊ฐ์ด PriorityQueue ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ์–ป์œผ๋ ค๋ฉด TPriority ๋ฐ ์ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ํ•ด๋‹น IComparer<TPriority> ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์€ ๊ฒฐ์ •์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„ ์ž‘์—… ์‹œํ€€์Šค์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ์žฌํ˜„์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ก

๋ถ€๋ก A: ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ธฐํƒ€ ์–ธ์–ด

| ์–ธ์–ด | ์œ ํ˜• | ๋ฉ”๋ชจ |
|:-:|:-:|:-:|
| ์ž๋ฐ” | ์šฐ์„ ์ˆœ์œ„ ํ | ์ถ”์ƒ ํด๋ž˜์Šค AbstractQueue ํ™•์žฅํ•˜๊ณ  Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. |
| ๋…น | ๋ฐ”์ด๋„ˆ๋ฆฌํž™ | |
| ์Šค์œ„ํ”„ํŠธ | CFBinaryํž™ | |
| C++ | ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด | |
| ํŒŒ์ด์ฌ | ํž™Q | |
| ์ด๋™ | ํž™ | ํž™ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. |

๋ถ€๋ก B: ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋…ผ์˜ํ•  ๋•Œ _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) ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • FAQ #5 ์ถ”๊ฐ€: Merge ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋„ ์œ ์ง€ํ•˜๋„๋ก FAQ #4๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • FAQ #6 ์ถ”๊ฐ€: ์ปฌ๋ ‰์…˜์ด ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด 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);
            }
        }
    }

๋‚ด๊ฐ€ ๋ณด๊ธฐ์— ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ์„ค๊ณ„ ์งˆ๋ฌธ์€ ๊ตฌํ˜„์ด ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์„ธ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ณ ์œ ์„ฑ/๋™๋“ฑ์„ฑ์„ ์š”๊ตฌํ•˜๊ณ  ์›๋ณธ ์š”์†Œ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  3. ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด๋ฉฐ ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ‰๋“ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ณ ์œ ์„ฑ์„ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜์—ฌ API ๊ณ„์•ฝ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ถ”๊ฐ€ ์žฅ๋ถ€๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•ธ๋“ค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋œ ์š”์†Œ๋‹น ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถ”๊ฐ€ ํ• ๋‹น์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ ์œ ์„ฑ์„ ์ ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚ด ์ธ์ƒ์˜ ํ•„์š”์„ฑ์„ scenaria์ด ๋ถˆ๋ณ€ ๊ฑฐ์˜ ํ™•์‹ค ์•”์‹œ ์ ์ด๋‹ค (๋ฐฉ๋ฒ• ์˜ˆ : ๊ณต์ง€ ์—…๋ฐ์ดํŠธ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ๋ชจ๋‘ ์˜ˆ ์š”์†Œ ์ž์ฒด์— ์˜ํ•ด ์ƒ‰์ธ ์™ธ๋ถ€ ์‚ฌ์ „์— ์ €์žฅ ํ•ธ๋“ค ์œ„์— ๋‚˜์—ด๋œ์„).
  3. ์—…๋ฐ์ดํŠธ๋Š” ์ „ํ˜€ ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ํž™์˜ ์„ ํ˜• ์ˆœํšŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ์š”์†Œ์˜ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ PriorityQueue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹๋ณ„

์œ„์˜ ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์ƒ์˜ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ํŒจํ„ด์ด ๋ฌด์—‡์ธ์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด 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๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค.

  1. 12% ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„๊ณผ ๋™๋“ฑ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ 88%์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์ตœ์ ํ™”ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐํšŒ ํ…Œ์ด๋ธ”์„ _lazily_ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค( ๋ฐ ํ•˜์œ„ ์‹œํ€€์Šค ์—…๋ฐ์ดํŠธ+์ œ๊ฑฐ์—์„œ ์—…๋ฐ์ดํŠธ). ๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์•ฑ์— ๋Œ€ํ•ด ๋” ์ ์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ฒ˜์Œ์— ์ตœ์ ํ™”๋œ ๊ตฌํ˜„์—์„œ 88% ๋˜๋Š” 12%์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์„ฑ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ต์…˜ 2์™€ 3์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์—ฌ์ „ํžˆ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ 4. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

[๋˜๋Š” ์ด๊ฒƒ์„ ๋” ๋‚˜์€ ์˜ต์…˜ 1๋กœ ๋ณด๊ณ  1์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ถ€๊ธฐ๊ฐ€ ๊ฐ•์š”๋˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฒŒ์œผ๋ฅด๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋™๋“ฑ ๋™์ž‘์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค...]

@stephentoub ๋”ฑ ์ œ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๋ง์„ ํ•˜๋ ค๊ณ  ๋งˆ์Œ

์™œ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์˜ ํ• ๋‹น ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์‹ ๊ฒฝ ์“ฐ๋Š” ์‚ฌ๋žŒ์ด 0.1%์— ๋ถˆ๊ณผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋””์—์„œ ์˜ค๋Š”๊ฐ€?

์ง๊ด€์—์„œ, ์ฆ‰ "์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰ ๋Šฅ๋ ฅ"๋ณด๋‹ค "์ถ”๊ฐ€ ํ• ๋‹น ์—†์Œ"์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋™์ผํ•œ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ฒฝ์šฐ 11-12%์˜ ๊ณ ๊ฐ์ด ์ด ๋™์ž‘์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์›๊ฒฉ์œผ๋กœ ๊ฐ€๊นŒ์šด ๊ณ ๊ฐ์ด "์ถ”๊ฐ€ ํ• ๋‹น ์—†์Œ"์— ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, ์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์›์— ๊ณ ์ฐฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•˜๊ณ  ๋‹ค๋ฅธ ์ฐจ์›(์˜ˆ: ์„ ํ˜ธํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ ˆ์ถฉ์•ˆ)์€ ์žŠ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. "์ถ”๊ฐ€ ํ• ๋‹น ์—†์Œ"์„ ์ œ๊ณตํ•˜๋Š” ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์€ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๋ณด๋‹ค ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์†๋„๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ฒƒ์€ ์ž„์˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๋ฐœ ๋ฌผ๋Ÿฌ์„œ์„œ ๊ณ ๊ฐ์ด ์›ํ•˜๋Š” ๊ฒƒ์— ์ง‘์ค‘ํ•ฉ์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ๊ฐ์˜ 12%๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๋””์ž์ธ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋งค์šฐ ์‹ ์ค‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"์ถ”๊ฐ€ ํ• ๋‹น ์—†์Œ"์„ ์ œ๊ณตํ•˜๋Š” ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์€ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๋ณด๋‹ค ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ C# ๊ตฌํ˜„๊ณผ ๊ทธ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ก ์ ์ธ ๋…ผ๋ฌธ์€ ํ™•์‹คํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ํผ์ฆ์˜ ์ž‘์€ ์กฐ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ณ ๋ฌด๊ฐ€ ๋„๋กœ๋ฅผ ๋งŒ๋‚  ๋•Œ ์ฃผ์–ด์ง„ ํ”Œ๋žซํผ๊ณผ ์ฃผ์–ด์ง„ ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜๊ณ  ํŠน์ • ๊ตฌํ˜„ ๋ฐ ์ผ๋ฐ˜์ /์˜ˆ์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ/์‚ฌ์šฉ ํŒจํ„ด์œผ๋กœ ํŠน์ • ํ”Œ๋žซํผ์—์„œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ฃผ์žฅ์ด ์˜ณ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„/๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ C# ๊ตฌํ˜„๊ณผ ํ•ด๋‹น ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๊ณต์œ ํ•˜์„ธ์š”.

๋‚ด๊ฐ€ ์ธ์šฉํ•œ ๋…ผ๋ฌธ์€ C++์—์„œ ๊ตฌํ˜„์„ ๋น„๊ตํ•˜๊ณ  ๋ฒค์น˜๋งˆํฌ๋งŒ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฐ ์‚ฌ์šฉ ํŒจํ„ด์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด C#์œผ๋กœ ์ด์ „๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋‘ ๋ฐฐ๋กœ ์ค„์—ฌ์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋™๋ฃŒ์—๊ฒŒ ๊ทธ๋Ÿฌํ•œ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์กฐ์น˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pgolebiowski ๊ท€ํ•˜์˜ ์ด์˜ ์ œ๊ธฐ์˜ ์„ฑ๊ฒฉ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์œ ํ˜•์„ ์ง€์ง€ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

  1. 12%์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„๊ณผ ๋™๋“ฑํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐํšŒ ํ…Œ์ด๋ธ”์„ ๋Š๋ฆฌ๊ฒŒ ๊ตฌ์ถ•ํ•˜์—ฌ ๋‚˜๋จธ์ง€ 88%์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค( ๋ฐ ํ•˜์œ„ ์‹œํ€€์Šค ์—…๋ฐ์ดํŠธ+์ œ๊ฑฐ์—์„œ ์—…๋ฐ์ดํŠธ). ๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์•ฑ์— ๋Œ€ํ•ด ๋” ์ ์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 1์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์ œ ์—…๋ฐ์ดํŠธ๊ฐ€ _O(n)_์ด ๋˜์–ด ์‚ฌ์šฉ ํŒจํ„ด์— ๋”ฐ๋ผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์œ ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ๋ฃฉ์—… ํ…Œ์ด๋ธ”๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Update๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ _์ „์—_ ๋™์ผํ•œ ์š”์†Œ๋ฅผ ๋‘ ๋ฒˆ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜๊ณ  ํ‹€๋ฆผ์—†์ด ๋Œ€๊ธฐ์—ด์„ ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

@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());

์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ PriorityQueue

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% ๋Š๋ฆฐ ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์—๋„ˆ์ง€๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚˜๋Š” ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์˜ ์—ด๋“ฑํ•œ ๋ฒ„์ „์ธ 2๊ฐœ์˜ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒŒ๋‹ค๊ฐ€ 2๊ฐ€์ง€ ๋ฒ„์ „์˜ ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๊ฐ–๊ณ  ์‹ถ์–ด๋„ 20์ผ ์ „์˜ ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์ œ์•ˆ(v2.2) ๋ณด๋‹ค "์šฐ์ˆ˜" ๋ฒ„์ „์ด ์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ•์‚ฌ:

  • ์ด ์ œ์•ˆ์€ ํฅ๋ฏธ์ง„์ง„ํ•ฉ๋‹ˆ๋‹ค!! ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ๋‚ด ๊ณ ์„ฑ๋Šฅ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ๊ณ„์‚ฐ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ/๋ชจ์…˜ ๊ณ„ํš ์„ฑ๋Šฅ ๋กœ๋“œ์˜ >90%๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ง€๋ฐฐ์ ์ธ N^m LogN์ด๊ธฐ ๋•Œ๋ฌธ์— PQ enqueue/dequeue์ž…๋‹ˆ๋‹ค.
  • ์ €๋Š” ๋ณ„๋„์˜ PQ ๊ตฌํ˜„์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ 2๋ฐฐ ๋” ๋‚˜์œ ์„ฑ๋Šฅ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PrioritySet์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ด๋ฆ„์ด๋ฉฐ PriorityQueue์™€ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‘ ๋ฒˆ(๋‚ด ์š”์†Œ์— ํ•œ ๋ฒˆ, ๋Œ€๊ธฐ์—ด์— ํ•œ ๋ฒˆ) ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋น„์‹ธ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ๋ณต์‚ฌ๋ณธ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰.
  • ์ปดํ“จํŒ… ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋น„์‹ธ๋ฉด ๋‹จ์ˆœํžˆ (priority: ComputePriority(element), element) ํŠœํ”Œ์„ PQ์— ์ €์žฅํ•˜๊ณ  ์šฐ์„  ์ˆœ์œ„ getter ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ tuple => tuple.priority ์ž…๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ์€ ์ž‘์—…๋ณ„๋กœ ๋˜๋Š” ๋Œ€์•ˆ์ ์œผ๋กœ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋ฒค์น˜๋งˆํ‚น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ์ ํ™”๋œ ๋‹ค์ค‘ ์‹œ์ž‘ ๋‹ค์ค‘ ๋ ๊ฒ€์ƒ‰).
  • ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์—ด๊ฑฐ ๋™์ž‘์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ์™€ ๊ฐ™์€ Dequeue() ์ˆœ์„œ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๊นŒ?
  • ํด๋ก  ์ž‘์—… ๋ฐ ๋ณ‘ํ•ฉ ์ž‘์—… ์ง€์›์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • ์ •์ƒ ์ƒํƒœ ์‚ฌ์šฉ์—์„œ ๊ธฐ๋ณธ ์ž‘์—…์€ 0-ํ• ๋‹น์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋Œ€๊ธฐ์—ด์„ ํ’€๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํ’€๋ง์„ ๋•๊ธฐ ์œ„ํ•ด heapify๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” EnqueueMany ์ง€์›์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ €๋Š” ๋กœ๋ด‡ ๊ณตํ•™๊ณผ ๊ฒŒ์ž„ ๋ชจ๋‘์™€ ๊ด€๋ จ๋œ ๊ณ ์„ฑ๋Šฅ ๊ฒ€์ƒ‰(๋ชจ์…˜ ๊ณ„ํš) ๋ฐ ๊ณ„์‚ฐ ๊ธฐํ•˜ํ•™ ์ฝ”๋“œ(์˜ˆ: ์Šค์œ•๋ผ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜)์—์„œ ์ผํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ง€์ • ์ˆ˜๋™ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์œ ์šฉํ•˜์ง€ ์•Š์€ Top-K ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„(์˜ˆ ๋ฐ ์—…๋ฐ์ดํŠธ ์ง€์› ์—†์Œ) ํ† ๋ก ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ”ผ๋“œ๋ฐฑ์ž…๋‹ˆ๋‹ค.

๋ช…๋ช…:

  • PrioritySet์€ ์ง‘ํ•ฉ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ ๋Œ€๊ธฐ์—ด์€ ISet์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ PriorityQueue๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” UpdatablePriorityQueue ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ:

  • ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์„ฑ๋Šฅ์€ ๋‚ด ๊ธฐํ•˜ํ•™/๊ณ„ํš ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฑฐ์˜ ํ•ญ์ƒ ๋‚ด ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ(>90%)์ž…๋‹ˆ๋‹ค.
  • Func ์ „๋‹ฌ ๊ณ ๋ ค๋˜๋Š” ๋น„๊ตTpriority๋ฅผ โ€‹โ€‹๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ctor์—(๋น„์‹ผ!) ์ปดํ“จํŒ… ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋น„์‹ธ๋ฉด PQ์— (์šฐ์„  ์ˆœ์œ„, ์š”์†Œ)๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์บ์‹œ๋œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์‚ดํŽด๋ณด๋Š” ๋น„๊ต๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ƒ๋‹น์ˆ˜๋Š” PQ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋‚ด์žฅ PQ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๋‚ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€(์—…๋ฐ์ดํŠธ) ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์„ฑ๋Šฅ ๋น„์šฉ์ด 2๋ฐฐ๋ผ๋ฉด ๋‚˜์—๊ฒŒ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๋ถ„์„ / ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์˜ ๊ฒฝ์šฐ @eiriktsarpalis ์ž‘์—…๋‹น ๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ธฐ/
  • ์ƒ์„ฑ์ž๊ฐ€ Heapify๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ํ• ๋‹น์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด IList, List ๋˜๋Š” Array๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • PQ๊ฐ€ ์ดˆ๊ธฐ์— ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ Heapify๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” EnqueueMany๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๊ณ ์„ฑ๋Šฅ์—์„œ๋Š” ์ปฌ๋ ‰์…˜์„ ํ’€๋งํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์š”์†Œ์— ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Clear๋ฅผ 0์ด ์•„๋‹Œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • enqueue/dequeue์˜ ํ• ๋‹น์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ’€๋ง๋œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ 0 ํ• ๋‹น์ž…๋‹ˆ๋‹ค.

์•„ํ”ผ์Šค:

  • ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ๋ณต์ œ๋Š” ๊ตฌํ˜„ ์‹œ ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด๋ฉฐ ์ž์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • ๊ด€๋ จ: ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ์—ด๊ฑฐํ•˜๋Š” ๋ฐ ๋Œ€๊ธฐ์—ด๊ณผ ์œ ์‚ฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? Queue๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ dequeue-order ์ปฌ๋ ‰์…˜์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. new List(myPriorityQueue)๊ฐ€ priorityQueue๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์šฐ์„ ์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Func<TElement, TPriority> ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ปดํ“จํŒ… ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋น„์‹ธ๋ฉด (priority, element) ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  func tuple => tuple.priority ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋•Œ๋•Œ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Peek์ด TItem์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ Enumeration & Enqueue์—๋Š” (TItem, Tpriority)๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ƒ๋‹นํ•œ ์ˆ˜์˜ ๋‚ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ํ•ญ๋ชฉ์— ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‘ ๋ฒˆ(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 |

ํ•ต์‹ฌ ํ…Œ์ดํฌ์•„์›ƒ

  • ~ํŽ˜์–ด๋ง ํž™ ๊ตฌํ˜„์€ ๋ฐฐ์—ด ์ง€์› ๊ตฌํ˜„๋ณด๋‹ค ์ ๊ทผ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์ž˜ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์€ ํž™ ํฌ๊ธฐ(< 50๊ฐœ ์š”์†Œ)์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ 2๋ฐฐ ๋Š๋ฆฌ๊ณ  ์•ฝ 1000๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํฌ๊ธฐ๊ฐ€ 10^6~์ธ ํž™์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ 2๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ๋Œ€๋กœ ํŽ˜์–ด๋ง ํž™์€ ์ƒ๋‹นํ•œ ์–‘์˜ ํž™ ํ• ๋‹น์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • "PrioritySet" ๊ตฌํ˜„์€ ์ผ๊ด€๋˜๊ฒŒ ~์„ธ ๊ฒฝ์Ÿ์ž ์ค‘ ๊ฐ€์žฅ ๋Š๋ฆฝ๋‹ˆ๋‹ค~, ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ถ”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

~์œ„์˜ ๊ด€์ ์—์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ธฐ์ค€ ์–ด๋ ˆ์ด ํž™๊ณผ ํŽ˜์–ด๋ง ํž™ ์ ‘๊ทผ ๋ฐฉ์‹ ์‚ฌ์ด์— ์œ ํšจํ•œ ์ ˆ์ถฉ์ ์ด ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค~.

ํŽธ์ง‘: ๋‚ด ๋ฒค์น˜๋งˆํฌ์—์„œ ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. @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 ์†Œ์Šค ์ฝ”๋“œ์˜ ์ผ๋ฐ˜์ ์ธ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์‚ฌ์šฉ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ๊ฒฝ์Ÿ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ PriorityQueue ๊ตฌํ˜„.
  • ๋‹ค์–‘ํ•œ .NET ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ํ”„๋กœํ† ํƒ€์ž…์˜ ๋ฒค์น˜๋งˆํฌ.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 90%๋Š” ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋ฉด API ๊ณ„์•ฝ์ด ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค(ํ•ธ๋“ค ๋˜๋Š” ์š”์†Œ ๊ณ ์œ ์„ฑ ํ•„์š”).
  • ๋‚ด ๋ฒค์น˜๋งˆํฌ์—์„œ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ตฌํ˜„์— ๋น„ํ•ด 2-3๋ฐฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

์•ž์œผ๋กœ .NET 6์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹จ์ˆœํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์ธ System.Collections.Generic.PriorityQueue ํด๋ž˜์Šค๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ˆ์ด ์ง€์› 4์ฐจ ํž™์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ์—ฌ๊ธฐ ์—์„œ ์ฐพ์„ ์ˆ˜

  2. ํšจ์œจ์ ์ธ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํž™์˜ ํ•„์š”์„ฑ์„ ์ธ์‹ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๋Š” ํŠน์ˆ˜ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์žฅ๋‹จ์ ์ด ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœํ† ํƒ€์ž… [ 1 , 2 ]์„ ํ‰๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋‚˜์ค‘์— ์ด ์œ ํ˜•์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ด ์Šค๋ ˆ๋“œ์˜ ๊ธฐ์—ฌ์ž, ํŠนํžˆ @pgolebiowski ์™€ @TimLovellSmith์—๊ฒŒ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ์€ ๋””์ž์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” ๋ฐ ํฐ ์—ญํ• ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๋””์ž์ธ์„ ๋‹ค๋“ฌ๋Š” ๋™์•ˆ ๊ณ„์†ํ•ด์„œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฐ›๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ž์œผ๋กœ .NET 6์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. [...]

์ข‹์€ ์†Œ๋ฆฌ :)

๋‹จ์ˆœํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์ธ System.Collections.Generic.PriorityQueue ํด๋ž˜์Šค๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ˆ์ด ์ง€์› 4์ฐจ ํž™์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค ์†Œ์œ ์ž๊ฐ€ ์ด ๋ฐฉํ–ฅ์„ ์Šน์ธํ•˜๊ณ  ์›ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋น„ํŠธ์— ๋Œ€ํ•œ API ์„ค๊ณ„๋ฅผ ๊ณ„์† ์ด๋Œ๊ณ  ์ตœ์ข… ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ์ด ์Šค๋ ˆ๋“œ์˜ ๊ธฐ์—ฌ์ž, ํŠนํžˆ @pgolebiowski ์™€ @TimLovellSmith์—๊ฒŒ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ์€ ๋””์ž์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” ๋ฐ ํฐ ์—ญํ• ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์˜ ๋””์ž์ธ์„ ๋‹ค๋“ฌ๋Š” ๋™์•ˆ ๊ณ„์†ํ•ด์„œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฐ›๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋ฆ„ ์—ฌํ–‰์ด์—ˆ์Šต๋‹ˆ๋‹ค :D

System.Collections.Generic.PriorityQueue<TElement, TPriority> ๋Œ€ํ•œ API๊ฐ€ ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ์ž ์žฌ์ ์ธ ํž™ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ˜ธ๋ฅผ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์—ฌํ–‰์— ๋Œ€ํ•ด ๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค! ํ•˜๋‚˜์˜ API์— ๋Œ€ํ•ด ์ด 6๋…„. :) ๊ธฐ๋„ค์Šค๋ฅผ ํš๋“ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰