axeefectushka

Untitled

Dec 8th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.15 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6.  
  7. class SparseMatrix : IEnumerable<int>
  8. {
  9.     private int _version;
  10.  
  11.     public int N { get; }
  12.  
  13.     public int M { get; }
  14.  
  15.     private List<(int, int, int)> NotZeroElements = new List<(int, int, int)>();
  16.  
  17.     public SparseMatrix(int n = 0, int m = 0)
  18.     {
  19.         if (n > 0 && m > 0)
  20.         {
  21.             N = n;
  22.             M = m;
  23.         }
  24.         else
  25.         {
  26.             throw new ArgumentException();
  27.         }
  28.     }
  29.  
  30.     public int this[int i, int j]
  31.     {
  32.         get
  33.         {
  34.             if (IsCorrect(i, j))
  35.             {
  36.                 for (int k = 0; k < NotZeroElements.Count; k++)
  37.                 {
  38.                     if (NotZeroElements[k].Item1 == i && NotZeroElements[k].Item2 == j)
  39.                     {
  40.                         return NotZeroElements[k].Item3;
  41.                     }
  42.                 }
  43.                 return 0;
  44.             }
  45.             throw new IndexOutOfRangeException();
  46.         }
  47.  
  48.         set
  49.         {
  50.             if (IsCorrect(i, j))
  51.             {
  52.                 if (value != 0)
  53.                 {
  54.                     NotZeroElements.Add((i, j, value));
  55.                     _version++;
  56.                 }
  57.  
  58.                 double Sparsity = 1 - ((double)NotZeroElements.Count / (N * M));
  59.  
  60.  
  61.                 if (Sparsity <= 0.5)
  62.                 {
  63.                     OnNotSparseMatrix(new NotSparseMatrixEventArgs(Sparsity));
  64.                 }
  65.             }
  66.             else throw new IndexOutOfRangeException();
  67.         }
  68.  
  69.     }
  70.     public event EventHandler NotSparseMatrix;
  71.  
  72.     /* Разреженная матрица - это матрица, у которой отношение кол-ва нулевых элементов
  73.      * ко всем элементов больше 0.5. Событие вызывается тогда, когда это отношение <=0.5.
  74.      * Это показывает, что матрица перестала быть разреженная и стала "плотной" и задача больше не
  75.      * является задачей о разреженной матрице.
  76.      */
  77.  
  78.     public delegate void EventHandler(object sender, NotSparseMatrixEventArgs e);
  79.  
  80.     public override string ToString()
  81.     {
  82.         var result = new StringBuilder();
  83.         var k = 0;
  84.  
  85.         for (var i = 0; i < N; i++)
  86.         {
  87.             for (var j = 0; j < M; j++)
  88.             {
  89.                 if (k == NotZeroElements.Count)
  90.                 {
  91.                     result.Append("0");
  92.                     continue;
  93.                 }
  94.                 for (; k < NotZeroElements.Count;)
  95.                 {
  96.                     if (NotZeroElements[k].Item1 == i && NotZeroElements[k].Item2 == j)
  97.                     {
  98.                         result.Append(NotZeroElements[k].Item3.ToString());
  99.                         k++;
  100.                         break;
  101.                     }
  102.                     result.Append("0");
  103.                     break;
  104.                 }
  105.             }
  106.             result.Append(Environment.NewLine);
  107.         }
  108.         return result.ToString().Trim('\n');
  109.     }
  110.  
  111.     protected virtual void OnNotSparseMatrix(NotSparseMatrixEventArgs e)
  112.     {
  113.         NotSparseMatrix?.Invoke(this, e);
  114.     }
  115.  
  116.     private bool IsCorrect(int i, int j) => i >= 0 && j >= 0 && i < N && j < M;
  117.  
  118.     public IEnumerable<(int, int, int)> GetNonZeroElements()
  119.     {
  120.         for (int i = 0; i < NotZeroElements.Count; i++)
  121.         {
  122.             for (int j = 0; j < NotZeroElements.Count - 1; j++)
  123.             {
  124.                 if (NotZeroElements[j].Item2 > NotZeroElements[j + 1].Item2)
  125.                 {
  126.                     var tmp = NotZeroElements[j];
  127.                     NotZeroElements[j] = NotZeroElements[j + 1];
  128.                     NotZeroElements[j + 1] = tmp;
  129.                 }
  130.             }
  131.         }
  132.         return NotZeroElements;
  133.     }
  134.  
  135.     public string GetCount(int x)
  136.     {
  137.         if (x != 0)
  138.         {
  139.             int count = 0;
  140.             for (int i = 0; i < NotZeroElements.Count; i++)
  141.             {
  142.                 if (NotZeroElements[i].Item3 == x)
  143.                 {
  144.                     count++;
  145.                 }
  146.             }
  147.             return $"The element {x} occurs {count} times";
  148.         }
  149.         return $"The element {x} occurs {N * M - NotZeroElements.Count} times";
  150.     }
  151.  
  152.     public IEnumerator<int> GetEnumerator()
  153.     {
  154.         return new SparseMatrixEnumerator(this);
  155.     }
  156.  
  157.     IEnumerator IEnumerable.GetEnumerator()
  158.     {
  159.         return GetEnumerator();
  160.     }
  161.  
  162.     private class SparseMatrixEnumerator : IEnumerator<int>  
  163.     {
  164.         private readonly SparseMatrix _matrix;
  165.         private readonly int _capturedVersion;
  166.         private int _position = -1;
  167.  
  168.         private readonly string str;
  169.         private Regex _pattern = new Regex(@"\s+");
  170.  
  171.         public SparseMatrixEnumerator(SparseMatrix matrix)
  172.         {
  173.             _matrix = matrix;
  174.  
  175.             str = _pattern.Replace(matrix.ToString(), "");
  176.  
  177.             _capturedVersion = matrix._version;
  178.         }
  179.         public int Current => int.Parse(str[_position].ToString());
  180.  
  181.         object IEnumerator.Current => Current;
  182.  
  183.         public bool MoveNext()
  184.         {
  185.             if (_capturedVersion != _matrix._version)
  186.             {
  187.                 throw new InvalidOperationException();
  188.             }
  189.  
  190.             if (_position < str.Length - 1)
  191.             {
  192.                 _position++;
  193.                 return true;
  194.             }
  195.  
  196.             return false;
  197.         }
  198.  
  199.         public void Reset()
  200.         {
  201.             _position = -1;
  202.         }
  203.         public void Dispose()
  204.         {
  205.             // :)
  206.         }
  207.     }
  208. }
  209.  
  210. public class NotSparseMatrixEventArgs : EventArgs
  211. {
  212.     public double Sparsity { get; }
  213.  
  214.     public NotSparseMatrixEventArgs(double sparsity)
  215.     {
  216.         Sparsity = sparsity;
  217.     }
  218. }
  219.  
  220.  
  221. class Program
  222. {
  223.     static void Main()
  224.     {
  225.         SparseMatrix matrix1 = new SparseMatrix(3, 5);
  226.  
  227.         matrix1.NotSparseMatrix += delegate { Console.WriteLine($"Matrix isnt sparse, because sparsity is lower than 0.5"); };
  228.  
  229.         matrix1[0, 0] = 1;
  230.         matrix1[0, 1] = 2;
  231.         matrix1[0, 2] = 0;
  232.         matrix1[0, 3] = 0;
  233.         matrix1[0, 4] = 3;
  234.         matrix1[1, 0] = 4;
  235.         matrix1[1, 1] = 0;
  236.         matrix1[1, 2] = 0;
  237.         matrix1[1, 3] = 0;
  238.         matrix1[1, 4] = 0;
  239.         matrix1[2, 0] = 0;
  240.         matrix1[2, 1] = 5;
  241.         matrix1[2, 2] = 0;
  242.         matrix1[2, 3] = 6;
  243.         matrix1[2, 4] = 0;
  244.  
  245.         Console.WriteLine(matrix1[0, 1]+ Environment.NewLine);
  246.  
  247.         Console.WriteLine(matrix1);
  248.  
  249.         foreach (var item in matrix1)
  250.         {
  251.             Console.Write(item);
  252.         }
  253.         Console.WriteLine();
  254.  
  255.         var NotZeroElements = matrix1.GetNonZeroElements();
  256.  
  257.         foreach (var item in NotZeroElements)
  258.         {
  259.             Console.WriteLine(item);
  260.         }
  261.  
  262.         Console.WriteLine(matrix1.GetCount(0));
  263.         Console.WriteLine(matrix1.GetCount(1));
  264.  
  265.     }
  266. }
Add Comment
Please, Sign In to add comment