shad-go/externalsort
2020-03-12 20:52:18 +03:00
..
testdata/sort Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00
io.go Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00
io_test.go Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00
README.md Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00
sort.go Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00
sort_test.go Adding externalsort task readme+solution+tests. 2020-03-12 20:52:18 +03:00

externalsort

В этой задаче нужно написать однопроходную внешнюю сортировку слиянием. Моделируется ситуация, в которой, данные расположены на внешних устройствах и суммарно не вмещаются в оперативную память, но каждый кусочек по-отдельности вмещается.

Задача разбита на 3 составные части.

Reader & writer

Реализовать интерфейсы для построчного чтения/записи строк:

type LineReader interface {
	ReadLine() (string, error)
}

type LineWriterFlusher interface {
	Write(l string) error
	Flush() error
}

и два конструктора:

func NewReader(r io.Reader) LineReader
func NewWriterFlusher(w io.Writer) LineWriterFlusher

NewLineReader оборачивает переданный io.Reader в LineReader.

Вызов ReadLine должен читать одну строку. Строка имеет произвольную длину. Конец строки определяется переводом строки ('\n'). Непустая последовательность символов после последнего перевода строки также считается строкой.

ReadLine должен возращать io.EOF при достижении конца файла.

Merge

Функция слияния произвольного количества отсортированных групп строк:

func Merge(w LineWriterFlusher, readers ...LineReader) error

Merge по необходимости читает из reader'ов и пишет во writer.

Sort

Sort(w io.Writer, in ...string) error

Функция принимает на вход произвольное количество файлов, каждый их которых помещается в оперативную память, а также writer для записи результата.

Результаты сортировки отдельных файлов можно записывать поверх входных данных.

Ссылки