Closed Thread
Results 1 to 3 of 3

Thread: priority scheduling

  1. #1
    aszaszin is offline Newbie
    Join Date
    Jul 2010
    Location
    pasig city
    Posts
    1
    Rep Power
    0

    priority scheduling

    To all user....

    plzzzz you may help me to have a program about priority scheduling using c# language????

  2. CODECALL Circuit advertisement
    Join Date
    Always
    Location
    Advertising world
    Posts
    Many

     
  3. #2
    zoranh is offline Programming Professional
    Join Date
    Jul 2010
    Location
    Belgrade, Serbia
    Posts
    207
    Blog Entries
    2
    Rep Power
    7

    Re: priority scheduling

    Priority is easily implemented using the heap structure (Wikipedia Heap Data Strucutre). That is method-of-choice in many applications.

    Heap has property that first element is always the smallest one (or largest if you invert comparison logic).

    I can post you the working code that I once wrote, when I get back home.

  4. #3
    zoranh is offline Programming Professional
    Join Date
    Jul 2010
    Location
    Belgrade, Serbia
    Posts
    207
    Blog Entries
    2
    Rep Power
    7

    Re: priority scheduling

    Here is the heap data structure implemented in C#:

    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Data
    {
        /// <summary>
        /// Implements heap data structure
        /// </summary>
        public class Heap<T>
        {
    
            /// <summary>
            /// Default public constructor.
            /// If this constructor is used then generic type T 
            /// must implement IComparable&lt;T&gt; interface.
            /// </summary>
            public Heap()
            {
                _array = new T[0];
            }
    
            /// <summary>
            /// Public constructor which sets comparer object.
            /// </summary>
            /// <param name="comp">Comparer used to compare elements in the heap.</param>
            public Heap(IComparer<T> comp): this()
            {
                _comparer = comp;
            }
    
            /// <summary>
            /// Increases size of the heap so that at least <paramref name="size"/>
            /// elements can be inserted.
            /// </summary>
            /// <param name="size">Required number of elements that heap 
            /// should be capable to receive.</param>
            private void EnsureSize(int size)
            {
    
                if (AllocatedSize < size)
                {
                    
                    int newSize = AllocatedSize;
                    
                    if (newSize == 0)
                        newSize = 1;
    
                    while (newSize < size)
                        newSize += newSize;
    
                    Array.Resize<T>(ref _array, newSize);
    
                }
            }
    
            /// <summary>
            /// Gets total allocated size of the internal array.
            /// </summary>
            public int AllocatedSize
            {
                get
                {
                    return _array.Length;
                }
            }
    
            /// <summary>
            /// Gets total number of items currently stored in this heap.
            /// </summary>
            public int Count
            {
                get
                {
                    return _count;
                }
            }
    
            /// <summary>
            /// Inserts new element to the heap and rearranges existing elements
            /// so that the heap property remains.
            /// </summary>
            /// <param name="item">Item inserted to the heap.</param>
            public void Insert(T item)
            {
    
                EnsureSize(this.Count + 1);
    
                int pos = _count++;
                bool exchanged = true;
    
                _array[pos] = item;
    
                while (exchanged && pos > 0)
                {
    
                    int newPos = ((pos + 1) >> 1) - 1;
    
                    if (Compare(pos, newPos) < 0)
                        Exchange(pos, newPos);
                    else
                        exchanged = false;
    
                    pos = newPos;
    
                }
    
            }
    
            /// <summary>
            /// Removes smallest element from the heap.
            /// </summary>
            /// <returns>Item remvoed from the heap.</returns>
            /// <exception cref="System.InvalidOperationException">Heap is empty and no element can be removed from it.</exception>
            public T Remove()
            {
    
                if (_count == 0)
                    throw new System.InvalidOperationException("Cannot remove item from empty heap.");
    
                int pos = 0;
                T result = _array[0];
    
                _array[0] = _array[--_count];
    
                while (pos < _count)
                {
    
                    int left = ((pos + 1) << 1) - 1;
                    int right = left + 1;
    
                    if (left >= _count)
                        pos = _count;   // Item has no leaves
                    else if (right >= Count)
                    {
                        // There is only the left leaf
                        if (Compare(pos, left) <= 0)
                        {   // Current element is smaller than the leaf so remains at current position
                            pos = _count;
                        }
                        else
                        {   // Left leaf is smaller than current element, so element descends to leaf's position
                            Exchange(pos, left);
                            pos = left;
                        }
    
                    }
                    else
                    {   // There are both leaves, now compare this element with smaller of the two
    
                        int newPos = left;
                        if (Compare(right, left) < 0)
                            newPos = right;
    
                        if (Compare(newPos, pos) < 0)
                        {   // Smaller leaf is smaller than current element - exchange them and descent to new position
                            Exchange(pos, newPos);
                            pos = newPos;
                        }
                        else
                        {   // Current element does not violate the heap property so descent terminates
                            pos = _count;
                        }
                    }
    
                }
    
                CompactHeap();
    
                return result;
    
            }
    
            /// <summary>
            /// Compares elements on specified positions in the internal array.
            /// </summary>
            /// <param name="pos1">Position of the first element in the array.</param>
            /// <param name="pos2">Position of the second element in the array.</param>
            /// <returns>Returns -1 if element at position <paramref name="pos1"/> is smaller than
            /// element at position <paramref name="pos2"/>.
            /// Returns +1 if element at position <paramref name="pos1"/> is greater than
            /// element at position <paramref name="pos2"/>.
            /// Returns 0 if two elements are equal.</returns>
            private int Compare(int pos1, int pos2)
            {
    
                int result = 0;
    
                if (_comparer != null)
                {
                    result = _comparer.Compare(_array[pos1], _array[pos2]);
                }
                else if (_array[pos1] is IComparable<T>)
                {
                    IComparable<T> c = _array[pos1] as IComparable<T>;
                    result = c.CompareTo(_array[pos2]);
                }
                else
                {
                    throw new System.InvalidOperationException("Unable to compare elements in heap.");
                }
    
                return result;
    
            }
    
            /// <summary>
            /// Reduces size of the internal array if number of items stored in it is small
            /// compared to total allocated size of the array.
            /// </summary>
            private void CompactHeap()
            {
    
                if (_count < _array.Length / 10)
                {
    
                    int newSize = 1;
    
                    while (newSize < _count)
                        newSize = newSize >> 1;
    
                    Array.Resize<T>(ref _array, newSize);
    
                }
                
            }
    
            /// <summary>
            /// Exchanges values at the two positions of the array.
            /// </summary>
            /// <param name="pos1">Position of the first element which exchanges place.</param>
            /// <param name="pos2">Position of the second element which exchanges place.</param>
            private void Exchange(int pos1, int pos2)
            {
                T tmp = _array[pos1];
                _array[pos1] = _array[pos2];
                _array[pos2] = tmp;
            }
    
            /// <summary>
            /// Total number of elements stored in heap.
            /// </summary>
            public int _count;
    
            /// <summary>
            /// Array containing the heap structure.
            /// </summary>
            private T[] _array;
    
            /// <summary>
            /// Comparer used to compare elements in heap.
            /// </summary>
            private IComparer<T> _comparer;
    
        }
    }

Closed Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Priority Queues I
    By chili5 in forum Java Tutorials
    Replies: 6
    Last Post: 11-13-2009, 08:31 AM
  2. A simple priority list.
    By AloneInTheDark in forum Community Projects
    Replies: 6
    Last Post: 03-23-2009, 03:02 PM
  3. priority queue heap.
    By gammaman in forum Programming Theory
    Replies: 2
    Last Post: 03-23-2009, 10:23 AM
  4. priority queue heap.
    By gammaman in forum The Lounge
    Replies: 0
    Last Post: 03-23-2009, 09:35 AM

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts