From 08735d537fe1e2b8f2b394ef77a645987ace7deb Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 18 Dec 2022 02:30:50 +0500 Subject: [PATCH 01/11] =?UTF-8?q?=D0=A0=D0=B5=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20Tape,=20T?= =?UTF-8?q?apeReader,=20BufferedTapeReader.=20=D0=A0=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BA=D0=BE=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=B4=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 11 +++++- src/Tape/BufferedTapeReader.cs | 20 ++++++++++- src/Tape/ITapeReturn.cs | 35 ------------------- src/Tape/Tape.cs | 9 +++-- src/Tape/TapeCollection.cs | 20 +++++++++++ src/Tape/TapeEnumerator.cs | 34 +++++++++++++++++++ src/Tape/TapeReader.cs | 40 ++++++++++++++++++---- src/Tape/TapeReturn.cs | 61 ++++++++++++++++++++++++++++++++++ src/Tape/TapeWriter.cs | 6 ++-- 9 files changed, 184 insertions(+), 52 deletions(-) delete mode 100644 src/Tape/ITapeReturn.cs create mode 100644 src/Tape/TapeCollection.cs create mode 100644 src/Tape/TapeEnumerator.cs create mode 100644 src/Tape/TapeReturn.cs diff --git a/Program.cs b/Program.cs index ca40a0a..55dd84d 100644 --- a/Program.cs +++ b/Program.cs @@ -1,9 +1,18 @@ // See https://aka.ms/new-console-template for more information using algorithms_cs.Algorithm.Sort.External.Merge; +using algorithms_cs.Algorithm.Sort.External.SeriesMerge; +using algorithms_cs.Tape; const int numberWays = 4; const string pathFile = "E:\\projects\\algorithms-cs\\resource\\1.test"; var sort = new MultiwaySort(numberWays, pathFile); -sort.Start(); \ No newline at end of file +sort.Start(); + + +var test = new TapeCollection(pathFile); +foreach (var t in test) +{ + Console.WriteLine(t); +} diff --git a/src/Tape/BufferedTapeReader.cs b/src/Tape/BufferedTapeReader.cs index 4907a2d..d5abcb8 100644 --- a/src/Tape/BufferedTapeReader.cs +++ b/src/Tape/BufferedTapeReader.cs @@ -1,14 +1,28 @@ namespace algorithms_cs.Tape; +/// +/// BufferedTapeReader is a wrapper of TapeReader. +/// BufferedTapeReader implements Peek for check next value of TapeReader without losses this value. +/// public class BufferedTapeReader: TapeReader { private readonly Queue _buffer; - public BufferedTapeReader(string filepath) : base(filepath) + public BufferedTapeReader(string path) : base(path) { _buffer = new Queue(); } + public BufferedTapeReader(StreamReader streamReader) : base(streamReader) + { + _buffer = new Queue(); + } + + /// + /// Peek implements safe viewing of the following value from tape; + /// Peek always returns the value following the current value until the next value is read + /// + /// next value of Tape public TapeReturn Peek() { // Если 2 раза подряд вызвать BufferedTapeReader.Peek() то вернутся одинаковое значение @@ -27,6 +41,10 @@ public TapeReturn Peek() return nextValue; } + /// + /// + /// + /// next value of Tape or buffered previous value public override TapeReturn Next() { return _buffer.TryDequeue(out var bufValue) diff --git a/src/Tape/ITapeReturn.cs b/src/Tape/ITapeReturn.cs deleted file mode 100644 index e742ca3..0000000 --- a/src/Tape/ITapeReturn.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace algorithms_cs.Tape; - - -public enum TapeReturnType -{ - Correct, - TapeEnded, -} - -public class TapeReturn -{ - private T? _value; - private TapeReturnType _type; - - public T? GetValue() - { - return _type == TapeReturnType.Correct ? _value : default; - } - - public TapeReturnType GetType() - { - return _type; - } - - public TapeReturn(T value) - { - _value = value; - _type = TapeReturnType.Correct; - } - - public TapeReturn(TapeReturnType type) - { - _type = type; - } -} diff --git a/src/Tape/Tape.cs b/src/Tape/Tape.cs index 98bb147..f6f5a37 100644 --- a/src/Tape/Tape.cs +++ b/src/Tape/Tape.cs @@ -1,12 +1,11 @@ namespace algorithms_cs.Tape; +/// +/// Base Tape class +/// public class Tape { - protected readonly string Filepath; - - protected Tape(string filepath) + protected Tape() { - Filepath = filepath; } - } \ No newline at end of file diff --git a/src/Tape/TapeCollection.cs b/src/Tape/TapeCollection.cs new file mode 100644 index 0000000..4e6396e --- /dev/null +++ b/src/Tape/TapeCollection.cs @@ -0,0 +1,20 @@ +using System.Collections; + +namespace algorithms_cs.Tape; + +/// +/// TapeCollection represents TapeReader like a collection for using foreach +/// +public class TapeCollection: IEnumerable +{ + private readonly string _path; + public TapeCollection(string path) + { + _path = path; + } + + public IEnumerator GetEnumerator() + { + return new TestEnumerator(_path); + } +} \ No newline at end of file diff --git a/src/Tape/TapeEnumerator.cs b/src/Tape/TapeEnumerator.cs new file mode 100644 index 0000000..fe54db0 --- /dev/null +++ b/src/Tape/TapeEnumerator.cs @@ -0,0 +1,34 @@ +using System.Collections; + +namespace algorithms_cs.Tape; + +public class TestEnumerator : IEnumerator +{ + private BufferedTapeReader _tape; + private readonly string _path; + + public TestEnumerator(string path) + { + _path = path; + _tape = new BufferedTapeReader(path); + } + + /// + /// Checks that the Tape is finished or there is no next number + /// + /// boolean indicating whether a next number is available + public bool MoveNext() + { + return !_tape.IsEnd || _tape.Peek().GetType() == TapeReturnType.Correct; + } + + public void Reset() + { + _tape = new BufferedTapeReader(_path); + } + + /// + /// Returns a next number from the tape + /// + public object Current => _tape.Next().GetValue(); +} \ No newline at end of file diff --git a/src/Tape/TapeReader.cs b/src/Tape/TapeReader.cs index 0afc364..3ad3804 100644 --- a/src/Tape/TapeReader.cs +++ b/src/Tape/TapeReader.cs @@ -1,14 +1,23 @@ namespace algorithms_cs.Tape; +/// +/// The TapeReader representing the file that contains numbers. +/// By using StreamReader for reading the file and .Next() for extracting the double number. +/// public class TapeReader : Tape { private readonly StreamReader? _file; - public TapeReader(string filepath) : base(filepath) + /// + /// The TapeReader representing the file that contains numbers. + /// By using StreamReader for reading the file and .Next() for extracting the double number. + /// + /// the path of file + public TapeReader(string path) { try { - _file = new StreamReader(Filepath); + _file = new StreamReader(path); } catch (FileNotFoundException e) { @@ -22,25 +31,42 @@ public TapeReader(string filepath) : base(filepath) } } - // This methods returns a boolean value describing is the file ended - public bool IsEnd => _file!.Peek() == -1; + /// + /// The TapeReader representing the file that contains numbers. + /// By using StreamReader for reading the file and .Next() for extracting the double number. + /// + /// StreamReader + public TapeReader(StreamReader streamReader) + { + _file = streamReader; + } + /// + /// Returns true if the file ends + /// + public bool IsEnd => _file!.Peek() == -1; + + /// + /// Close the StreamReader + /// public void Close() { _file?.Close(); } - + private bool ValueIsDigit(int value) { return value is >= 48 and <= 57; } - // This methods reading file and returns a next number from this file + /// + /// Read next number from the file + /// + /// a next double number from StreamReader public virtual TapeReturn Next() { var token = ""; var tokenIsNumber = false; - //_isHaveNumber = IsEnd(); while (!IsEnd) { diff --git a/src/Tape/TapeReturn.cs b/src/Tape/TapeReturn.cs new file mode 100644 index 0000000..afa5779 --- /dev/null +++ b/src/Tape/TapeReturn.cs @@ -0,0 +1,61 @@ +namespace algorithms_cs.Tape; + +/// +/// TapeReturnType representing tape of return value +/// +[Flags] +public enum TapeReturnType +{ + /// + /// Correct using when next value was successfully read + /// + Correct = 1, + + /// + /// TapeEnded using when tape was ended or next value was not read + /// + TapeEnded = 2, +} + +/// +/// +/// +/// +public class TapeReturn +{ + private T? _value; + private TapeReturnType _type; + + public T? GetValue() + { + return _type == TapeReturnType.Correct ? _value : default; + } + + public TapeReturnType GetType() + { + return _type; + } + + /// + /// Default initialization with TapeEnded type + /// + public TapeReturn() + { + _type = TapeReturnType.TapeEnded; + } + + /// + /// Correct is the default type, since if a value is passed, it's already right. + /// + /// any value that to be passed from Tape + public TapeReturn(T value) + { + _value = value; + _type = TapeReturnType.Correct; + } + + public TapeReturn(TapeReturnType type) + { + _type = type; + } +} diff --git a/src/Tape/TapeWriter.cs b/src/Tape/TapeWriter.cs index 620d2bf..9b26aa6 100644 --- a/src/Tape/TapeWriter.cs +++ b/src/Tape/TapeWriter.cs @@ -7,12 +7,12 @@ public class TapeWriter : Tape public bool Recorded => _recorded; - public TapeWriter(string filepath) : base(filepath) + public TapeWriter(string path) { try { _recorded = false; - _file = new StreamWriter(Filepath); + _file = new StreamWriter(path); } catch (Exception e) { @@ -29,6 +29,6 @@ public void Close() public void Write(T value) { _recorded = true; - _file.Write(value.ToString() + " "); + _file.Write(value!.ToString() + " "); } } \ No newline at end of file From 42228b4367f3741d6fd81a491260796ad538ef93 Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 18 Dec 2022 02:32:50 +0500 Subject: [PATCH 02/11] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BD=D0=B0=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=D1=85=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D1=85=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=B0=D0=BB?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 6a4491a..ea6ab9d 100644 --- a/readme.md +++ b/readme.md @@ -150,7 +150,7 @@ _____ 1. Инициализация -| Read | Write | +| Write | Read | |---------------------|--------| | `12`, `-6, 12, 645` | `____` | | `4`, `12, 54` | `____` | @@ -174,7 +174,7 @@ _____ 2.2. -| Read | Write | +| Write | Read | |------------------------------------|----------------------------------| | `-6 -2,0001 1 2 4 12 12 12 54 645` | ~~1, 2, 4, 12~~ | | `____` | ~~-6, -2.0001, 12, 12, 54, 645~~ | From 78bb63f45d067074f64a8f973b77113f774442e9 Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 18 Dec 2022 03:19:46 +0500 Subject: [PATCH 03/11] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Serial/ISeriesReturn.cs | 37 ------------------------ src/Serial/Series.cs | 11 +++++--- src/Serial/SeriesReturn.cs | 56 +++++++++++++++++++++++++++++++++++++ src/Tape/Tape.cs | 7 +++++ src/Tape/TapeCollection.cs | 11 ++++++-- src/Tape/TapeEnumerator.cs | 12 ++++++-- src/Tape/TapeReader.cs | 2 +- src/Tape/TapeReturn.cs | 4 --- 8 files changed, 88 insertions(+), 52 deletions(-) delete mode 100644 src/Serial/ISeriesReturn.cs create mode 100644 src/Serial/SeriesReturn.cs diff --git a/src/Serial/ISeriesReturn.cs b/src/Serial/ISeriesReturn.cs deleted file mode 100644 index d10bd11..0000000 --- a/src/Serial/ISeriesReturn.cs +++ /dev/null @@ -1,37 +0,0 @@ -using algorithms_cs.Tape; - -namespace algorithms_cs.Serial; - -public enum SeriesReturnType -{ - Correct, - SeriesEnded, - TapeEnded, -} - -public class SeriesReturn -{ - private T? _value; - private SeriesReturnType _type; - - public T? GetValue() - { - return _type == SeriesReturnType.Correct ? _value : default; - } - - public SeriesReturnType GetType() - { - return _type; - } - - public SeriesReturn(T value) - { - _value = value; - _type = SeriesReturnType.Correct; - } - - public SeriesReturn(SeriesReturnType type) - { - _type = type; - } -} \ No newline at end of file diff --git a/src/Serial/Series.cs b/src/Serial/Series.cs index 9670c1e..7b2854c 100644 --- a/src/Serial/Series.cs +++ b/src/Serial/Series.cs @@ -2,6 +2,9 @@ namespace algorithms_cs.Serial; +/// +/// Series representing a sequence of increasing numbers over BufferedTapeReader. +/// public class Series { private readonly BufferedTapeReader _lsTape; @@ -13,6 +16,10 @@ public Series(BufferedTapeReader tape) _lsTape = tape; } + /// + /// + /// + /// A next value if it is greater than the previous value public SeriesReturn Next() { var peekValue = _lsTape.Peek(); @@ -24,12 +31,8 @@ public SeriesReturn Next() _buffer = value.GetValue(); return new SeriesReturn(value.GetValue()); } - return new SeriesReturn(SeriesReturnType.SeriesEnded); - - //return new CorrectSeriesReturn(value.Value, SeriesReturnType.Correct); } - return new SeriesReturn(SeriesReturnType.TapeEnded); } } \ No newline at end of file diff --git a/src/Serial/SeriesReturn.cs b/src/Serial/SeriesReturn.cs new file mode 100644 index 0000000..ad63480 --- /dev/null +++ b/src/Serial/SeriesReturn.cs @@ -0,0 +1,56 @@ +using algorithms_cs.Tape; + +namespace algorithms_cs.Serial; + +/// +/// SeriesReturnTape representing series type of return value +/// +[Flags] +public enum SeriesReturnType +{ + /// + /// Correct using when next value was successfully received + /// + Correct = 1, + + /// + /// SeriesEnded using when series was ended or next value was not received + /// + SeriesEnded = 2, + + /// + /// TapeEnded using when tape was ended or next value was not read + /// + TapeEnded = 3, +} + +public class SeriesReturn +{ + private T? _value; + private SeriesReturnType _type; + + public T? GetValue() + { + return _type == SeriesReturnType.Correct ? _value : default; + } + + public SeriesReturnType GetType() + { + return _type; + } + + /// + /// Correct is the default series, since if a value is passed, it's already right. + /// + /// any value that to be passed from Series + public SeriesReturn(T value) + { + _value = value; + _type = SeriesReturnType.Correct; + } + + public SeriesReturn(SeriesReturnType type) + { + _type = type; + } +} \ No newline at end of file diff --git a/src/Tape/Tape.cs b/src/Tape/Tape.cs index f6f5a37..9c4e564 100644 --- a/src/Tape/Tape.cs +++ b/src/Tape/Tape.cs @@ -5,7 +5,14 @@ /// public class Tape { + public readonly string? TapePath; + protected Tape() { } + + protected Tape(string path) + { + TapePath = path; + } } \ No newline at end of file diff --git a/src/Tape/TapeCollection.cs b/src/Tape/TapeCollection.cs index 4e6396e..6d6a372 100644 --- a/src/Tape/TapeCollection.cs +++ b/src/Tape/TapeCollection.cs @@ -7,14 +7,19 @@ namespace algorithms_cs.Tape; /// public class TapeCollection: IEnumerable { - private readonly string _path; + private readonly BufferedTapeReader _tape; public TapeCollection(string path) { - _path = path; + _tape = new BufferedTapeReader(path); + } + + public TapeCollection(BufferedTapeReader tape) + { + _tape = tape; } public IEnumerator GetEnumerator() { - return new TestEnumerator(_path); + return new TapeEnumerator(_tape); } } \ No newline at end of file diff --git a/src/Tape/TapeEnumerator.cs b/src/Tape/TapeEnumerator.cs index fe54db0..3da7494 100644 --- a/src/Tape/TapeEnumerator.cs +++ b/src/Tape/TapeEnumerator.cs @@ -2,16 +2,22 @@ namespace algorithms_cs.Tape; -public class TestEnumerator : IEnumerator +public class TapeEnumerator : IEnumerator { private BufferedTapeReader _tape; - private readonly string _path; + private readonly string? _path; - public TestEnumerator(string path) + public TapeEnumerator(string path) { _path = path; _tape = new BufferedTapeReader(path); } + + public TapeEnumerator(BufferedTapeReader tape) + { + _path = tape.TapePath; + _tape = tape; + } /// /// Checks that the Tape is finished or there is no next number diff --git a/src/Tape/TapeReader.cs b/src/Tape/TapeReader.cs index 3ad3804..e72f3ec 100644 --- a/src/Tape/TapeReader.cs +++ b/src/Tape/TapeReader.cs @@ -13,7 +13,7 @@ public class TapeReader : Tape /// By using StreamReader for reading the file and .Next() for extracting the double number. /// /// the path of file - public TapeReader(string path) + public TapeReader(string path) : base(path) { try { diff --git a/src/Tape/TapeReturn.cs b/src/Tape/TapeReturn.cs index afa5779..2ba32b9 100644 --- a/src/Tape/TapeReturn.cs +++ b/src/Tape/TapeReturn.cs @@ -17,10 +17,6 @@ public enum TapeReturnType TapeEnded = 2, } -/// -/// -/// -/// public class TapeReturn { private T? _value; From 8bcadf5f8d6c8a9d9e0d09ace5ad8181bbe88138 Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 18 Dec 2022 16:44:53 +0500 Subject: [PATCH 04/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B=D0=B5=20=D1=81=D0=B5=D1=80=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Serial/SeriesEnumerable.cs | 23 +++++++++++++++++++ src/Serial/SeriesEnumerator.cs | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/Serial/SeriesEnumerable.cs create mode 100644 src/Serial/SeriesEnumerator.cs diff --git a/src/Serial/SeriesEnumerable.cs b/src/Serial/SeriesEnumerable.cs new file mode 100644 index 0000000..d012abe --- /dev/null +++ b/src/Serial/SeriesEnumerable.cs @@ -0,0 +1,23 @@ +using System.Collections; +using algorithms_cs.Tape; + +namespace algorithms_cs.Serial; + +/// +/// SeriesEnumerable represents Series over the tape like a collection for using foreach +/// Series representing a sequence of increasing numbers over tape. +/// +public class SeriesEnumerable: IEnumerable +{ + private readonly BufferedTapeReader _tape; + + public SeriesEnumerable(BufferedTapeReader tape) + { + _tape = tape; + } + + public IEnumerator GetEnumerator() + { + return new SeriesEnumerator(_tape); + } +} \ No newline at end of file diff --git a/src/Serial/SeriesEnumerator.cs b/src/Serial/SeriesEnumerator.cs new file mode 100644 index 0000000..7c664c9 --- /dev/null +++ b/src/Serial/SeriesEnumerator.cs @@ -0,0 +1,40 @@ +using System.Collections; +using algorithms_cs.Tape; + +namespace algorithms_cs.Serial; + +public class SeriesEnumerator: IEnumerator +{ + private readonly BufferedTapeReader _tape; + private double _previous; + + public SeriesEnumerator(BufferedTapeReader tape) + { + _tape = tape; + _previous = double.MinValue; + } + + /// + /// Checks a correct of next number + /// + /// boolean indicating whether a next number is available and more than the previous number + public bool MoveNext() + { + var value = _tape.Peek(); + if (value.GetType() == TapeReturnType.Correct) + { + if (_previous <= value.GetValue()) + { + _previous = value.GetValue(); + return true; + } + } + return false; + } + + public void Reset() + { + } + + public object Current => _tape.Next().GetValue(); +} \ No newline at end of file From e371b2ba27863fa4fcc2ff9f6755462f570b5bd0 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 19 Dec 2022 18:59:55 +0500 Subject: [PATCH 05/11] repath for series merge --- .../Sort/External/{Merge => SeriesMerge}/Collector.cs | 3 +-- .../MergeSort.cs => SeriesMerge/ExternalSeriesMergeSort.cs} | 2 +- .../Sort/External/{Merge => SeriesMerge}/RotatingDominoes.cs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) rename src/Algorithm/Sort/External/{Merge => SeriesMerge}/Collector.cs (95%) rename src/Algorithm/Sort/External/{Merge/MergeSort.cs => SeriesMerge/ExternalSeriesMergeSort.cs} (98%) rename src/Algorithm/Sort/External/{Merge => SeriesMerge}/RotatingDominoes.cs (89%) diff --git a/src/Algorithm/Sort/External/Merge/Collector.cs b/src/Algorithm/Sort/External/SeriesMerge/Collector.cs similarity index 95% rename from src/Algorithm/Sort/External/Merge/Collector.cs rename to src/Algorithm/Sort/External/SeriesMerge/Collector.cs index 9528a24..e9111b9 100644 --- a/src/Algorithm/Sort/External/Merge/Collector.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/Collector.cs @@ -1,7 +1,6 @@ -using System.Diagnostics; using algorithms_cs.Serial; -namespace algorithms_cs.Algorithm.Sort.External.Merge; +namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; internal struct MinReturn { diff --git a/src/Algorithm/Sort/External/Merge/MergeSort.cs b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs similarity index 98% rename from src/Algorithm/Sort/External/Merge/MergeSort.cs rename to src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs index 60515e9..269a736 100644 --- a/src/Algorithm/Sort/External/Merge/MergeSort.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs @@ -1,7 +1,7 @@ using algorithms_cs.Serial; using algorithms_cs.Tape; -namespace algorithms_cs.Algorithm.Sort.External.Merge; +namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; public class MultiwaySort: Sort { diff --git a/src/Algorithm/Sort/External/Merge/RotatingDominoes.cs b/src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs similarity index 89% rename from src/Algorithm/Sort/External/Merge/RotatingDominoes.cs rename to src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs index b7bcf8c..4ecc625 100644 --- a/src/Algorithm/Sort/External/Merge/RotatingDominoes.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs @@ -1,4 +1,4 @@ -namespace algorithms_cs.Algorithm.Sort.External.Merge; +namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; public class RotatingDominoes { From 7f3f0d1c98e055f0a7a8f65f8e23627be2cb6ba3 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 19 Dec 2022 19:57:07 +0500 Subject: [PATCH 06/11] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B8=D1=8E=20=D0=B4=D0=B6=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=BA=D0=B0=D0=BC=D0=B8.=20=D1=82=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D0=BE=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=20=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=20TapeReturn.=20=D0=9D=D1=83=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=BC=D0=BE=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D1=82=D1=8C=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20***Return?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 27 ++++++++++++++----- .../SeriesMerge/ExternalSeriesMergeSort.cs | 1 - src/Serial/SeriesEnumerable.cs | 14 +++++++--- src/Serial/SeriesEnumerator.cs | 17 ++++++++---- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/Program.cs b/Program.cs index 55dd84d..90321cc 100644 --- a/Program.cs +++ b/Program.cs @@ -2,17 +2,32 @@ using algorithms_cs.Algorithm.Sort.External.Merge; using algorithms_cs.Algorithm.Sort.External.SeriesMerge; +using algorithms_cs.Serial; using algorithms_cs.Tape; const int numberWays = 4; -const string pathFile = "E:\\projects\\algorithms-cs\\resource\\1.test"; +const string pathFile = "E:\\projects\\algorithms-cs\\resource\\4.txt"; var sort = new MultiwaySort(numberWays, pathFile); sort.Start(); +// +// var test = new BufferedTapeReader(pathFile); +// var test2 = new TapeCollection(pathFile); +// var ss = new SeriesEnumerable(test); +// +// foreach (var VARIABLE in test2) +// { +// Console.WriteLine(VARIABLE); +// } +// +// while (!ss.IsEnd) +// { +// foreach (var VARIABLE in ss) +// { +// Console.WriteLine($"{VARIABLE.GetType()} {VARIABLE.GetValue()}"); +// } +// Console.WriteLine(); +// } + -var test = new TapeCollection(pathFile); -foreach (var t in test) -{ - Console.WriteLine(t); -} diff --git a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs index 269a736..18fa59e 100644 --- a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs @@ -76,7 +76,6 @@ private void InitTapeSplit() var tapeWrites = _dominoes.WriteFilenames.Select(filename => new TapeWriter(filename)).ToList(); var indexTape = 0; - if (indexTape >= _n) throw new IndexOutOfRangeException("indexTape out of range tapeWrites"); var s1 = new Series(initTape); SeriesReturn value; diff --git a/src/Serial/SeriesEnumerable.cs b/src/Serial/SeriesEnumerable.cs index d012abe..bdde1ef 100644 --- a/src/Serial/SeriesEnumerable.cs +++ b/src/Serial/SeriesEnumerable.cs @@ -7,17 +7,25 @@ namespace algorithms_cs.Serial; /// SeriesEnumerable represents Series over the tape like a collection for using foreach /// Series representing a sequence of increasing numbers over tape. /// -public class SeriesEnumerable: IEnumerable +public class SeriesEnumerable: IEnumerable> { private readonly BufferedTapeReader _tape; public SeriesEnumerable(BufferedTapeReader tape) { _tape = tape; + _tape.Peek(); } - - public IEnumerator GetEnumerator() + + public bool IsEnd => _tape.Peek().GetType() == TapeReturnType.TapeEnded; + + public IEnumerator> GetEnumerator() { return new SeriesEnumerator(_tape); } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } } \ No newline at end of file diff --git a/src/Serial/SeriesEnumerator.cs b/src/Serial/SeriesEnumerator.cs index 7c664c9..91f6e55 100644 --- a/src/Serial/SeriesEnumerator.cs +++ b/src/Serial/SeriesEnumerator.cs @@ -1,13 +1,12 @@ -using System.Collections; -using algorithms_cs.Tape; +using algorithms_cs.Tape; namespace algorithms_cs.Serial; -public class SeriesEnumerator: IEnumerator +public class SeriesEnumerator: IEnumerator> { private readonly BufferedTapeReader _tape; private double _previous; - + public SeriesEnumerator(BufferedTapeReader tape) { _tape = tape; @@ -34,7 +33,15 @@ public bool MoveNext() public void Reset() { + // throw new NotImplementedException(); } - public object Current => _tape.Next().GetValue(); + public object Current => _tape.Next(); + + TapeReturn IEnumerator>.Current => (TapeReturn)Current; + + public void Dispose() + { + // throw new NotImplementedException(); + } } \ No newline at end of file From 6171ead52536ae5e5df19a132d748c0ee7ad8976 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 19 Dec 2022 20:08:25 +0500 Subject: [PATCH 07/11] fix crash when file is exists --- .../Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs index 18fa59e..7eb7075 100644 --- a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs @@ -57,7 +57,7 @@ public void Start() private void TrashDelete(string outFilename) { - File.Copy(outFilename, _sourceFilePath+"-sorted"); + if (!File.Exists(_sourceFilePath+"-sorted")) File.Copy(outFilename, _sourceFilePath+"-sorted"); foreach (var filename in _dominoes.ReadFilenames) { File.Delete(filename); From 8de022730289ff3a5949c5e0032c90e695469f11 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 19 Dec 2022 20:38:20 +0500 Subject: [PATCH 08/11] merge two **Return into UtilType. --- Program.cs | 3 - .../Sort/External/SeriesMerge/Collector.cs | 19 ++++--- .../SeriesMerge/ExternalSeriesMergeSort.cs | 23 ++++---- src/Tape/TapeReturn.cs | 57 ------------------- src/{ => Utils}/Serial/Series.cs | 14 ++--- src/{ => Utils}/Serial/SeriesEnumerable.cs | 10 ++-- src/{ => Utils}/Serial/SeriesEnumerator.cs | 10 ++-- src/{ => Utils}/Tape/BufferedTapeReader.cs | 14 ++--- src/{ => Utils}/Tape/Tape.cs | 2 +- src/{ => Utils}/Tape/TapeCollection.cs | 2 +- src/{ => Utils}/Tape/TapeEnumerator.cs | 4 +- src/{ => Utils}/Tape/TapeReader.cs | 10 ++-- src/{ => Utils}/Tape/TapeWriter.cs | 2 +- .../SeriesReturn.cs => Utils/UtilReturn.cs} | 31 ++++++---- 14 files changed, 75 insertions(+), 126 deletions(-) delete mode 100644 src/Tape/TapeReturn.cs rename src/{ => Utils}/Serial/Series.cs (65%) rename src/{ => Utils}/Serial/SeriesEnumerable.cs (67%) rename src/{ => Utils}/Serial/SeriesEnumerator.cs (75%) rename src/{ => Utils}/Tape/BufferedTapeReader.cs (79%) rename src/{ => Utils}/Tape/Tape.cs (85%) rename src/{ => Utils}/Tape/TapeCollection.cs (93%) rename src/{ => Utils}/Tape/TapeEnumerator.cs (89%) rename src/{ => Utils}/Tape/TapeReader.cs (91%) rename src/{ => Utils}/Tape/TapeWriter.cs (93%) rename src/{Serial/SeriesReturn.cs => Utils/UtilReturn.cs} (60%) diff --git a/Program.cs b/Program.cs index 90321cc..ead3de5 100644 --- a/Program.cs +++ b/Program.cs @@ -1,9 +1,6 @@ // See https://aka.ms/new-console-template for more information -using algorithms_cs.Algorithm.Sort.External.Merge; using algorithms_cs.Algorithm.Sort.External.SeriesMerge; -using algorithms_cs.Serial; -using algorithms_cs.Tape; const int numberWays = 4; const string pathFile = "E:\\projects\\algorithms-cs\\resource\\4.txt"; diff --git a/src/Algorithm/Sort/External/SeriesMerge/Collector.cs b/src/Algorithm/Sort/External/SeriesMerge/Collector.cs index e9111b9..78e8209 100644 --- a/src/Algorithm/Sort/External/SeriesMerge/Collector.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/Collector.cs @@ -1,22 +1,23 @@ -using algorithms_cs.Serial; +using algorithms_cs.Utils; +using algorithms_cs.Utils.Serial; namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; internal struct MinReturn { - public SeriesReturn Element; + public UtilReturn Element; public int Index; } public class Collector { private readonly List _seriesCollection; - private readonly List> _bufferSeriesReturns; + private readonly List> _bufferSeriesReturns; public Collector(List seriesCollection) { _seriesCollection = seriesCollection; - _bufferSeriesReturns = new List>(); + _bufferSeriesReturns = new List>(); foreach (var seriesReturn in _seriesCollection) { _bufferSeriesReturns.Add(seriesReturn.Next()); @@ -35,7 +36,7 @@ private MinReturn Min() for (var i = 0; i < _bufferSeriesReturns.Count; i++) { - if (_bufferSeriesReturns[i].GetType() == SeriesReturnType.Correct + if (_bufferSeriesReturns[i].GetType() == UtilReturnType.Correct && value > _bufferSeriesReturns[i].GetValue()) { value = _bufferSeriesReturns[i].GetValue(); @@ -47,16 +48,16 @@ private MinReturn Min() return minReturn; } - private bool IsEmpty() => _bufferSeriesReturns.All(x => x.GetType() != SeriesReturnType.Correct); + private bool IsEmpty() => _bufferSeriesReturns.All(x => x.GetType() != UtilReturnType.Correct); - public bool TapeEnded() => _bufferSeriesReturns.All(x => x.GetType() == SeriesReturnType.TapeEnded); + public bool TapeEnded() => _bufferSeriesReturns.All(x => x.GetType() == UtilReturnType.TapeEnded); - public SeriesReturn Next() + public UtilReturn Next() { // Returns minimal Correct value from multiple Series, else returns SeriesEnd var seriesEnded = IsEmpty(); - if (seriesEnded) return new SeriesReturn(SeriesReturnType.SeriesEnded); + if (seriesEnded) return new UtilReturn(UtilReturnType.SeriesEnded); var minElement = Min(); diff --git a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs index 7eb7075..6b3af98 100644 --- a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs +++ b/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs @@ -1,5 +1,6 @@ -using algorithms_cs.Serial; -using algorithms_cs.Tape; +using algorithms_cs.Utils; +using algorithms_cs.Utils.Serial; +using algorithms_cs.Utils.Tape; namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; @@ -9,7 +10,7 @@ public class MultiwaySort: Sort private readonly string _tempDirectory; private readonly int _n; private RotatingDominoes _dominoes; - private List _tapes; + private List _tapes; private readonly string _templateNameFiles; public MultiwaySort(int N, string sourceFilePath) @@ -25,7 +26,7 @@ public MultiwaySort(int N, string sourceFilePath) _templateNameFiles = _tempDirectory + "tempfile-{0}.multiwaymergesort"; Directory.CreateDirectory(_tempDirectory); - _tapes = new List(); + _tapes = new List(); _n = N; var firstFilenames = new List(); @@ -78,23 +79,23 @@ private void InitTapeSplit() var indexTape = 0; var s1 = new Series(initTape); - SeriesReturn value; + UtilReturn value; do { do { value = s1.Next(); - if (value.GetType() == SeriesReturnType.Correct) + if (value.GetType() == UtilReturnType.Correct) { tapeWrites[indexTape].Write(value.GetValue()); } - } while (value.GetType() == SeriesReturnType.Correct); + } while (value.GetType() == UtilReturnType.Correct); indexTape += 1; if (indexTape >= _n) indexTape = 0; s1 = new Series(initTape); - } while (value?.GetType() != SeriesReturnType.TapeEnded); + } while (value?.GetType() != UtilReturnType.TapeEnded); foreach (var tape in tapeWrites) { @@ -130,17 +131,17 @@ private int MainRound() var multipleSeries = new List(); multipleSeries.AddRange(readTapes.Select(tape => new Series(tape))); var collector = new Collector(multipleSeries); - SeriesReturn value; + UtilReturn value; do { do { value = collector.Next(); - if (value.GetType() == SeriesReturnType.Correct) + if (value.GetType() == UtilReturnType.Correct) { writeTapes[indexTape].Write(value.GetValue()); } - } while (value.GetType() == SeriesReturnType.Correct); + } while (value.GetType() == UtilReturnType.Correct); count++; if (count > 2) count = 2; diff --git a/src/Tape/TapeReturn.cs b/src/Tape/TapeReturn.cs deleted file mode 100644 index 2ba32b9..0000000 --- a/src/Tape/TapeReturn.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace algorithms_cs.Tape; - -/// -/// TapeReturnType representing tape of return value -/// -[Flags] -public enum TapeReturnType -{ - /// - /// Correct using when next value was successfully read - /// - Correct = 1, - - /// - /// TapeEnded using when tape was ended or next value was not read - /// - TapeEnded = 2, -} - -public class TapeReturn -{ - private T? _value; - private TapeReturnType _type; - - public T? GetValue() - { - return _type == TapeReturnType.Correct ? _value : default; - } - - public TapeReturnType GetType() - { - return _type; - } - - /// - /// Default initialization with TapeEnded type - /// - public TapeReturn() - { - _type = TapeReturnType.TapeEnded; - } - - /// - /// Correct is the default type, since if a value is passed, it's already right. - /// - /// any value that to be passed from Tape - public TapeReturn(T value) - { - _value = value; - _type = TapeReturnType.Correct; - } - - public TapeReturn(TapeReturnType type) - { - _type = type; - } -} diff --git a/src/Serial/Series.cs b/src/Utils/Serial/Series.cs similarity index 65% rename from src/Serial/Series.cs rename to src/Utils/Serial/Series.cs index 7b2854c..d8e6861 100644 --- a/src/Serial/Series.cs +++ b/src/Utils/Serial/Series.cs @@ -1,6 +1,6 @@ -using algorithms_cs.Tape; +using algorithms_cs.Utils.Tape; -namespace algorithms_cs.Serial; +namespace algorithms_cs.Utils.Serial; /// /// Series representing a sequence of increasing numbers over BufferedTapeReader. @@ -20,19 +20,19 @@ public Series(BufferedTapeReader tape) /// /// /// A next value if it is greater than the previous value - public SeriesReturn Next() + public UtilReturn Next() { var peekValue = _lsTape.Peek(); - if (peekValue.GetType() == TapeReturnType.Correct) + if (peekValue.GetType() == UtilReturnType.Correct) { if (_buffer <= peekValue.GetValue()) { var value = _lsTape.Next(); _buffer = value.GetValue(); - return new SeriesReturn(value.GetValue()); + return new UtilReturn(value.GetValue()); } - return new SeriesReturn(SeriesReturnType.SeriesEnded); + return new UtilReturn(UtilReturnType.SeriesEnded); } - return new SeriesReturn(SeriesReturnType.TapeEnded); + return new UtilReturn(UtilReturnType.TapeEnded); } } \ No newline at end of file diff --git a/src/Serial/SeriesEnumerable.cs b/src/Utils/Serial/SeriesEnumerable.cs similarity index 67% rename from src/Serial/SeriesEnumerable.cs rename to src/Utils/Serial/SeriesEnumerable.cs index bdde1ef..d3c70d5 100644 --- a/src/Serial/SeriesEnumerable.cs +++ b/src/Utils/Serial/SeriesEnumerable.cs @@ -1,13 +1,13 @@ using System.Collections; -using algorithms_cs.Tape; +using algorithms_cs.Utils.Tape; -namespace algorithms_cs.Serial; +namespace algorithms_cs.Utils.Serial; /// /// SeriesEnumerable represents Series over the tape like a collection for using foreach /// Series representing a sequence of increasing numbers over tape. /// -public class SeriesEnumerable: IEnumerable> +public class SeriesEnumerable: IEnumerable> { private readonly BufferedTapeReader _tape; @@ -17,9 +17,9 @@ public SeriesEnumerable(BufferedTapeReader tape) _tape.Peek(); } - public bool IsEnd => _tape.Peek().GetType() == TapeReturnType.TapeEnded; + public bool IsEnd => _tape.Peek().GetType() == UtilReturnType.TapeEnded; - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { return new SeriesEnumerator(_tape); } diff --git a/src/Serial/SeriesEnumerator.cs b/src/Utils/Serial/SeriesEnumerator.cs similarity index 75% rename from src/Serial/SeriesEnumerator.cs rename to src/Utils/Serial/SeriesEnumerator.cs index 91f6e55..a1a4e1c 100644 --- a/src/Serial/SeriesEnumerator.cs +++ b/src/Utils/Serial/SeriesEnumerator.cs @@ -1,8 +1,8 @@ -using algorithms_cs.Tape; +using algorithms_cs.Utils.Tape; -namespace algorithms_cs.Serial; +namespace algorithms_cs.Utils.Serial; -public class SeriesEnumerator: IEnumerator> +public class SeriesEnumerator: IEnumerator> { private readonly BufferedTapeReader _tape; private double _previous; @@ -20,7 +20,7 @@ public SeriesEnumerator(BufferedTapeReader tape) public bool MoveNext() { var value = _tape.Peek(); - if (value.GetType() == TapeReturnType.Correct) + if (value.GetType() == UtilReturnType.Correct) { if (_previous <= value.GetValue()) { @@ -38,7 +38,7 @@ public void Reset() public object Current => _tape.Next(); - TapeReturn IEnumerator>.Current => (TapeReturn)Current; + UtilReturn IEnumerator>.Current => (UtilReturn)Current; public void Dispose() { diff --git a/src/Tape/BufferedTapeReader.cs b/src/Utils/Tape/BufferedTapeReader.cs similarity index 79% rename from src/Tape/BufferedTapeReader.cs rename to src/Utils/Tape/BufferedTapeReader.cs index d5abcb8..bee2e92 100644 --- a/src/Tape/BufferedTapeReader.cs +++ b/src/Utils/Tape/BufferedTapeReader.cs @@ -1,4 +1,4 @@ -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; /// /// BufferedTapeReader is a wrapper of TapeReader. @@ -23,18 +23,18 @@ public BufferedTapeReader(StreamReader streamReader) : base(streamReader) /// Peek always returns the value following the current value until the next value is read /// /// next value of Tape - public TapeReturn Peek() + public UtilReturn Peek() { // Если 2 раза подряд вызвать BufferedTapeReader.Peek() то вернутся одинаковое значение if (_buffer.TryPeek(out var bufValue)) { - return new TapeReturn(bufValue); + return new UtilReturn(bufValue); } var nextValue = base.Next(); - if (nextValue.GetType() is TapeReturnType.TapeEnded) + if (nextValue.GetType() is UtilReturnType.TapeEnded) { - return new TapeReturn(TapeReturnType.TapeEnded); + return new UtilReturn(UtilReturnType.TapeEnded); } _buffer.Enqueue(nextValue.GetValue()); @@ -45,10 +45,10 @@ public TapeReturn Peek() /// /// /// next value of Tape or buffered previous value - public override TapeReturn Next() + public override UtilReturn Next() { return _buffer.TryDequeue(out var bufValue) - ? new TapeReturn(bufValue) + ? new UtilReturn(bufValue) : base.Next(); } } \ No newline at end of file diff --git a/src/Tape/Tape.cs b/src/Utils/Tape/Tape.cs similarity index 85% rename from src/Tape/Tape.cs rename to src/Utils/Tape/Tape.cs index 9c4e564..e00352b 100644 --- a/src/Tape/Tape.cs +++ b/src/Utils/Tape/Tape.cs @@ -1,4 +1,4 @@ -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; /// /// Base Tape class diff --git a/src/Tape/TapeCollection.cs b/src/Utils/Tape/TapeCollection.cs similarity index 93% rename from src/Tape/TapeCollection.cs rename to src/Utils/Tape/TapeCollection.cs index 6d6a372..f03877d 100644 --- a/src/Tape/TapeCollection.cs +++ b/src/Utils/Tape/TapeCollection.cs @@ -1,6 +1,6 @@ using System.Collections; -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; /// /// TapeCollection represents TapeReader like a collection for using foreach diff --git a/src/Tape/TapeEnumerator.cs b/src/Utils/Tape/TapeEnumerator.cs similarity index 89% rename from src/Tape/TapeEnumerator.cs rename to src/Utils/Tape/TapeEnumerator.cs index 3da7494..28e01ae 100644 --- a/src/Tape/TapeEnumerator.cs +++ b/src/Utils/Tape/TapeEnumerator.cs @@ -1,6 +1,6 @@ using System.Collections; -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; public class TapeEnumerator : IEnumerator { @@ -25,7 +25,7 @@ public TapeEnumerator(BufferedTapeReader tape) /// boolean indicating whether a next number is available public bool MoveNext() { - return !_tape.IsEnd || _tape.Peek().GetType() == TapeReturnType.Correct; + return !_tape.IsEnd || _tape.Peek().GetType() == UtilReturnType.Correct; } public void Reset() diff --git a/src/Tape/TapeReader.cs b/src/Utils/Tape/TapeReader.cs similarity index 91% rename from src/Tape/TapeReader.cs rename to src/Utils/Tape/TapeReader.cs index e72f3ec..00661e8 100644 --- a/src/Tape/TapeReader.cs +++ b/src/Utils/Tape/TapeReader.cs @@ -1,4 +1,4 @@ -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; /// /// The TapeReader representing the file that contains numbers. @@ -63,7 +63,7 @@ private bool ValueIsDigit(int value) /// Read next number from the file /// /// a next double number from StreamReader - public virtual TapeReturn Next() + public virtual UtilReturn Next() { var token = ""; var tokenIsNumber = false; @@ -88,7 +88,7 @@ public virtual TapeReturn Next() { if (token.Length > 0) { - return new TapeReturn(Convert.ToDouble(token.Replace('.', ','))); + return new UtilReturn(Convert.ToDouble(token.Replace('.', ','))); } break; } @@ -104,9 +104,9 @@ public virtual TapeReturn Next() if (nextChar == -1) { //_isHaveNumber = true; - return new TapeReturn(Convert.ToDouble(token.Replace('.', ','))); + return new UtilReturn(Convert.ToDouble(token.Replace('.', ','))); } } - return new TapeReturn(TapeReturnType.TapeEnded); + return new UtilReturn(); } } \ No newline at end of file diff --git a/src/Tape/TapeWriter.cs b/src/Utils/Tape/TapeWriter.cs similarity index 93% rename from src/Tape/TapeWriter.cs rename to src/Utils/Tape/TapeWriter.cs index 9b26aa6..f63b02f 100644 --- a/src/Tape/TapeWriter.cs +++ b/src/Utils/Tape/TapeWriter.cs @@ -1,4 +1,4 @@ -namespace algorithms_cs.Tape; +namespace algorithms_cs.Utils.Tape; public class TapeWriter : Tape { diff --git a/src/Serial/SeriesReturn.cs b/src/Utils/UtilReturn.cs similarity index 60% rename from src/Serial/SeriesReturn.cs rename to src/Utils/UtilReturn.cs index ad63480..2de2b52 100644 --- a/src/Serial/SeriesReturn.cs +++ b/src/Utils/UtilReturn.cs @@ -1,12 +1,10 @@ -using algorithms_cs.Tape; - -namespace algorithms_cs.Serial; +namespace algorithms_cs.Utils; /// /// SeriesReturnTape representing series type of return value /// [Flags] -public enum SeriesReturnType +public enum UtilReturnType { /// /// Correct using when next value was successfully received @@ -24,32 +22,41 @@ public enum SeriesReturnType TapeEnded = 3, } -public class SeriesReturn +public class UtilReturn { - private T? _value; - private SeriesReturnType _type; + private readonly T? _value; + private readonly UtilReturnType _type; public T? GetValue() { - return _type == SeriesReturnType.Correct ? _value : default; + return _type == UtilReturnType.Correct ? _value : default; } - public SeriesReturnType GetType() + public UtilReturnType GetType() { return _type; } + + /// + /// Default initialization with TapeEnded type + /// + public UtilReturn() + { + _type = UtilReturnType.TapeEnded; + } + /// /// Correct is the default series, since if a value is passed, it's already right. /// /// any value that to be passed from Series - public SeriesReturn(T value) + public UtilReturn(T value) { _value = value; - _type = SeriesReturnType.Correct; + _type = UtilReturnType.Correct; } - public SeriesReturn(SeriesReturnType type) + public UtilReturn(UtilReturnType type) { _type = type; } From a989135c0099225bbe09e7f943dff6d96a7ebfcb Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 19 Dec 2022 22:34:33 +0500 Subject: [PATCH 09/11] init test project --- TestAlgorithms-cs/TestAlgorithms-cs.csproj | 22 ++++++++++++++ TestAlgorithms-cs/TestTape.cs | 26 ++++++++++++++++ TestAlgorithms-cs/UnitTest1.cs | 19 ++++++++++++ .../resource}/1.test | 0 .../resource}/2.test | 0 .../resource}/3.test | 0 algorithms-cs.sln | 16 ++++++---- algorithms-cs/Program.cs | 30 +++++++++++++++++++ .../algorithms-cs.csproj | 1 - .../Sort/External/SeriesMerge/Collector.cs | 0 .../SeriesMerge/ExternalSeriesMergeSort.cs | 2 +- .../External/SeriesMerge/RotatingDominoes.cs | 0 .../src}/Utils/Serial/Series.cs | 0 .../src}/Utils/Serial/SeriesEnumerable.cs | 0 .../src}/Utils/Serial/SeriesEnumerator.cs | 0 .../src}/Utils/Tape/BufferedTapeReader.cs | 0 {src => algorithms-cs/src}/Utils/Tape/Tape.cs | 0 .../src}/Utils/Tape/TapeCollection.cs | 0 .../src}/Utils/Tape/TapeEnumerator.cs | 2 +- .../src}/Utils/Tape/TapeReader.cs | 0 .../src}/Utils/Tape/TapeWriter.cs | 0 .../src}/Utils/UtilReturn.cs | 0 src/Algorithm/Sort/Sort.cs | 6 ---- 23 files changed, 110 insertions(+), 14 deletions(-) create mode 100644 TestAlgorithms-cs/TestAlgorithms-cs.csproj create mode 100644 TestAlgorithms-cs/TestTape.cs create mode 100644 TestAlgorithms-cs/UnitTest1.cs rename {resource => TestAlgorithms-cs/resource}/1.test (100%) rename {resource => TestAlgorithms-cs/resource}/2.test (100%) rename {resource => TestAlgorithms-cs/resource}/3.test (100%) create mode 100644 algorithms-cs/Program.cs rename algorithms-cs.csproj => algorithms-cs/algorithms-cs.csproj (83%) rename {src => algorithms-cs/src}/Algorithm/Sort/External/SeriesMerge/Collector.cs (100%) rename {src => algorithms-cs/src}/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs (99%) rename {src => algorithms-cs/src}/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs (100%) rename {src => algorithms-cs/src}/Utils/Serial/Series.cs (100%) rename {src => algorithms-cs/src}/Utils/Serial/SeriesEnumerable.cs (100%) rename {src => algorithms-cs/src}/Utils/Serial/SeriesEnumerator.cs (100%) rename {src => algorithms-cs/src}/Utils/Tape/BufferedTapeReader.cs (100%) rename {src => algorithms-cs/src}/Utils/Tape/Tape.cs (100%) rename {src => algorithms-cs/src}/Utils/Tape/TapeCollection.cs (100%) rename {src => algorithms-cs/src}/Utils/Tape/TapeEnumerator.cs (95%) rename {src => algorithms-cs/src}/Utils/Tape/TapeReader.cs (100%) rename {src => algorithms-cs/src}/Utils/Tape/TapeWriter.cs (100%) rename {src => algorithms-cs/src}/Utils/UtilReturn.cs (100%) delete mode 100644 src/Algorithm/Sort/Sort.cs diff --git a/TestAlgorithms-cs/TestAlgorithms-cs.csproj b/TestAlgorithms-cs/TestAlgorithms-cs.csproj new file mode 100644 index 0000000..6f512d2 --- /dev/null +++ b/TestAlgorithms-cs/TestAlgorithms-cs.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + TestAlgorithms_cs + enable + + false + + + + + + + + + + + + + + diff --git a/TestAlgorithms-cs/TestTape.cs b/TestAlgorithms-cs/TestTape.cs new file mode 100644 index 0000000..15fc2f3 --- /dev/null +++ b/TestAlgorithms-cs/TestTape.cs @@ -0,0 +1,26 @@ +using System; +using NUnit.Framework; +using algorithms_cs.Utils; + +namespace TestAlgorithms_cs; + +public class TestTape +{ + + [Test] + public void TestDefaultInitialization() + { + var utilReturn = new UtilReturn(); + + Assert.That(utilReturn.GetType() == UtilReturnType.TapeEnded); + } + + [Test] + public void TestInitializationWithValue() + { + const double value = (double)20; + var utilReturn = new UtilReturn(value); + + Assert.That(utilReturn.GetType() == UtilReturnType.Correct && Math.Abs(utilReturn.GetValue() - value) == 0); + } +} \ No newline at end of file diff --git a/TestAlgorithms-cs/UnitTest1.cs b/TestAlgorithms-cs/UnitTest1.cs new file mode 100644 index 0000000..3333f00 --- /dev/null +++ b/TestAlgorithms-cs/UnitTest1.cs @@ -0,0 +1,19 @@ +using NUnit.Framework; + +namespace TestAlgorithms_cs; + +public class Tests +{ + [SetUp] + public void Setup() + { + } + + [Test] + public void Test1() + { + + + Assert.Pass(); + } +} \ No newline at end of file diff --git a/resource/1.test b/TestAlgorithms-cs/resource/1.test similarity index 100% rename from resource/1.test rename to TestAlgorithms-cs/resource/1.test diff --git a/resource/2.test b/TestAlgorithms-cs/resource/2.test similarity index 100% rename from resource/2.test rename to TestAlgorithms-cs/resource/2.test diff --git a/resource/3.test b/TestAlgorithms-cs/resource/3.test similarity index 100% rename from resource/3.test rename to TestAlgorithms-cs/resource/3.test diff --git a/algorithms-cs.sln b/algorithms-cs.sln index cc29e40..cbe0f9e 100644 --- a/algorithms-cs.sln +++ b/algorithms-cs.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "algorithms-cs", "algorithms-cs.csproj", "{C310C318-7B2D-4C1C-AC20-23D3FDD31A9E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "algorithms-cs", "algorithms-cs\algorithms-cs.csproj", "{91495899-7D40-4543-93B9-820F92C61B31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAlgorithms-cs", "TestAlgorithms-cs\TestAlgorithms-cs.csproj", "{FAC8701B-6897-488A-B78F-660E8B47FC25}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -8,9 +10,13 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C310C318-7B2D-4C1C-AC20-23D3FDD31A9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C310C318-7B2D-4C1C-AC20-23D3FDD31A9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C310C318-7B2D-4C1C-AC20-23D3FDD31A9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C310C318-7B2D-4C1C-AC20-23D3FDD31A9E}.Release|Any CPU.Build.0 = Release|Any CPU + {91495899-7D40-4543-93B9-820F92C61B31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91495899-7D40-4543-93B9-820F92C61B31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91495899-7D40-4543-93B9-820F92C61B31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91495899-7D40-4543-93B9-820F92C61B31}.Release|Any CPU.Build.0 = Release|Any CPU + {FAC8701B-6897-488A-B78F-660E8B47FC25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAC8701B-6897-488A-B78F-660E8B47FC25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAC8701B-6897-488A-B78F-660E8B47FC25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAC8701B-6897-488A-B78F-660E8B47FC25}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/algorithms-cs/Program.cs b/algorithms-cs/Program.cs new file mode 100644 index 0000000..6c91521 --- /dev/null +++ b/algorithms-cs/Program.cs @@ -0,0 +1,30 @@ +using algorithms_cs.Algorithm.Sort.External.SeriesMerge; + +const int numberWays = 4; +const string pathFile = "@\\algorithms-cs\\resource\\4.txt"; + +Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); + +var sort = new MultiwaySort(numberWays, pathFile); +// sort.Start(); + + + +// +// var test = new BufferedTapeReader(pathFile); +// var test2 = new TapeCollection(pathFile); +// var ss = new SeriesEnumerable(test); +// +// foreach (var VARIABLE in test2) +// { +// Console.WriteLine(VARIABLE); +// } +// +// while (!ss.IsEnd) +// { +// foreach (var VARIABLE in ss) +// { +// Console.WriteLine($"{VARIABLE.GetType()} {VARIABLE.GetValue()}"); +// } +// Console.WriteLine(); +// } \ No newline at end of file diff --git a/algorithms-cs.csproj b/algorithms-cs/algorithms-cs.csproj similarity index 83% rename from algorithms-cs.csproj rename to algorithms-cs/algorithms-cs.csproj index 9d15e46..4057b1c 100644 --- a/algorithms-cs.csproj +++ b/algorithms-cs/algorithms-cs.csproj @@ -6,7 +6,6 @@ algorithms_cs enable enable - Windows diff --git a/src/Algorithm/Sort/External/SeriesMerge/Collector.cs b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/Collector.cs similarity index 100% rename from src/Algorithm/Sort/External/SeriesMerge/Collector.cs rename to algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/Collector.cs diff --git a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs similarity index 99% rename from src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs rename to algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs index 6b3af98..4fc9f3a 100644 --- a/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs +++ b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/ExternalSeriesMergeSort.cs @@ -4,7 +4,7 @@ namespace algorithms_cs.Algorithm.Sort.External.SeriesMerge; -public class MultiwaySort: Sort +public class MultiwaySort { private readonly string _sourceFilePath; private readonly string _tempDirectory; diff --git a/src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs similarity index 100% rename from src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs rename to algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/RotatingDominoes.cs diff --git a/src/Utils/Serial/Series.cs b/algorithms-cs/src/Utils/Serial/Series.cs similarity index 100% rename from src/Utils/Serial/Series.cs rename to algorithms-cs/src/Utils/Serial/Series.cs diff --git a/src/Utils/Serial/SeriesEnumerable.cs b/algorithms-cs/src/Utils/Serial/SeriesEnumerable.cs similarity index 100% rename from src/Utils/Serial/SeriesEnumerable.cs rename to algorithms-cs/src/Utils/Serial/SeriesEnumerable.cs diff --git a/src/Utils/Serial/SeriesEnumerator.cs b/algorithms-cs/src/Utils/Serial/SeriesEnumerator.cs similarity index 100% rename from src/Utils/Serial/SeriesEnumerator.cs rename to algorithms-cs/src/Utils/Serial/SeriesEnumerator.cs diff --git a/src/Utils/Tape/BufferedTapeReader.cs b/algorithms-cs/src/Utils/Tape/BufferedTapeReader.cs similarity index 100% rename from src/Utils/Tape/BufferedTapeReader.cs rename to algorithms-cs/src/Utils/Tape/BufferedTapeReader.cs diff --git a/src/Utils/Tape/Tape.cs b/algorithms-cs/src/Utils/Tape/Tape.cs similarity index 100% rename from src/Utils/Tape/Tape.cs rename to algorithms-cs/src/Utils/Tape/Tape.cs diff --git a/src/Utils/Tape/TapeCollection.cs b/algorithms-cs/src/Utils/Tape/TapeCollection.cs similarity index 100% rename from src/Utils/Tape/TapeCollection.cs rename to algorithms-cs/src/Utils/Tape/TapeCollection.cs diff --git a/src/Utils/Tape/TapeEnumerator.cs b/algorithms-cs/src/Utils/Tape/TapeEnumerator.cs similarity index 95% rename from src/Utils/Tape/TapeEnumerator.cs rename to algorithms-cs/src/Utils/Tape/TapeEnumerator.cs index 28e01ae..27c6436 100644 --- a/src/Utils/Tape/TapeEnumerator.cs +++ b/algorithms-cs/src/Utils/Tape/TapeEnumerator.cs @@ -30,7 +30,7 @@ public bool MoveNext() public void Reset() { - _tape = new BufferedTapeReader(_path); + _tape = new BufferedTapeReader(_path!); } /// diff --git a/src/Utils/Tape/TapeReader.cs b/algorithms-cs/src/Utils/Tape/TapeReader.cs similarity index 100% rename from src/Utils/Tape/TapeReader.cs rename to algorithms-cs/src/Utils/Tape/TapeReader.cs diff --git a/src/Utils/Tape/TapeWriter.cs b/algorithms-cs/src/Utils/Tape/TapeWriter.cs similarity index 100% rename from src/Utils/Tape/TapeWriter.cs rename to algorithms-cs/src/Utils/Tape/TapeWriter.cs diff --git a/src/Utils/UtilReturn.cs b/algorithms-cs/src/Utils/UtilReturn.cs similarity index 100% rename from src/Utils/UtilReturn.cs rename to algorithms-cs/src/Utils/UtilReturn.cs diff --git a/src/Algorithm/Sort/Sort.cs b/src/Algorithm/Sort/Sort.cs deleted file mode 100644 index 706dc20..0000000 --- a/src/Algorithm/Sort/Sort.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace algorithms_cs.Algorithm.Sort; - -public abstract class Sort -{ - protected Sort() { } -} \ No newline at end of file From 643826c6d858aafc8d02d6082df6b222a67f4b47 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 20 Dec 2022 17:09:52 +0500 Subject: [PATCH 10/11] gitignore init --- .gitignore | 5 +++++ TestAlgorithms-cs/.gitignore | 2 ++ algorithms-cs/.gitignore | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 .gitignore create mode 100644 TestAlgorithms-cs/.gitignore create mode 100644 algorithms-cs/.gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a3e801 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea +.env + +/bin +/obj \ No newline at end of file diff --git a/TestAlgorithms-cs/.gitignore b/TestAlgorithms-cs/.gitignore new file mode 100644 index 0000000..1f3df4f --- /dev/null +++ b/TestAlgorithms-cs/.gitignore @@ -0,0 +1,2 @@ +/bin +/obj \ No newline at end of file diff --git a/algorithms-cs/.gitignore b/algorithms-cs/.gitignore new file mode 100644 index 0000000..1f3df4f --- /dev/null +++ b/algorithms-cs/.gitignore @@ -0,0 +1,2 @@ +/bin +/obj \ No newline at end of file From 559bb318bd46a54ebf2f6f93df6a84f13a53c811 Mon Sep 17 00:00:00 2001 From: roma Date: Thu, 22 Dec 2022 15:22:42 +0500 Subject: [PATCH 11/11] rewrite readme.md --- TestAlgorithms-cs/TestTape.cs | 35 +++- TestAlgorithms-cs/resource/4.test | 1 + .../Sort/External/SeriesMerge/readme.md | 184 ++++++++++++++++++ readme.md | 184 +----------------- 4 files changed, 225 insertions(+), 179 deletions(-) create mode 100644 TestAlgorithms-cs/resource/4.test create mode 100644 algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/readme.md diff --git a/TestAlgorithms-cs/TestTape.cs b/TestAlgorithms-cs/TestTape.cs index 15fc2f3..2be9406 100644 --- a/TestAlgorithms-cs/TestTape.cs +++ b/TestAlgorithms-cs/TestTape.cs @@ -1,12 +1,16 @@ using System; +using System.Collections.Generic; +using System.Linq; using NUnit.Framework; using algorithms_cs.Utils; +using algorithms_cs.Utils.Tape; namespace TestAlgorithms_cs; public class TestTape { - + private const string PathResources = "../../../resource/"; + [Test] public void TestDefaultInitialization() { @@ -23,4 +27,33 @@ public void TestInitializationWithValue() Assert.That(utilReturn.GetType() == UtilReturnType.Correct && Math.Abs(utilReturn.GetValue() - value) == 0); } + + [Test] + public void TestTapeReader() + { + string path = PathResources + "4.test"; + + var answer = new List + { + -10, + -9.0, + -8.0, + -7.0012, + -6.0012, + 5, + 4.12, + 3.12 + }; + + var tapeResponse = new List(); + + var tape = new TapeReader(path); + + for (int i = 0; i < 8; i++) + { + tapeResponse.Add(tape.Next().GetValue()); + } + + Assert.AreEqual(tapeResponse, answer); + } } \ No newline at end of file diff --git a/TestAlgorithms-cs/resource/4.test b/TestAlgorithms-cs/resource/4.test new file mode 100644 index 0000000..19422c1 --- /dev/null +++ b/TestAlgorithms-cs/resource/4.test @@ -0,0 +1 @@ +-10 -9,0 -8.0 -7.0012 -6,0012 5 4.12 3,12 \ No newline at end of file diff --git a/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/readme.md b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/readme.md new file mode 100644 index 0000000..b708e3e --- /dev/null +++ b/algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/readme.md @@ -0,0 +1,184 @@ +External Series merge sort +=========== + +#### _or natural merge sort_ + + +Use +--- + +For start sorting file create `MultiwaySort()` with 2 parameters such `number of ways` and (`filename` or path file). +Then call `Start()` method. + +After sorting is completed, a new file will be created with the same name and postscript `-sorted`. + + +Example use +----------- +```csharp +using algorithms_cs.Algorithm.Sort.External.Merge; + +const int numberWays = 4; +const string pathFile = @"someDirectory\\file.test"; + +var sort = new MultiwaySort(NumberWays, PathFile); +sort.Start(); +``` + +``` +/file.test 12 4 1 2 -6 12 645 12 54 -2,0001 +/file.test-sorted -6 -2,0001 1 2 4 12 12 12 54 645 +``` + + +Overview +---------------------------- + + +_**Внешняя многопутевая естественная сортировка**_ отличается от _**обычной внешней сортировки**_ концепцией серий чисел. +**_Серия_** - это последовательность чисел, каждый следующий элемент которой больше предыдущего. + +Tape - последовательность чисел, описывает файл с числами. +Количество Series в Tape не ограниченно. Первая серия предшествует второй, и т.д. + +``` +TAPE <= FILE 12 4 1 2 -6 12 645 12 54 -2,0001 +``` + +| _index_ | 0 | 1 | 2 | 3 | 4 | 5 | +|------------|--------|------|--------|---------------|----------|-----------| +| **Series** | `12` | `4` | `1, 2` | `-6, 12, 645` | `12, 54` | `-2.0001` | + + +Еще одно отличие **_ВМЕС_** от **_ОВС_** - это потоки или пути (от этого и слово многопутевая в названии). + +Например, при `N = 3`, создаются 6 (3 + 3) файлов, 2 набора для записи и для чтения. + +| Read | Write | +|----------|----------| +| `Tape 1` | `Tape 4` | +| `Tape 2` | `Tape 5` | +| `Tape 3` | `Tape 6` | + +Алгоритм состоит из: + +1. **Инициализации**. Подготовка к основному раунду алгоритма +2. **Тело**. Циклическое повторение основного раунда. + +**Основной раунд** - слияние N Серий из каждой Полосы в Полосы другой группы. + +Задачу слияния N серий берет на себя Коллектор. Он создает новую серию, которая записывается в Tape +``` + _____ + \ +Series 1 \ + \ +Series 2 new Series + / +Series 3 / + _____/ + +``` + +1. +| slot | Series | +|-------|----------| +| [ _ ] | `12` | +| [ _ ] | `4` | +| [ _ ] | `1`, `2` | + +2. +| slot | Series | +|--------|------------| +| [ 12 ] | ~~12~~ | +| [ 4 ] | ~~4~~ | +| [ 1 ] | ~~1~~, `2` | + +return `1` + +3. + +| slot | Series | +|--------|--------------| +| [ 12 ] | ~~12~~ | +| [ 4 ] | ~~4~~ | +| [ 2 ] | ~~1~~, ~~2~~ | + +return `2` + +4. + +| slot | Series | +|--------|--------------| +| [ 12 ] | ~~12~~ | +| [ 4 ] | ~~4~~ | +| [ _ ] | ~~1~~, ~~2~~ | + +return `4` + +5. + +| slot | Series | +|--------|--------------| +| [ 12 ] | ~~12~~ | +| [ _ ] | ~~4~~ | +| [ _ ] | ~~1~~, ~~2~~ | + +return `12` + +6. + +| slot | Series | +|-------|--------------| +| [ _ ] | ~~12~~ | +| [ _ ] | ~~4~~ | +| [ _ ] | ~~1~~, ~~2~~ | + +Серии закончились. Коллектор осталовился. + +_____ + +### Example + +| _index_ | 0 | 1 | 2 | 3 | 4 | 5 | +|------------|--------|------|--------|---------------|----------|-----------| +| **Series** | `12` | `4` | `1, 2` | `-6, 12, 645` | `12, 54` | `-2.0001` | + +1. Инициализация + +| Write | Read | +|---------------------|--------| +| `12`, `-6, 12, 645` | `____` | +| `4`, `12, 54` | `____` | +| `1, 2`, `-2.0001` | `____` | + +2. Тело + +2.1. + +| Read | Write | +|-----------------------|---------------| +| ~~12~~, `-6, 12, 645` | `1, 2, 4, 12` | +| ~~4~~, `12, 54` | `____` | +| ~~1, 2~~, `-2.0001` | `____` | + +| Read | Write | +|-------------------------|--------------------------------| +| ~~12~~, ~~-6, 12, 645~~ | `1, 2, 4, 12` | +| ~~4~~, ~~12, 54~~ | `-6, -2.0001, 12, 12, 54, 645` | +| ~~1, 2~~, ~~-2.0001~~ | `____` | + +2.2. + +| Write | Read | +|------------------------------------|----------------------------------| +| `-6 -2,0001 1 2 4 12 12 12 54 645` | ~~1, 2, 4, 12~~ | +| `____` | ~~-6, -2.0001, 12, 12, 54, 645~~ | +| `____` | `____` | + + +Алгоритм завершаетс, в результате получась полоска с одной серией + +----- + +

Copyright (C) 2022 The EMMS Project

diff --git a/readme.md b/readme.md index ea6ab9d..449da22 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -Algorithms C# +Algorithms C# ============= @@ -8,181 +8,9 @@ Overview This project is designed to learning **computer science** by [a roadmap](https://roadmap.sh/computer-science). -Use ---- +List +---- -For start sorting file create `MultiwaySort()` with 2 parameters such `number of ways` and (`filename` or path file). -Then call `Start()` method. - -After sorting is completed, a new file will be created with the same name and postscript `-sorted`. - - -Example use ------------ -```csharp -using algorithms_cs.Algorithm.Sort.External.Merge; - -const int numberWays = 4; -const string pathFile = @"someDirectory\\resource\\1.test"; - -var sort = new MultiwaySort(NumberWays, PathFile); -sort.Start(); -``` - -``` -/1.test 12 4 1 2 -6 12 645 12 54 -2,0001 -/1.test-sorted -6 -2,0001 1 2 4 12 12 12 54 645 -``` - - -External Multiway Merge Sort ----------------------------- - - -_**Внешняя многопутевая естественная сортировка**_ отличается от _**обычной внешней сортировки**_ концепцией серий чисел. -**_Серия_** - это последовательность чисел, каждый следующий элемент которой больше предыдущего. - -Tape - последовательность чисел, описывает файл с числами. -Количество Series в Tape не ограниченно. Первая серия предшествует второй, и т.д. - -``` -TAPE <= FILE 12 4 1 2 -6 12 645 12 54 -2,0001 -``` - -| _index_ | 0 | 1 | 2 | 3 | 4 | 5 | -|------------|--------|------|--------|---------------|----------|-----------| -| **Series** | `12` | `4` | `1, 2` | `-6, 12, 645` | `12, 54` | `-2.0001` | - - -Еще одно отличие **_ВМЕС_** от **_ОВС_** - это потоки или пути (от этого и слово многопутевая в названии). - -Например, при `N = 3`, создаются 6 (3 + 3) файлов, 2 набора для записи и для чтения. - -| Read | Write | -|----------|----------| -| `Tape 1` | `Tape 4` | -| `Tape 2` | `Tape 5` | -| `Tape 3` | `Tape 6` | - -Алгоритм состоит из: - -1. **Инициализации**. Подготовка к основному раунду алгоритма -2. **Тело**. Циклическое повторение основного раунда. - -**Основной раунд** - слияние N Серий из каждой Полосы в Полосы другой группы. - -Задачу слияния N серий берет на себя Коллектор. Он создает новую серию, которая записывается в Tape -``` - _____ - \ -Series 1 \ - \ -Series 2 new Series - / -Series 3 / - _____/ - -``` - -1. -| slot | Series | -|-------|----------| -| [ _ ] | `12` | -| [ _ ] | `4` | -| [ _ ] | `1`, `2` | - -2. -| slot | Series | -|--------|------------| -| [ 12 ] | ~~12~~ | -| [ 4 ] | ~~4~~ | -| [ 1 ] | ~~1~~, `2` | - -return `1` - -3. - -| slot | Series | -|--------|--------------| -| [ 12 ] | ~~12~~ | -| [ 4 ] | ~~4~~ | -| [ 2 ] | ~~1~~, ~~2~~ | - -return `2` - -4. - -| slot | Series | -|--------|--------------| -| [ 12 ] | ~~12~~ | -| [ 4 ] | ~~4~~ | -| [ _ ] | ~~1~~, ~~2~~ | - -return `4` - -5. - -| slot | Series | -|--------|--------------| -| [ 12 ] | ~~12~~ | -| [ _ ] | ~~4~~ | -| [ _ ] | ~~1~~, ~~2~~ | - -return `12` - -6. - -| slot | Series | -|-------|--------------| -| [ _ ] | ~~12~~ | -| [ _ ] | ~~4~~ | -| [ _ ] | ~~1~~, ~~2~~ | - -Серии закончились. Коллектор осталовился. - -_____ - -### Example - -| _index_ | 0 | 1 | 2 | 3 | 4 | 5 | -|------------|--------|------|--------|---------------|----------|-----------| -| **Series** | `12` | `4` | `1, 2` | `-6, 12, 645` | `12, 54` | `-2.0001` | - -1. Инициализация - -| Write | Read | -|---------------------|--------| -| `12`, `-6, 12, 645` | `____` | -| `4`, `12, 54` | `____` | -| `1, 2`, `-2.0001` | `____` | - -2. Тело - -2.1. - -| Read | Write | -|-----------------------|---------------| -| ~~12~~, `-6, 12, 645` | `1, 2, 4, 12` | -| ~~4~~, `12, 54` | `____` | -| ~~1, 2~~, `-2.0001` | `____` | - -| Read | Write | -|-------------------------|--------------------------------| -| ~~12~~, ~~-6, 12, 645~~ | `1, 2, 4, 12` | -| ~~4~~, ~~12, 54~~ | `-6, -2.0001, 12, 12, 54, 645` | -| ~~1, 2~~, ~~-2.0001~~ | `____` | - -2.2. - -| Write | Read | -|------------------------------------|----------------------------------| -| `-6 -2,0001 1 2 4 12 12 12 54 645` | ~~1, 2, 4, 12~~ | -| `____` | ~~-6, -2.0001, 12, 12, 54, 645~~ | -| `____` | `____` | - - -Алгоритм завершаетс, в результате получась полоска с одной серией - ------ - -

Copyright (C) 2022 The EMMS Project

+- Sort + - external + - [series merge](./algorithms-cs/src/Algorithm/Sort/External/SeriesMerge/readme.md) \ No newline at end of file