Как бы я добавил массив строк в двоичное дерево, не достигая максимального количества итераций в Python?

У меня есть словарь слов, содержащий 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)

Это то, что у меня есть. Любые решения будут оценены! :)

двоичное дерево из 370 тыс. элементов должно иметь рекурсию 19 глубин (log2 (370 тыс.)), что мало. У вас, вероятно, есть ошибка в вашей реализации

Lior Cohen 12.12.2020 22:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я утверждаю, что с вашим кодом все в порядке (по крайней мере, не так уж много), а скорее виноваты ваши данные. Если ваш ввод отсортирован, вы получите переполнение стека — этот подход предполагает случайно разбросанные данные. В противном случае вы получите однобокое дерево и переполнение стека. С моим собственным тестовым списком из 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()

Другие вопросы по теме