Структуры данных с Python - PullRequest
2 голосов
/ 01 февраля 2012

В Python есть много удобных структур данных (списков, кортежей, диктов, множеств и т. Д.), Которые можно использовать для создания других «обычных» структур данных (например, я могу использовать список Python для создания стека и коллекций.dequeue для создания очереди, диктовки для создания деревьев и графиков и т. д.).

Существуют даже сторонние структуры данных, которые можно использовать для конкретных задач (например, структуры в Pandas, pytables и т. д.).

Итак, если я знаю, как использовать списки, диктанты, наборы и т. Д., Могу ли я реализовать любую произвольную структуру данных, если я знаю, что она должна выполнять?

ВДругими словами, для каких структур данных нельзя использовать структуры данных Python?

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 февраля 2012

Для некоторых простых структур данных (например, стека) вы можете просто использовать встроенный список, чтобы выполнить свою работу.С более сложными структурами (например, фильтром Блума) вам придется реализовывать их самостоятельно, используя примитивы, которые поддерживает язык.

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

1 голос
/ 01 февраля 2012

Вы можете использовать структуры данных Python, чтобы делать все что угодно. Весь язык программирования Lisp (теперь люди используют Common Lisp или Scheme) построен вокруг структуры данных связанного списка, и программисты на Lisp могут построить любую структуру данных, которую они выберут.

Тем не менее, иногда существуют структуры данных, для которых структуры данных Python - не лучший вариант. Например, если вы хотите построить Splay Tree, вы должны либо свернуть свой собственный, либо использовать проект с открытым исходным кодом, например pysplay . Если встроенные структуры данных решают вашу проблему, используйте их. В противном случае, посмотрите за пределы встроенных структур данных. Как всегда, используйте лучший инструмент для работы.

0 голосов
/ 01 февраля 2012

Учитывая, что все структуры данных существуют в памяти, а память фактически представляет собой просто list (массив) ... нет структуры данных, которая не может быть выражена в терминах базовых структур данных Python (с соответствующим кодом взаимодействовать с ними). ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...