// 1: [0, 0] // 2: [0, 1] // 3: [0, 2] // 4: [1, 0] // 5: [1, 1] // 6: [1, 2] // 7: [2, 0] // 8: [2, 1] // 9: [2, 2] using System; public static class VariationsWithRep { private static int numberOfCombos; private static int n; private static int k; private static int[] workArr; public static void Main() { n = 3; k = 2; workArr = new int[k]; GenerateVariationsWithRep(); } private static void GenerateVariationsWithRep(int index = 0) { if (index >= k) { PrintCombo(); return; } for (int i = 0; i < n; i++) { workArr[index] = i; GenerateVariationsWithRep(index + 1); } } private static void PrintCombo() { Console.WriteLine($"{++numberOfCombos}: [{string.Join(", ", workArr)}]"); } }
Author: vdonchev
How to generate Combinations with repetition recursively in C#
// 1: [0, 0] // 2: [0, 1] // 3: [0, 2] // 4: [0, 3] // 5: [1, 1] // 6: [1, 2] // 7: [1, 3] // 8: [2, 2] // 9: [2, 3] // 10: [3, 3] using System; public static class CombinationsWithRep { private static int numberofCombos; private static int n; private static int k; private static int[] storageArr; public static void Main() { n = 4; k = 2; storageArr = new int[k]; GenCombinationsWithRep(); } private static void GenCombinationsWithRep(int index = 0, int element = 0) { if (index >= storageArr.Length) { PrintCombo(); return; } for (int i = element; i < n; i++) { storageArr[index] = i; GenCombinationsWithRep(index + 1, i); } } private static void PrintCombo() { Console.WriteLine( "{0,3}: [{1}]", ++numberofCombos, string.Join(", ", storageArr)); } }
How to generate Combinations without repetition recursively in C#
// 1: [0, 1] // 2: [0, 2] // 3: [0, 3] // 4: [1, 2] // 5: [1, 3] // 6: [2, 3] using System; public static class CombinationsNoRep { private static int numberofCombos; private static int n; private static int k; private static int[] storageArr; public static void Main() { n = 4; k = 2; storageArr = new int[k]; GenCombinationsNoRep(); } private static void GenCombinationsNoRep(int index = 0, int element = 0) { if (index >= storageArr.Length) { PrintCombo(); return; } for (int i = element; i < n; i++) { storageArr[index] = i; GenCombinationsNoRep(index + 1, i + 1); } } private static void PrintCombo() { Console.WriteLine( "{0,3}: [{1}]", ++numberofCombos, string.Join(", ", storageArr)); } }
Generic BinaryHeap implementation with C#
namespace BinaryHeap { using System; using System.Collections.Generic; public class BinaryHeap<T> where T : IComparable<T> { private IList<T> heap; public BinaryHeap(T[] elements = null) { if (elements != null) { this.heap = new List<T>(elements); for (int i = elements.Length / 2; i >= 0; i--) { this.HeapifyDown(i); } } else { this.heap = new List<T>(); } } public int Count { get { return this.heap.Count; } } public T ExtractMax() { var max = this.heap[0]; this.heap[0] = this.heap[this.Count - 1]; this.heap.RemoveAt(this.Count - 1); if (this.Count > 0) { this.HeapifyDown(0); } return max; } public T PeekMax() { var max = this.heap[0]; return max; } public void Insert(T node) { this.heap.Add(node); this.HeapifyUp(this.Count - 1); } private void HeapifyDown(int i) { var leftChild = (i * 2) + 1; var rightChild = (i * 2) + 2; var biggest = i; if (leftChild < this.Count && this.heap[leftChild].CompareTo(this.heap[biggest]) > 0) { biggest = leftChild; } if (rightChild < this.Count && this.heap[rightChild].CompareTo(this.heap[biggest]) > 0) { biggest = rightChild; } if (biggest != i) { T old = this.heap[i]; this.heap[i] = this.heap[biggest]; this.heap[biggest] = old; this.HeapifyDown(biggest); } } private void HeapifyUp(int i) { var parent = (i - 1) / 2; while (i > 0 && this.heap[i].CompareTo(this.heap[parent]) > 0) { var temp = this.heap[parent]; this.heap[parent] = this.heap[i]; this.heap[i] = temp; i = parent; parent = (i - 1) / 2; } } } }
Simple implementation of generic BINARY TREE in C#
using System; public class BinaryTree { public BinaryTree( T value, BinaryTree leftNode = null, BinaryTree rightNode = null) { this.Value = value; this.LeftNode = leftNode; this.RightNode = rightNode; } public T Value { get; private set; } public BinaryTree LeftNode { get; private set; } public BinaryTree RightNode { get; private set; } public void EachPreOrder(Action action) { action(this.Value); if (this.LeftNode != null) { this.LeftNode.EachPreOrder(action); } if (this.RightNode != null) { this.RightNode.EachPreOrder(action); } } public void EachInOrder(Action action) { if (this.LeftNode != null) { this.LeftNode.EachPreOrder(action); } action(this.Value); if (this.RightNode != null) { this.RightNode.EachPreOrder(action); } } public void EachPostOrder(Action action) { if (this.LeftNode != null) { this.LeftNode.EachPreOrder(action); } if (this.RightNode != null) { this.RightNode.EachPreOrder(action); } action(this.Value); } }
Simple implementation of generic TREE in C#
using System; using System.Collections.Generic; public class Tree<T> { public Tree( T value, params Tree<T>[] children) { this.Value = value; this.Children = new List<Tree<T>>(); foreach (var child in children) { this.Children.Add(child); } } public T Value { get; private set; } public ICollection<Tree<T>> Children { get; private set; } public void EachTree(Action<T> action) { action(this.Value); foreach (var child in this.Children) { child.EachTree(action); } } public void PrintTree(int indent = 0) { Console.WriteLine(new string(' ', indent * 2) + this.Value); indent++; foreach (var child in this.Children) { child.PrintTree(indent); } } }
Simple dynamic implementation of generic STACK in C#
using System; public class LinkedStack<T> { private LinkedStackNode<T> firstNode; public int Count { get; private set; } public void Push(T element) { var newNode = new LinkedStackNode<T>(element); newNode.NextNode = this.firstNode; this.firstNode = newNode; this.Count++; } public T Pop() { if (this.Count <= 0) { throw new InvalidOperationException("Stack is empty."); } var nodeToPop = this.firstNode; this.firstNode = this.firstNode.NextNode; this.Count--; return nodeToPop.Value; } public T Peek() { var nodeToPeek = this.firstNode; return nodeToPeek.Value; } public T[] ToArray() { var arr = new T[this.Count]; var currentNode = this.firstNode; var arrIndex = 0; while (currentNode != null) { arr[arrIndex] = currentNode.Value; arrIndex++; currentNode = currentNode.NextNode; } return arr; } private class LinkedStackNode<T> { public LinkedStackNode( T value, LinkedStackNode<T> nextNode = null) { this.Value = value; } public T Value { get; private set; } public LinkedStackNode<T> NextNode { get; set; } } }
Simple static implementation of generic STACK in C#
using System; public class ArrayStack<T> : IArrayStack<T> { private const int InitialCapacity = 16; private T[] internalStorage; private int capacity; public ArrayStack(int capacity = InitialCapacity) { this.Capacity = capacity; this.internalStorage = new T[this.Capacity]; } public int Count { get; private set; } private int Capacity { get { return this.capacity; } set { if (value <= 0) { throw new ArgumentOutOfRangeException( nameof(value), "Capacity should be positive integer number."); } this.capacity = value; } } public void Push(T element) { if (this.GrowNeeded()) { this.Grow(); } this.internalStorage[this.Count] = element; this.Count++; } public T Pop() { if (this.Count <= 0) { throw new InvalidOperationException("Stack is empty."); } this.Count--; var element = this.internalStorage[this.Count]; this.internalStorage[this.Count] = default(T); return element; } public T Peek() { var element = this.internalStorage[this.Count - 1]; return element; } public T[] ToArray() { var arr = new T[this.Count]; this.FillStorage(arr); Array.Reverse(arr); return arr; } private bool GrowNeeded() { var result = this.Count >= this.Capacity; return result; } private void Grow() { this.Capacity *= 2; var newStorage = new T[this.Capacity]; this.FillStorage(newStorage); this.internalStorage = newStorage; } private void FillStorage(T[] array) { Array.Copy(this.internalStorage, array, this.Count); } }
Simple dynamic implementation of generic QUEUE in C#
using System; public class LinkedQueue<T> { private LinkedQueueNode<T> start; private LinkedQueueNode<T> end; public LinkedQueue() { this.Count = 0; } public int Count { get; private set; } public void Enqueue(T element) { var newElement = new LinkedQueueNode<T>(element); if (this.Count == 0) { this.start = this.end = newElement; } else { this.end.Next = newElement; this.end = newElement; } this.Count++; } public T Dequeue() { if (this.Count <= 0) { throw new InvalidOperationException("Queue is empty."); } var elementToReturn = this.start; this.start = this.start.Next; this.Count--; return elementToReturn.Value; } public T Peak() { if (this.Count <= 0) { throw new InvalidOperationException("Queue is empty."); } var currentElement = this.start.Value; return currentElement; } public T[] ToArray() { var arrToReturn = new T[this.Count]; var currentNode = this.start; var arrIndex = 0; while (currentNode != null) { arrToReturn[arrIndex] = currentNode.Value; arrIndex++; currentNode = currentNode.Next; } return arrToReturn; } private class LinkedQueueNode<T> { public LinkedQueueNode(T value) { this.Value = value; } public T Value { get; private set; } public LinkedQueueNode<T> Next { get; set; } } }
Simple static implementation of generic QUEUE in C#
public class CircularQueue<T> { private const int InitialCapacity = 16; private T[] storage; private int capacity; private int startIndex; private int endIndex; public CircularQueue(int capacity = InitialCapacity) { this.Capacity = capacity; this.storage = new T[this.Capacity]; } public int Count { get; private set; } private int Capacity { get { return this.capacity; } set { if (value <= 0) { throw new ArgumentOutOfRangeException( nameof(value), "Queue capacity should be a positive integer"); } this.capacity = value; } } public void Enqueue(T element) { if (this.GrowNeeded()) { this.Grow(); } this.storage[this.endIndex] = element; this.endIndex = (this.endIndex + 1) % this.Capacity; this.Count++; } public T Dequeue() { if (this.Count <= 0) { throw new InvalidOperationException("Queue is empty."); } var element = this.storage[this.startIndex]; this.storage[this.startIndex] = default(T); this.startIndex = (this.startIndex + 1) % this.Capacity; this.Count--; return element; } public T[] ToArray() { var resultArray = new T[this.Count]; this.ResizeArrayStorage(resultArray); return resultArray; } private bool GrowNeeded() { var result = this.Count >= this.Capacity; return result; } private void Grow() { var newStorage = new T[this.Capacity * 2]; this.ResizeArrayStorage(newStorage); this.startIndex = 0; this.endIndex = this.Capacity; this.Capacity *= 2; this.storage = newStorage; } private void ResizeArrayStorage(T[] array) { for (int i = 0; i < this.Count; i++) { var currentIndex = (this.startIndex + i) % this.Capacity; array[i] = this.storage[currentIndex]; } } }