Arhn - архитектура программирования

Ошибка сегментации возможна из-за карты

Я написал код, который должен принимать две строки в качестве входных данных. Он должен вывести количество шагов (переворачивание соседних букв или переворачивание первой и последней буквы), для преобразования одного слова в другое требуется одно слово. Он дает правильные значения до тех пор, пока размер строки не будет равен 8. Если размер строки больше 8, это дает ошибку сегментации. Я не мог найти ни одной ошибки. Может кто-нибудь, пожалуйста, помогите мне. Заранее спасибо. Это код:

map<string,int>imap;

int easyStrings(string a, string b) {

    //cout<<a<<endl;
    if(a.compare(b) == 0)
        return 0;

    map<string,int>::iterator it = imap.find(a);
    if(it != imap.end())
        return it->second;

    imap.insert(pair<string,int>(a,-2));

    int min = -2;

    string str = a;


    str[0] = a[a.length()-1];
    str[a.length()-1] = a[0];

    it = imap.find(str);
    if(it == imap.end() || it->second != -2)
        min = 1 + easyStrings(str,b); 

    for(int i = 0 ; i < a.length()-1; i++)
    {
        string check = a;
        check[i] = a[i+1];
        check[i+1] = a[i];

        int steps = 0;
        it = imap.find(check);
        if(it == imap.end() || it->second != -2)    
        {
            steps = 1 + easyStrings(check,b);

            if(steps < min || min ==-2)
                if(steps > 0)
                    min = steps;
        }

    }

    imap[a] = min;
    return min; 
}

Пробовал использовать отладчик. Я показываю ошибку в imap.insert(pair(a,-2));. Это также дает огромную трассировку, показывающую проблемы, в основном с malloc.

Он не переходит в бесконечную рекурсию. Максимально существует факториал длины входной строки, и я вставляю строку только тогда, когда она не найдена на карте.


  • Ну, вы прошлись по коду в отладчике, чтобы увидеть, где происходит исключение? 27.10.2014
  • Вы уверены, что у вас достаточно оперативной памяти для обработки рекурсивной глубины 8 nPr 8? Каждый раз, когда вы вызываете easyStrings, вы используете все больше и больше места в куче со всеми новыми строками, которые вы объявляете. 27.10.2014

Ответы:


1

Беглый взгляд на эту функцию с помощью gdb показывает, что эта функция является рекурсивной, и что строки более определенной длины вызывают ее вход в рекурсию бесконечной глубины (или, по крайней мере, такую ​​глубину, с которой не могут справиться 4 гигабайта ОЗУ). Я бы посмотрел на ваши условия рекурсии и дважды проверил, есть ли случай выхода, который будет выполнен для всех из них.

27.10.2014
  • Он не переходит в бесконечный цикл, но я чувствую, что недостаточно памяти для выделения - единственная возможная причина. Спасибо. 27.10.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..