2014-10-08 2 views
0

Я работаю над проблемой интервального разбиения (например: http://kartikkukreja.wordpress.com/2013/09/26/interval-partitioning-problem/), где мне приходится писать оптимальные расписания в выходной файл. В настоящее время я использую map> для хранения интервалов, назначенных нескольким разделам. Первый int обозначает номер раздела, а соответствующий ему вектор обозначает интервалы, назначенные этому разделу.Эффективная структура выходных данных в C++

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

+0

Структура данных в файле не должны совпадать со структурой данных в памяти. Например, структура данных в файле данных должна быть спроектирована для удобства чтения и быстрого анализа/обработки. Файл данных также может содержать поля для обеспечения целостности. –

+0

Как часто вы пишете файл? Как часто вы читаете? Являются ли данные большими или малыми? –

+0

BTW, указатели на объекты в памяти не переводятся в файлы данных, так как ваша программа может не находиться в одном месте или ваша память может находиться не в одном месте от одного вызова к другому. –

ответ

0

Это очень зависит от того, что вы пытаетесь вывести. Например, лучшей структурой данных для решения этой проблемы является std::forward_list<std::pair<int,int>>, где первым int будет время, а второе int будет числом требуемых в настоящее время разделов.

Учитывая запросы:

enter image description here

Ваш std::forward_list будет содержать std::pair s:

(время, перегородки)
{0, 1},
{1, 2},
{3, 3},
{4, 1},
{5, 2},
{6, 1}, {
7, 0}

Имейте в виду, что, когда вы работаете с файлом IO, НЛ собирается быть львиная доля стоимости. Таким образом, на данный момент это просто вопрос о том, сколько усилий вы хотите поместить в демпинг этих данных. Если печать первой необходимости, как это не достаточно, дайте мне знать, и я, вероятно, может зацепить что-то еще выше:

std::cout << "(time, partitions)" << std::endl; 
for(auto i = partitions.begin(); i != partitions.end(); ++i){ 
    std::cout << std::setw(5) << i->first << std::setw(1) << ',' << std::setw(12) << i->second << std::endl; 
} 
Смежные вопросы