Возможно, стоит подумать о сложности времени std::map
для его operator[]()
.
Использование оператора []: «[]» также можно использовать для вставки элементов в карта. Аналогичен приведенным выше функциям и возвращает указатель на вновь созданный элемент. Разница в том, что этот оператор всегда создает новый элемент, т. Е. Даже если значение не сопоставлено с ключом, вызывается конструктор по умолчанию, который присваивает ключу «нулевое» или «пустое» значение. Размер карты всегда увеличивается на 1. Сложность времени: log (n), где n - размер карты
Предоставлено:
geeksforgeeks
В функции createDictionary()
вашего класса попробуйте добавить эту строку кода в 2 nd , а l oop:
{
//...code
if (find(dictionary[key].begin(), dictionary[key].end(), w1) == dictionary[key].end()) {
dictionary[key].push_back(w1);
std::cout << dictionary.size() << std::endl;
//code...
}
Когда я скопировал текст из файл, который он генерировал 62037 записей в вашем словаре или hashmap. Запуск занимает около 20 - 30 секунд и заканчивается sh.
Когда я добавил текст «До свидания!» В конец файла, сохранил его и запустил программу / отладчик, он сгенерировал 62039 записей. Снова потребовалось около 20-30 секунд для запуска.
Затем я добавил текст «Hello World» в начало файла, сохранил его, запустил программу / отладчик и сгенерировал 62041 записей. Снова потребовалось около 20-30 секунд для запуска.
Однако во время этого процесса было несколько раз, когда он генерировал столько записей на вашей карте, но код все еще проходил через l * 1060. * ... Один раз это было около 620xx - 640xx. Я не знаю, что послужило причиной того, что это сгенерировало такое количество ключей ... но, как я уже сказал, пару раз он прекращал печатать значения, но продолжал повторять то же самое, пока l oop, но размер карты не увеличивался ...
Это произошло в первый раз, когда я вводил текст в начале файла после того, как попробовал его с добавленным текстом в конце. Именно тогда я решил распечатать размер вашей карты и заметил, что получаю это бесконечное значение l oop ... Затем я остановил отладчик, вернулся к текстовому файлу и сохранил вставленный текст в начале, но удалил добавленный текст в конце, обеспечивающий пробел в конце текста.
На этот раз, когда я запустил программу / отладчик, он работал правильно и сгенерировал 62039 записей. Снова потребовалось около 20-30 секунд, чтобы бежать. После первого успешного запуска со вставленным текстом в начале, когда я добавил текст в конце, он заработал нормально. Я тогда даже пытался иметь "Hello World!" сопровождаемый новой строкой, используя ввод в текстовый файл и имея "До свидания!" перед ним также стоит один, и он все еще работает нормально.
Да, есть что-то, что вызывает ошибку, но я не знаю точно, что вызывает это. Тем не менее, я считаю, что я проследил, чтобы он находился в пределах этого while
l oop и условного ветвления для выхода ... Он должен был выйти из этого l oop и войти в функцию createText
, но это никогда не возникало, условие, для которого вы:
if (next == std::string::npos) return
и
if (w1.size() < 1) break;
так или иначе не выполнялись.
Временная сложность в порядке, однако она не самая лучшая, но и не самая плохая, поскольку в O(log n)
времени выполняется приблизительно 62-63 тыс. Записей. Это также не включает в себя подсчет сложности пространства, которую нужно принимать во внимание.
Возможно, во время одного запуска вы получите переполнение стека, которое вызывает бесконечное l oop, и в следующий раз, когда вы его запустите, это может не произойти. Я не думаю, что это связано с непосредственным добавлением текста в текстовый файл, за исключением того, что это увеличит размер вашей карты в O(log N) time
и также увеличит сложность пространства.
Независимо от того, что вы добавляете в этот текстовый файл и после его сохранения, способа написания вашей программы или алгоритмов, он извлекает все содержимое этого файла в виде индексов-указателей по типу char через классы итераторов и сохраняет его в одна строка, fileText
. После того, как эта строка создана, в строке члена вашего класса будет приблизительно 336940 символов.
Надеемся, что эта информация поможет вам сузить местонахождение ошибки в вашей программе и определить, что на самом деле ее вызывает. Трудно сузить этого преступника.