У меня есть словарь слов, содержащий 370100 элементов (строк). Мне нужно добавить их в двоичное дерево, чтобы отсортировать и найти их. Как бы я сделал это, не нажимая максимальные итерации python? Я пытался использовать sys.setrecursionlimit, но это было медленно и в конце концов выдало zsh: ошибка сегментации python tree.py.
import sys
class Node(object):
def __init__(self, value):
self.value = value
self.left = None
self.right = None
self.count = 1
def __str__(self):
return 'value: {0}, count: {1}'.format(self.value, self.count)
def insert(root, value):
if not root:
return Node(value)
elif root.value == value:
root.count += 1
elif value < root.value:
root.left = insert(root.left, value)
else:
root.right = insert(root.right, value)
return root
def create(seq):
root = None
for word in seq:
root = insert(root, word)
return root
def search(root, word, depth=1):
if not root:
return 0, 0
elif root.value == word:
return depth, root.count
elif word < root.value:
return search(root.left, word, depth + 1)
else:
return search(root.right, word, depth + 1)
def print_tree(root):
if root:
print_tree(root.left)
print (root)
print_tree(root.right)
def toArr(txtfile):
txtArr = []
file = txtfile
for line in file:
txtArr.append(line)
return txtArr
dictionary = open('dictionary.txt', 'r')
dic = toArr(dictionary)
sys.setrecursionlimit(370100)
tree = create(dic)
print_tree(tree)
Это то, что у меня есть. Любые решения будут оценены! :)
Я утверждаю, что с вашим кодом все в порядке (по крайней мере, не так уж много), а скорее виноваты ваши данные. Если ваш ввод отсортирован, вы получите переполнение стека — этот подход предполагает случайно разбросанные данные. В противном случае вы получите однобокое дерево и переполнение стека. С моим собственным тестовым списком из 250 тысяч слов я смог заставить ваш код работать, если я их перетасовал, и заставить ваш код сломаться, если я их отсортировал.
Моя переработка вашего кода, чтобы превратить некоторые из ваших функций в методы:
class Node():
def __init__(self, value):
self.value = value
self.left = None
self.right = None
self.count = 1
def __str__(self):
return 'value: {0}, count: {1}'.format(self.value, self.count)
def print_tree(self):
if self.left:
self.left.print_tree()
print(self)
if self.right:
self.right.print_tree()
def search(self, word, depth=1):
if self.value == word:
return depth, self.count
if word < self.value:
if self.left:
return self.left.search(word, depth + 1)
else:
if self.right:
return self.right.search(word, depth + 1)
return 0, 0
def insert(root, value):
if not root:
return Node(value)
if root.value == value:
root.count += 1
elif value < root.value:
root.left = insert(root.left, value)
else:
root.right = insert(root.right, value)
return root
def create(seq):
root = None
for word in seq:
root = insert(root, word)
return root
def toArr(txtfile):
with open(txtfile) as file:
return [line.rstrip('\n') for line in file]
array = toArr('dictionary.txt')
tree = create(array)
tree.print_tree()
двоичное дерево из 370 тыс. элементов должно иметь рекурсию 19 глубин (log2 (370 тыс.)), что мало. У вас, вероятно, есть ошибка в вашей реализации