Бинарное дерево или сортировка? C++

175
05 августа 2018, 08:10

Я бы хотел узнать, что будет быстрее:

  • Сортировать(quick sort) массив и выводить его.
  • Сразу записывать все в бинарное дерево и потом выводить его.

Проблема в том, что я принимаю файлы с числами типа double, и мне надо их записывать отсортированными уже в другой файл и надо делать это быстро. Файлы имеют минимальный размер 1ГБ. Использую язык C++. Также надо учитывать наихудшие варианты.

Answer 1

Динамическое бинарное дерево займёт в памяти огромное количество памяти для ссылок (три штуки) и баланс. Миллиардные попытки выделить память для каждого узла займёт времени на всю область вашего терпения. Можно конечно первым проходом посчитать количество данных в файле и выделить одноразово память для массива узлов деревьев. Но намного проще выделить память в три раза меньше для обычного массива данных и произвести быструю сортировку. Результат: подсчёт количества данных, запись в обычный массив, quick-sort.

Answer 2

Быстрее будет сортировка в массиве. Меньше промахов в кэше, меньше расход памяти, да и быстрая сортировка STL работает очень хорошо. Миллионы чисел сортируются за секунды.

Если у вас есть возможность узнать, сколько элементов хранится в памяти, то могу посоветовать заранее выделить необходимо количество памяти в массиве. В случае использования std::vector, это будет функция reserve или сразу передать в конструктор необходимое количество элементов.

Что касается считывания, то стоит помнить, что данные все равно подгружаются из буфера (т.е. из файла загружается какая-то часть в буфер, например, 4КБ, а потом читается с буфера, когда вы используете считывание), поэтому происходит считывание достаточно быстро.

И ещё одна вещь, которая может сэкономить вам память и увеличить скорость. Это если в файле они хранятся в бинарном виде, а не в текстовом. Это также позволит узнать, сколько чисел хранится в файле и потом выделить память.

READ ALSO
Cписки и очереди [закрыт]

Cписки и очереди [закрыт]

По заданию нужно реализовать очередь с приоритетом в виде спискаВозникла проблема при добавлении элементов в середину списка так чтобы...

193
Выход за пределы массива C++

Выход за пределы массива C++

При выходе за пределы динамического массива программа впервые вместо вылета с ошибкой 0xC0000005 выводит "once (адрес) is (значение)"Из-за чего это...

206
Скрыть метод в наследуемом классе

Скрыть метод в наследуемом классе

Есть необходимость переопределить видимость метода наследуемого от базового, или запретить его переопределение

173
Как получить число идущее после запятой введённой переменной типа double в C++? (например, ввели 14.25 - вывело 25)

Как получить число идущее после запятой введённой переменной типа double в C++? (например, ввели 14.25 - вывело 25)

Примерно продумал синтаксис, но выводит число неправильноАлгоритм такой: число оставить без его целой части, далее умножать на 10 до тех пор,...

166