2010-04-03 5 views
2

Так что в настоящее время я получаю странное исключение переполнения стека при попытке запустить эту программу, которая считывает числа из списка в файле данных/текста и вставляет его в двоичное дерево поиска. Странно то, что когда программа работает, когда у меня есть список из 4095 номеров в случайном порядке. Однако, когда у меня есть список из 4095 номеров в порядке возрастания (поэтому он создает линейное дерево поиска), он выдает сообщение о переполнении стека. Проблема не в переменной статического счетчика, потому что даже когда я ее удалил, и положил t = новый BinaryNode (x, 1), он по-прежнему выдал исключение переполнения стека. Я попытался отладить его, и он сломался на if (t == NULL){ t = new BinaryNode(x,count);. Вот функция вставки.проблема переполнения стека в программе

BinaryNode *BinarySearchTree::insert(int x, BinaryNode *t) { 
static long count=0; 
count++; 

if (t == NULL){ 
    t = new BinaryNode(x,count); 
    count=0; 
} 
else if (x < t->key){ 
    t->left = insert(x, t->left); 
} 
else if (x > t->key){ 
    t->right = insert(x, t->right); 
} 
else 
    throw DuplicateItem(); 
return t; 
} 
+0

хороший титул и тег – Brij

+1

Что такое ваш вопрос? Вы, кажется, уже знаете, что вызывает вашу проблему (создание линейного дерева поиска). Вы пытаетесь понять, почему 4096 вызовов функций переполняют ваш стек? Вы пытаетесь выяснить, почему вы выполняете 4096 вызовов функций? Вы пытаетесь выяснить, как избежать 4096 вызовов функций? – Gabe

+0

Неудивительно ... 'слишком много рекурсии': переполнение стека, на statckoverflow [.com]. ;-) (Просто шучу!) – mjv

ответ

1

В языке, как C++, вы не можете использовать рекурсивные алгоритмы на высоких деревьев, потому что каждый вызов функции использует дополнительное пространство на ограниченном стеке. Вы должны либо изменить свой алгоритм (использовать итерацию, а не рекурсию) или использовать сбалансированную двоичную древовидную структуру.

Если у вас ограниченный вход (как вы видите, в этом случае), вы можете сбросить давление в стеке, сделав стек больше (как предполагает Андреас) или поместите меньше данных в стек. Кажется, что insert является функцией-членом класса BinarySearchTree, хотя он не ссылается ни на какие другие члены класса. Если вы сделаете insert статическим методом (или обычной функцией, не входящей в класс), ему не нужно будет нажимать указатель this на стек для каждого вызова функции, и вы сможете получить больше итераций до переполнения.

+0

Проблема в том, что я должен протестировать эту программу с 4095 в порядке возрастания. Я предполагаю, что я пытаюсь спросить, есть ли способ избежать переполнения стека, в то же время используя рекурсию? – Jay

+0

Вы уже проверили программу, и она разбилась. Вы должны получить другой результат? Это звучит как домашнее задание. Почему бы просто не опубликовать ваши фактические требования? – Gabe

+0

Я должен протестировать 36 разных файлов данных, записать общее количество узлов и среднюю стоимость поиска для дерева, которое делает каждый файл. Мой код работает для 35 из этих файлов данных, за исключением одного с 4095 номерами в порядке возрастания. Он работает на 1024 номера в порядке возрастания и 4095 в случайном порядке. Переменная подсчета, с которой создается экземпляр узла, - это стоимость поиска. Код для вставки уже был указан. Я не решаюсь изменить его полностью только для одного файла данных, который разбивается =/ – Jay

0

Вы можете увеличить размер стека. В зависимости от того, какой компилятор вы работаете с этим, выполняется по-разному. Например, в Visual Studio размер стека может быть установлен с помощью опции командной строки:

/F stacksize 
+0

Я пытался увеличить его 200 000, 2000 000, и оба раза он имел исключение переполнения стека на том же месте .. i.e. он только поднялся до 747 на обоих, а не увеличился, когда я увеличил размер =/ – Jay

+0

Джей, вы говорите, что на самом деле вы используете Visual Studio и что вы устанавливаете размер стека с помощью '/ F 2000000', и все же он запускался с меньшим количеством итераций? Скажите, что вы не использовали '/ F 200 000'. – Gabe

+0

Я увеличил размер резерва стека в компоновщике до 10 000 000, чтобы он работал (без запятых) – Jay