60 lines
2.3 KiB
Markdown
60 lines
2.3 KiB
Markdown
|
## 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 для записи результата.
|
|||
|
|
|||
|
Результаты сортировки отдельных файлов можно записывать поверх входных данных.
|
|||
|
|
|||
|
### Ссылки
|
|||
|
|
|||
|
* container/heap: https://golang.org/pkg/container/heap/
|