Структурні дані даних, що мають постійний час оновлення, без замкнень?


20

Останнім часом я читав трохи літератури і знайшов досить цікаві структури даних.

Я досліджував різні методи приведення часу оновлення до найгіршого часу оновлення [1-7].O(1)

Нещодавно я почав шукати безблокові структури даних для підтримки ефективного одночасного доступу.

Чи були використані будь-які з цих найгірших випадків методи оновлення часу для впровадження безблокових структур даних?O(1)

Прошу, бо; мені здаються очевидним практичним продовженням цього "теоретичного вдосконалення".


  1. Тарджан, Роберт Ендре. "Оновлення збалансованого дерева пошуку в обертаннях O (1)". Літери обробки 16, вип. 5 (1983): 253 - 257.

  2. Дрісколл, Дж. Р., Н Сарнак, Д. Д. Слятор та Р. Р. Тарджан. «Створення стійких структур даних». У матеріалах XVIII річного симпозіуму ОСБ з теорії обчислень, 109–121. STOC '86. Нью-Йорк, Нью-Йорк, США: ACM, 1986.

  3. Левкопулос, К., Марк Х. Овермарс. "Збалансоване дерево пошуку з O (1) Найгірший час оновлення справ". Acta Inf. 26, ні. 3 (листопад 1988 р.): 269–277.

  4. Флейшер, Рудольф. Просте збалансоване дерево пошуку з O (1) найгіршим часом оновлення

  5. Дієц, Павло Ф і Радєєв Раман. «Дерево пошуку пальців постійного оновлення». Листи з обробки інформації 52, вип. 3 (1994): 147 - 154.

  6. Лагогіаніс, Джордж, Христос Макрис, Янніс Панагіс, Спірос Сіутас і Костас Циклас. "Нові динамічні збалансовані дерева пошуку з найгіршим постійним часом оновлення". J. Autom. Ланг. Гребінець. 8, ні. 4 (липень 2003 р.): 607–632.

  7. Бродал, Герт Столтінг, Джордж Лагогіаніс, Христос Макрис, Атанасіос Цакалідіс та Костас Циклас. "Оптимальні пальчикові дерева пошуку в машині вказівника". J. Comput. Сист. Наук. 67, ні. 2 (вересень 2003 р.): 381–418.


2
Розгляньте, як додавати посилання на документи як люб’язно людям, які хочуть дослідити вашу проблему.
Рафаель

3
Гаразд, додано у посиланнях на відповідні статті.
АТ

1
Я пропоную повторне розміщення на сайті cstheory.SE (з посиланням тут), якщо ви не отримаєте корисну відповідь незабаром.
JeffE

1
Дякую за пропозицію. Я відмовився: одночасні структури даних дерев, що
AT

Раніше я використовував практичну бібліотеку структур без замків . Вони мають певну підтримку безблокових структур даних дерев. Можливо, є те, що ви шукаєте.
Реза

Відповіді:


4

O(1) не допомагає сам по собі. У структурі даних без блокування потрібно мати один атомний екземпляр, коли структура даних, як видається, змінюється. Усі інваріанти представництва повинні діяти як безпосередньо перед, так і безпосередньо після цього атомного моменту.

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

Захист від блокування зазвичай найпростіший, коли ваші структури даних незмінні ( чисто функціональні ). Ви просто зберігаєте глобальний покажчик на поточну версію структури даних. Читачам не потрібно нічого блокувати. Зміни структури даних здійснюються шляхом заміни глобального вказівника на одну незмінну структуру даних на іншу.

Наприклад: якщо у вас є чисто функціональне дерево, збалансоване дерево, ви:

  1. Запишіть поточний глобальний покажчик на корінь дерева.
  2. Створіть нове дерево, яке вставить або видалить вузол. (Це логарифмічно в часі та просторі в кількості вузлів, що перебувають у дереві, і передбачає створення нових вузлів від точки модифікації до кореня, а також просто вказівку на все нове на старі частини попередньої версії структури даних. )
  3. Атомно порівняйте та замініть глобальний вказівник на корінь. (Зверніть увагу, що це може бути невдалим, якщо відбулася інша модифікація між часом, коли ви записали старий кореневий покажчик і зараз. Якщо це трапиться, ви поверніться до кроку 1 і повторіть спробу. Це так званий "оптимістичний контроль сумісності".)

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

Редагувати : Як зазначав @Raphael, існують методи для забезпечення безперешкодної зміни даних. Конструкція підтверджує, що це завжди можна зробити: Поки у вас є єдиний глобальний вказівник на "верх" вашої структури даних, навіть якщо він є змінним, ви завжди можете скопіювати всю структуру даних, зробіть ваші моди в скопіюйте, а потім, використовуючи оптимістичний контроль одночасності, спробуйте порівняти та замінити вказівник на щойно викарбувані структури даних для оригіналу. Краса функціональних структур даних на основі дерева полягає в тому, що вони зберігають витрати на копіювання в структури розміру .O ( N )O(log(N))O(N)


Я думаю, що методи активного очікування, наприклад, із порівнянням і заміною, зазвичай називаються "фіксацією без замикання", тож існують певні шляхи виходу навіть у зміненому режимі.
Рафаель

Я не знайомий з терміном активного очікування (а Google не допомагає). (Якщо ви говорите про роботу Когана та Петранка, це показує, як перетворити алгоритми без блокування в режим очікування.) Я додав редагування про те, як можна боротися із змінністю свободи блокування взагалі.
Мандрівна логіка

Під "активним очікуванням" я маю на увазі щось на зразок, while ( !P ) { noOp(); } doWork();де noOpможе бути sleepчи подібне.
Рафаель

У частині Редагування ви згадали про техніку створення блокувальних структур даних без блокування. Як зазначено, ми копіюємо всю структуру даних, робимо моди до копії, а потім використовуємо примітив CAS. Однак як зробити Copyкрок атомним? Здається, це ще одна складна проблема atomic snapshot.
hengxin

@hengxin: подумайте про примітив CAS як оператор "опублікувати". Перед публікацією структури даних доступ до неї має лише нитка, яка виконує модифікації. Після опублікування структури даних вона непорушна. Крок копіювання не повинен бути атомним, тому що єдине, що може бути потоком копіювання, - це опублікована версія, яка незмінна. Якщо дві нитки одночасно намагаються мутувати, вони обидва копіюють одну і ту ж незмінну структуру даних, змінюють свої локальні копії, і тоді одна з операцій CAS успішно працює, а інша завершується невдачею. Той, хто не спрацьовує, потребує повторного копіювання та оновлення.
Блукаюча логіка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.