Для некоторых простых структур данных (например, стека) вы можете просто использовать встроенный список, чтобы выполнить свою работу.С более сложными структурами (например, фильтром Блума) вам придется реализовывать их самостоятельно, используя примитивы, которые поддерживает язык.
Вы должны использовать встроенные функции, если они действительно служат вашим целям, поскольку они отлажены и оптимизированы множеством людей в течение длительного времени.Выполнение этого с нуля, вероятно, приведет к ухудшению структуры данных.Независимо от того, используете ли вы Python, C ++, C #, Java, что угодно, вы всегда должны в первую очередь обращаться к встроенным структурам данных.Как правило, они будут реализованы с использованием тех же системных примитивов, которые вы должны будете использовать, делая это самостоятельно, но с преимуществом того, что их попробовали и протестировали.
Комбинации этих структур данных (и, возможно, некоторые из функций из помощника).таких модулей, как heapq и bisect ), как правило, достаточно для реализации наиболее богатых структур, которые могут потребоваться при программировании в реальной жизни;однако, это не всегда так.
Только когда предоставленные структуры данных не позволяют вам выполнить то, что вам нужно, и нет альтернативной и надежной библиотеки, доступной для вас, если вам стоит обратить внимание на созданиечто-то с нуля (или расширение того, что предусмотрено).
Допустим, вам нужно нечто большее, чем предоставляет богатая библиотека python, рассмотрим тот факт, что атрибуты объекта (и элементы в коллекциях) по сути являются «указателями» на другиеобъекты (без арифметики указателей), т. е. «перезаписываемые ссылки» в Python, как и в Java.В Python вы обычно используете значение None
в атрибуте или элементе для представления значения NULL
в C ++ или null
в Java.
Так, например, вы можете реализовать двоичный файлдеревья через, например:
class Node(object):
__slots__ = 'data', 'left', 'right'
def __init__(self, data=None, left=None, right=None):
self.data = data
self.left = left
self.right = right
плюс методы или функции для обхода и аналогичных операций (атрибут класса __slots__
является необязательным - в основном это оптимизация памяти, чтобы каждый экземпляр Node
не переносил свой собственный *)1023 *, который будет значительно больше, чем три необходимых атрибута / ссылки.
Другие примеры структур данных, которые лучше всего могут быть представлены выделенными классами Python, а не прямым составлением других существующих структур Python, включаютtries
(см., Например, здесь ) и graphs
(см., Например, здесь ).