Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2015, 07:10   #1
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию Оптимизировать задачу на графы

Здравствуйте! Вот сделал одну задачу олимпиадного уровня, и в системе проверки на 4 тесте вылетает с ошибкой "лимит памяти" (больше 3000кб)
помогите, подскажите, как оптимизировать алгоритм, или поменять способ прохода по дереву, что бы памяти "ело" меньше.
Дан набор слов. Требуется определить количество вершин в луче, построенном над ними.

Входные данные:
В первой строчке находится число N - количество слов, N не превышает 10000
В каждой следующий строчке записано очередное слово, состоящее из заглавных английских букв.
Длина слова не превышает 20 символов.

Выходные данные:
Одно число - количество вершин в луче

Пример входных данных:
4
CAT
CLEAR
CAR
MORE

Пример выходных данных:
13
Пояснение примера. На рисунке изображен луч, построенный над набором слов 'CAT', 'CLEAR', 'CAR', 'MORE'.

имеющийся код:
Код:
#include <string>
#include <iostream>
 
using namespace std;
 
struct node {                   // объявление структуры для дерева
    node *children[25];
};
 
int _tmain(int argc, _TCHAR* argv[]) {
    node *tree = new struct node;  // выделение памяти для дерева
    for (int i = 0; i < 25; ++i)             // обнуления веток
        tree->children[i] = NULL;
 
    node *current = tree;// присвоение текущей вершини - первой
 
    int N, cnt = 1;
    cin >> N; // считываем количество слов
    for (int i = 0; i < N; ++i) {
        string word;
        cin >> word; // считывание слова
        current = tree;
        for (int j = 0; j < word.length(); ++j) { // цикл по количеству символов в слове
            if (current->children[word[j] - 65] == NULL) {         //если элемент  под номером (код символа - 65) = NULL тогда
                current->children[word[j] - 65] = new struct node;// создаем новую ветку, выделяем память.
                current = current->children[word[j] - 65];  //переносим указатель текущей ветки на только, что "созданной ветке"
                cnt++;// увеличиваем счетчик вершин
                for (int m = 0; m < 25; ++m) {  //обнуления подветок только что созданной ветки
                    current->children[m] = NULL;
                }
            }
            else {        //если элемент под номером (код символа - 65)  не NULL тогда
                current = current->children[word[j] - 65];// переходим к следующей подветке
            }
        }
    }
    cout << cnt << endl;// вывод результата
    return 0;
}
Dmitry_DM вне форума Ответить с цитированием
Старый 06.04.2015, 07:36   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Залейте фотку через расширенный режим-управление вложениями
И было бы прекрасно, если бы Вы дали ссылку на задачу
Poma][a вне форума Ответить с цитированием
Старый 06.04.2015, 09:48   #3
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию

http://atpp.vstu.edu.ru/cgi-bin/arh_....pl?id_prb=253
Dmitry_DM вне форума Ответить с цитированием
Старый 06.04.2015, 09:57   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ставлю на то, что все проблемы из-за того, что Вы не освобождаете память
Poma][a вне форума Ответить с цитированием
Старый 06.04.2015, 10:15   #5
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Ставлю на то, что все проблемы из-за того, что Вы не освобождаете память
возможно, а если так, то как высвободить память в моем случае?
Dmitry_DM вне форума Ответить с цитированием
Старый 06.04.2015, 16:01   #6
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию

вот ссылка на алгоритм, который подошел бы... но он не компилирует, выдавая ошибки:
'cend' is not a member of 'LinksMap'
'cbegin' is not a member of 'LinksMap'
'cend' is not a member of 'LinksMap'
что делать?
Dmitry_DM вне форума Ответить с цитированием
Старый 06.04.2015, 16:09   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
вот ссылка на алгоритм, который подошел бы...
Не, не подошел бы
Цитата:
возможно, а если так, то как высвободить память в моем случае?
Пробежаться по всем детям рекурсием..
Что-то типа :
Код:
void delete_tree (node *current)
{
    if (current == NULL) return;
    for (int i = 0; i < 25; ++i)  
                    delete(current->children[m]);
    <а тут удаляем.. не помню как>
}
Poma][a вне форума Ответить с цитированием
Старый 06.04.2015, 16:56   #8
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию

а если все-таки вспомнить, как удалить?
напишите, пожалуйста!
Dmitry_DM вне форума Ответить с цитированием
Старый 06.04.2015, 17:11   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

delete current
Poma][a вне форума Ответить с цитированием
Старый 06.04.2015, 18:06   #10
Dmitry_DM
 
Регистрация: 07.08.2012
Сообщений: 8
По умолчанию

ну и не помогло это... как был лимит памяти, так и остался
Код:
#include <string>
#include <iostream>
 
using namespace std;
 
struct node {                   // объявление структуры для дерева
    node *children[25];
};
 
 void delete_tree (node *current)
{
    if (current == NULL) return;
    for (int i = 0; i < 25; ++i)  
                    delete(current->children[i]);
    delete current;
}
 
 
int main() {
    node *tree = new struct node;  // выделение памяти для дерева
    for (int i = 0; i < 25; ++i)             // обнуления веток
        tree->children[i] = NULL;
 
    node *current = tree;// присвоение текущей вершини - первой
 
    int N, cnt = 1;
    cin >> N; // считываем количество слов
    for (int i = 0; i < N; ++i) {
        string word;
        cin >> word; // считывание слова
        current = tree;
        for (int j = 0; j < word.length(); ++j) { // цикл по количеству символов в слове
            if (current->children[word[j] - 65] == NULL) {         //если элемент  под номером (код символа - 65) = NULL тогда
                current->children[word[j] - 65] = new struct node;// создаем новую ветку, выделяем память.
                current = current->children[word[j] - 65];  //переносим указатель текущей ветки на только, что "созданной ветке"
                cnt++;// увеличиваем счетчик вершин
                for (int m = 0; m < 25; ++m) {  //обнуления подветок только что созданной ветки
                    current->children[m] = NULL;
                }
            }
            else {        //если элемент под номером (код символа - 65)  не NULL тогда
                current = current->children[word[j] - 65];// переходим к следующей подветке
            }
        }
    }
    delete_tree(tree);
    cout << cnt << endl;// вывод результата
    return 0;
}
Dmitry_DM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо оптимизировать задачу паскаль anton.dasuik Помощь студентам 2 28.02.2013 20:28
Оптимизировать код strannick Microsoft Office Excel 9 14.11.2012 00:59
Оптимизировать код) Pein95 Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 18:42
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57