Подтвердить что ты не робот

Простое объяснение постоянных структур данных

Я работаю над библиотекой для Python, которая реализует некоторые постоянные структуры данных (в основном как учебное упражнение). Тем не менее, я начинаю понимать, что объяснение постоянных структур данных незнакомым с ними людям может быть затруднено. Может ли кто-нибудь помочь мне подумать о легком (или, по крайней мере, наименее сложном) способе описания постоянных структур данных для них?

У меня было несколько человек, которые сказали мне, что документация, которая у меня есть, несколько запутанна.

(И прежде, чем кто-либо спросит, я не имею в виду постоянные структуры данных, как и в файловой системе. Постоянные структуры данных Google, если вы неясны в этом.)

4b9b3361

Ответ 1

Попробуйте следующее:

Постоянными структурами данных являются структуры данных, которые, в отличие от массивов или списков, всегда сохраняют свою исходную структуру и содержимое.

Они эффективно неизменяемы - вместо изменения такой структуры любое вычисление даст новую копию, оставив исходную структуру неизменной. В то время как традиционные структуры данных следуют императивной (основанной на изменении) философии, постоянные обычно используются в функциональном программировании, где в крайних случаях вообще никаких изменений не допускается. Преимущество этой парадигмы состоит в том, что постоянные данные намного безопаснее, часто легче обрабатываются и даже предотвращают ошибки, связанные с непреднамеренными изменениями и проблемами многопоточности. Многие проблемы могут быть сформулированы функционально более сжатым способом.

Пример для непостоянной структуры данных: Список (векторный список)

list = [1, 2, 3]
# List is [1, 2, 3]

list += [4]
# Added an element at the end

list[0] = 42
# We changed the first element to 42
# List is [42, 2, 3, 4]

Пример сохранения: Связанные списки (Haskell)

list = [1, 2, 3]
# List is [1, 2, 3]

list2 = 0 : list
# List2 combines [0] and [1, 2, 3] to [0, 1, 2, 3]
# List is still [1, 2, 3]

list3 = updateAt 0 42 list
# List3 contains the elements of list2 with the first one set to 42
# List and List2 still hold their original values

Ответ 2

Объяснение "постоянных" структур данных намного проще, если вы используете слово, которое использует сообщество Python: "неизменный".

Каждый понимает неизменяемые числа. 2+2 не может обновить 2, он должен создать новое значение.

Все понимают изменчивые списки. [2, 3].append(4) действительно обновляет список [2,3]. Список изменен, отдельные номера не совпадают. См. Выше.

Крутой шаг объясняет неизменяемые кортежи. (2,3).append(4) не может существовать, потому что кортеж является неизменяемой ( "постоянной" ) структурой данных. В этом случае ни кортеж, ни числа не изменяются.

Неизменяемые струны также имеют смысл. "hello" + "there" не может обновить строку "привет", но может создать новую строку.

Некоторые люди отказываются от этого. Обратитесь к кортежам и целым числам. Это проще строки ведут себя как цифры, чем ведут себя как списки.

Номера неизменяемых fractions и decimal являются хорошими примерами неизменяемых ( "постоянных" ) структур данных.

Ответ 3

Такая фразировка, которую я предлагаю, заключается в том, что значение данной структуры является постоянным для вызовов функций, и что любые вызовы функций, которые приводят к изменению результата структуры, создают новую структуру, созданную на основе copy-on- изменить семантику.

Например, если задана структура типа cons, обозначенная как cons (1, cons (2, cons (3, None))), добавление значения 0 в этот список приводит к новому списку L ', определенному как cons (0, L), который расширяется до минус (0, минусы (1, минусы (2, минусы (3, нет)))). Однако для добавления значения 4 в этот список требуется изменение значения, что приводит к созданию копии, которая содержит изменение: cons (0, cons (1, cons (2, cons (3, cons ( 4, None)))))

Очевидно, что у вас могут быть более эффективные реализации, но это одно из логических представлений о том, что может произойти.

Лично предпочитайте термин неизменяемый список, который вы можете сказать, отличается от обычного кортежа python (упорядоченным), поскольку он определяет добавление, добавление и конкатенацию, поскольку это, вероятно, более яснее для среднего разработчика: -)

Ответ 4

Другими полезными концептуальными словами для описания постоянных структур данных являются "Снимок" или "Версия", которым вы можете предшествовать "виртуальные", потому что эффективная реализация постоянной структуры не просто сделает несколько копий. Библиотеки постоянной базы данных стремятся эффективно и эффективно хранить и обрабатывать структуры.

Частичная персистентность позволяет изменять текущую структуру, но позволяет запрашивать предыдущие версии этой структуры. Полная настойчивость позволяет изменять любую версию структуры и запрашивать ее. В обоих случаях любая модификация не влияет на целостность предыдущих версий, которые все еще могут отображаться/запрашиваться, как они были до изменений.

Я думаю, что для страницы презентации вашего проекта вы можете использовать большую часть формулировок от Dario и S.Lott, пытаясь решить следующие проблемы:

  • Краткое описание того, какие структуры постоянных данных
  • возможно, ссылка или две на основные статьи введения концепции
  • Быстрый вывод о том, что этот проект не связан с сохранением данных (на диске и т.д.)
  • Где это используется
  • Что он может сделать для вас.
  • Краткие фрагменты кода и их вывод

Кроме того, удалите [из домашней страницы] данные о типе данных /isinstance и все такое. Это ценная информация, но только для использования в руководстве пользователя или в каком-либо другом подробном ресурсе.

Ответ 5

Я думаю, что ключевым моментом является то, что постоянные структуры данных - это оптимизация для обработки неизменяемых значений.

Но это важная оптимизация, даже с быстрым процессором и большой памятью.

Например, строки Java неизменяемы, но у них нет постоянной структуры данных за кулисами. Это означает, что вы должны использовать такие вещи, как StringBuilder. Если бы у них была постоянная структура данных, вы могли бы просто конкатенировать и не беспокоиться об этом.

Неизменность становится важной, поскольку она помогает справиться с concurrency. Но для обеспечения непреложной эффективности требуются постоянные структуры данных.

Clojure имеет несколько хороших объяснений постоянных структур данных.

Ответ 6

Когда вы изменяете изменяемую структуру данных (например, вставляете в хеш-таблицу), она изменяется на месте, а предыдущая версия теряется. Когда вы изменяете постоянную структуру данных (например, вставляете в Map), вы получаете новую структуру данных, и предыдущая версия остается в силе.