Які класи структур даних можна зробити стійкими?


19

Стійкі структури даних - це незмінні структури даних. Операції над ними повертають нову "копію" структури даних, але змінену операцією; стара структура даних залишається незмінною. Ефективність зазвичай досягається шляхом обміну деякими базовими даними та уникнення повного копіювання структури даних.

Запитання:

  • Чи є результати щодо класів структур даних, які можна зробити стійкими (зберігаючи однакові або дуже схожі складності)?

  • Чи можна зробити всі структури даних стійкими (зберігаючи однакові або дуже схожі складності)?

  • Чи відомо, що будь-які структури даних не можуть бути стійкими (зберігаючи однакові або дуже схожі складності)?


1
Ви не можете зробити вектор стійким із збереженою складністю O (1) для доступу до випадкового елемента.
smossen


2
@smossen ти можеш це довести?
Realz Slaw

1
Ваше перше запитання - дуже широке запитання. Є багато результатів по темі структур даних, які можна зробити стійкими. Можна написати цілу книгу на цю тему, і деякі люди мають: наприклад, книга Окасакі - це класика на цю тему. Ви зробили кілька досліджень на цю тему? Чи можете ви звузити питання? Я думаю, що це може бути занадто широким, щоб добре підходити для цього сайту. Може, розділити 3-е питання на окреме запитання?
DW

@Realz Slaw: Я не можу це довести формально, але думаю, що це здоровий глузд. O (1) доступ до елементів у векторах (включаючи хеш-таблиці) залежить від фіксованого часу для розшифровки адреси на певному апаратному забезпеченні. Наполегливість додає один-два виміри на додаток до векторного індексу. Але апаратні адреси все одно одновимірні.
smossen

Відповіді:


22

Позитивний результат: наполегливість не надто коштує. Можна показати, що кожну структуру даних можна зробити повністю стійкою з максимум уповільненням.O(lgn)

Доведення: Ви можете взяти масив і зробити його стійким, використовуючи стандартні структури даних (наприклад, збалансоване бінарне дерево; див. Кінець цієї відповіді для більш детальної інформації). При цьому виникає O(lgn) уповільнення : кожен доступ до масиву займає час із стійкою структурою даних, а не O ( 1 ) час для непостійного масиву. Тепер візьміть будь-який імперативний алгоритм, час роботи якого в моделі оперативної пам'яті дорівнює O ( f ( n ) ) , де n позначає об'єм використовуваної пам'яті. Представити всю пам'ять як один великий масив (зO(lgn)O(1)O(f(n))n елементів), і зробіть його стійким, використовуючи стійку карту. Кожен крок імперативного алгоритму має максимум O ( lg n ) уповільнення, тому загальний час роботи O ( f ( n ) lg n ) .nO(lgn)O(f(n)lgn)

Мабуть, можна зробити трохи краще: мабуть, можна зменшити коефіцієнт уповільнення до (очікуваний, амортизований час), використовуючи методи, наведені нижче в документі Demaine, - але я не знайомий з деталями цієї роботи, тому я не можу поручитися за це сам. Завдяки jbapple за це спостереження.O(lglgn)


Негативний результат: у деяких структурах даних ви не можете уникнути деякого уповільнення. Щоб відповісти на ваше третє запитання, існують структури даних, де відомо, що їх наполегливість вносить деяке уповільнення.

Зокрема, розглянемо масив з елементів. Без наполегливості кожен доступ до масиву займаєn (в моделі ОЗУ). З наполегливістю, очевидно, було показано, що немає способу побудувати стійкий масив знайгіршим випадком складності O ( 1 ) для доступу до випадкового елемента. Зокрема, мабуть, нижня межа показує, що повністю стійкі масиви повинні матичас доступу Ω ( lg lg n ) . Ця нижня межа стверджується на п.3 наступного документу:O(1)O(1)Ω(lglgn)

Нижня межа приписується Михайлові Патраску, але немає жодного посилання на джерело, яке б наводило деталі доказу цієї твердженої нижньої межі.


Багата область досліджень. Якщо ми візьмемо довільну структуру даних або алгоритм, це делікатне запитання, чи можна зробити його стійким з максимум уповільнення чи ні. Я не знаю жодної загальної теореми класифікації. Однак існує багато досліджень щодо того, як зробити конкретні структури даних стійкими та ефективними.O(1)

Існує також міцний зв’язок з функціональними мовами програмування. Зокрема, кожна структура даних, яка може бути реалізована суто функціональним способом (без мутацій), - це вже стійка структура даних. (Навпаки, це не обов'язково, на жаль.) Якщо ви хочете косити очі, ви можете сприймати це як деяку слабку різновид теореми часткової класифікації: якщо вона реалізовується в чисто функціональній мові програмування з тими ж межами часу, що і в Імперативна мова, то існує стійка структура даних з тими ж межами часу, що і непостійна. Я усвідомлюю, що це, мабуть, не те, що ви шукали - це здебільшого лише тривіальне переформулювання ситуації.


Як створити стійкий масив. Я не буду намагатися описати конструкцію, як створити повністю стійкий масив з найгіршим часом доступу . Однак основні ідеї не надто складні, тому я підсумую суть ідей.O(lgn)

Основна ідея полягає в тому, що ми можемо прийняти будь-яку структуру даних бінарних дерев і зробити її стійкою за допомогою методики, званої копіювання контуру . Скажімо, у нас є двійкове дерево, і ми хочемо змінити значення в якомусь листі . Однак для наполегливості ми не наважуємось змінювати значення у цьому листі на місці. Натомість ми робимо копію цього аркуша та змінюємо значення в копії. Потім ми робимо копію його батьківського і змінюємо відповідний дочірній вказівник на копію, щоб вказати на новий лист. Продовжуйте таким чином, клонуючи кожен вузол на шляху від кореня до листа. Якщо ми хочемо змінити лист на глибині d , для цього потрібно скопіювати d вузлів.dd

Якщо у нас збалансоване двійкове дерево має вузлів, то всі листя мають глибину O ( lg n ) , тому ця операція над двійковим деревом займаєnO(lgn) . Я пропускаю деякі деталі - щоб досягти O ( lg n ) найгіршого часу, нам може знадобитися перебалансувати дерево, щоб воно залишалося збалансованим - але це дає суть цього.O(lgn)O(lgn)

Більше пояснень із гарними картинками можна знайти на таких ресурсах:

Це дасть вам головну думку. Є додаткові деталі, про які слід подбати, але деталі не входять у це питання. На щастя, це все стандартні речі, і в літературі є багато інформації про те, як будувати такі структури даних. Не соромтеся задавати окреме запитання, якщо вищевказаних ресурсів недостатньо та хочете отримати більше інформації про деталі побудови стійкої структури даних масиву.


Я не дуже розумію перший абзац, як би я почав робити масив стійким за допомогою червоно-чорного дерева?
Г. Бах

@ G.Bach, в розділах з назвою "Дерева бінарного пошуку" та "Структура довільного доступу" (конкретно, метод дерева) є досить вдале пояснення на веб- сторінці toves.org/books/persist/index.html . Ще один приємний опис дивіться у netcode.ru/dotnet/?artID=6592#BinaryTrees та деяких наступних розділах. Це дасть вам головну думку. Деталі виходять за рамки цього питання, але це все стандартні речі; Я рекомендую вам задати окреме запитання, якщо ви хочете отримати більше інформації про те, як створити таку структуру даних.
DW

4
O(lglgn)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.