(вже запитували на головному сайті , але просимо також тут кращого висвітлення, вибачте)
Оскільки я знав про Структурні дані структури, я відчайдушно потребую гарного огляду останніх подій у цій галузі.
Я переглянув Google і прочитав багато статей, які я міг бачити в результатах пошуку Google за запитами зверху голови. Я все ще підозрюю, що пропустив щось важливе тут.
Ось такі теми, які мене особливо цікавлять:
Ефективне кодування двійкових дерев з ефективними операціями отримання батька, лівої / правої дитини, кількості елементів у піддереві.
Основне питання тут полягає в наступному: всі підходи, які я знаю, припускають, що вузли дерев перераховуються в першому диханні (як, наприклад, у піонерській роботі в цій області Jacobson, G. J (1988). Вдалі статичні структури даних), що не відповідає здається підходящим для мого завдання. Я маю справу з величезними двійковими деревами, заданими в макеті першої глибини, і індекси вузла глибини першого є ключем до інших властивостей вузла, тому зміна компонування дерева має для мене деяку вартість, яку я хотів би мінімізувати. Звідси зацікавлення отримувати посилання на твори з урахуванням інших, а не макетів BF-дерева.
Великі масиви елементів змінної довжини у зовнішній пам'яті. Масиви незмінні: мені не потрібно додавати / видаляти / редагувати елементи. Єдина вимога - це час доступу до елемента O (1) і якомога менші накладні витрати, краще, ніж прямолінійний зміщення та підхід до розміру. Ось деякі зібрані нами статистичні дані щодо типових даних для мого завдання:
типова кількість предметів - сотні мільйонів, до десятків мільярдів;
приблизно 30% предметів мають довжину не більше 1 біта ;
40% -60% елементів мають довжину менше 8 біт;
лише кілька відсотків елементів мають довжину між 32 і 255 бітами (255 біт - це межа)
середня довжина елемента ~ 4 біт +/- 1 біт.
теоретично можливий будь-який інший розподіл довжин предметів, але всі практично цікаві випадки мають статистику, близьку до описаної вище.
Посилання на статті будь-якої складності, підручники будь-якої незрозумілості, більш-менш задокументовані бібліотеки C / C ++, - будь-що, що вам було корисно у подібних завданнях або що виглядає так вашим освіченим здогадком - всі такі речі вдячні.
Оновлення : я забув додати до питання 1: двійкові дерева, з якими я маю справу, незмінні. У мене немає жодних вимог щодо їх зміни, все, що мені потрібно, - це лише проходження їх різними способами, завжди переходячи від вузла до дітей або до батьків, так що середня вартість таких операцій становила O (1).
Також типове дерево має мільярди вузлів і не повинно повністю зберігатися в оперативній пам'яті.