Що таке дерево Агурі?


19

Переглядаючи деякі старі пункти новин Hacker News, я натрапив на повідомлення користувача, який сказав

Дерева Aguri, які виходять заміж з обмеженим розміром radix trie (як ви використовуєте в таблиці програмного забезпечення) до списку LRU і автоматично синтезують агрегати (наприклад, 10.0.0.0/16 з 1000 спостережень за всіма IP-адресами) із шаблону вставки Вони найбільш відомі в аналізі трафіку, але ми використовували їх і в аналізі пам’яті під час виконання.

~ tptacek

Тому я вирішив подивитися,

  • Швидкий пошук Google приводить мене до драйвера F1.
  • Пошук у Вікіпедії призводить до сільськогосподарської касти в Індії та деяких предметів з Японії
  • Перелік стеків звернень 0 результатів /programming//search?q=aguri site:stackoverflow.com/questions aguri

Тож я нарешті пов’язав це назад із користувачем, побачивши, що він має посилання на своєму блозі

http://www.matasano.com/log/1009/aguri-coolest-data-structure-youve-never-heard-of/

Але він мертвий.

Отже, що це за структура даних Aguri і якщо це реальна структура даних, чому вона ніде не задокументована?

Відповіді:


15

Aguri - це профайл трафіку, який використовує дерева префіксів. Повний текст статті на цій сторінці. Коротше кажучи, немає такої структури даних, як "дерево Агурі", якщо ви не вважаєте дерева префіксів, які використовуються в цій системі, як свій власний унікальний підтип.


9

Дуже мало справді помирає в Інтернеті. В Archive.org просто трапляється один знімок цього допису в блозі, коли він був наживо . Скопійовано тут:

Деякі виправні інформатики для аудиторів PCI в моїй аудиторії.

Я передаю вам масив випадкових цілих чисел. Як ви можете сказати, чи є в ньому число три?

Ну, є очевидний спосіб: перевіряйте числа послідовно, поки не знайдете «3» або не вичерпаєте масив. Лінійний пошук. З огляду на 10 чисел, ви повинні припустити, що це може пройти 10 кроків; N чисел, N кроків.

Зображення 1.png

Лінійний пошук поганий. Важко зробити гірше, ніж лінійне. Давайте покращимо це. Сортувати масив.

Зображення 2.png

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

Двійковий пошук. Враховуючи 10 чисел, потрібно буде виконати цілих 3 кроки - log2 з 10 - щоб знайти один з них у відсортованому масиві. O (log n) пошук є приголомшливим. Якщо у вас 65 000 елементів, для того, щоб знайти один з них, потрібно буде виконати лише 16 кроків. Подвійні елементи, і це 17 кроків.

Але відсортовані масиви смокчуть; з одного боку, сортування дорожче, ніж лінійний пошук. Тому ми не використовуємо багато двійкового пошуку; натомість ми використовуємо двійкові дерева.

Зображення 3.png

Щоб шукати бінарне дерево, ви починаєте вгорі і запитуєте себе: «чи мій ключ менший (лівий) або більший за (правий) поточний вузол», і повторюєте, доки добре, добре, добре, ви вже знаєте цей матеріал. Але це дерево гарне, чи не так?

Пошук з (збалансованим) двійковим деревом - це O (log n), як і двійковий пошук, залежно від кількості елементів у дереві. Бінарні дерева є приголомшливими: ви отримуєте швидкий пошук і сортування проїзду, чогось не вийдете з хеш-таблиці. Бінарні дерева є кращою реалізацією таблиці за замовчуванням, ніж хеш-таблиці. 2.

Але бінарні дерева - це не єдиний механізм пошуку дерев. Спроби двійкового радіалу, які також називаються деревами PATRICIA, працюють як бінарні дерева з однією принциповою різницею. Замість того, щоб порівнювати більше, ніж / менше, ніж у кожному вузлі, ви перевіряєте, чи встановлено біт, розгалужуючи право, якщо він встановлений, і ліворуч, якщо його немає.

Зображення 4.png

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

Ось чому радикальні спроби круті:

Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps

незалежно від кількості елементів на дереві, без балансування.

More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or

"Пошук у стилі завершення командного рядка". У радіальному дереві можна швидко знайти "ro *" та отримати "rrome" та "romulous" та "roswell".

3.

Я загубив тебе.

Давайте поставимо це в контексті. Спроби є важливою структурою даних для маршрутизації в Інтернеті. Проблема маршрутизації йде так:

You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.

You need packets for 10.0.1.20 to go to “a”

You need packets for 10.0.1.21 to to to “b”

Цю важку проблему вирішити з базовим двійковим деревом, але з радіальною трійкою ви просто запитуєте "1010.0000.0000.0000.0000.0001.0100" (для 10.0.1.20) та "1010." (для 10.0.0.0) ). Лексикографічний пошук дає "найкращу відповідність" для маршрутизації. Ви можете спробувати його в коді Ruby вище; додайте * ”10.0.0.0” .to_ip до трійки та знайдіть “10.0.0.1” .to_ip.

Відповідність між маршрутизацією та намаганнями radix настільки сильна, що найпопулярніша бібліотека радіо-трие загального призначення (та від CPAN) насправді викрадена з GateD. Це, до речі, безлад, і не користуватися ним.

Якщо ви розумієте, як працює трійка, ви також розумієте, як працюють регулярні вирази. Спроби - це особливий випадок детермінованих кінцевих автоматів (DFA), де гілки базуються виключно на бітових порівняннях і завжди розгалужуються вперед. Хороший механізм регулярного виведення - це просто обробка DFA з більш «функціями». Якщо мої фотографії мають сенс для вас, то зображення у цій чудовій статті про алгоритм скорочення NFA-DFA Томпсона також будуть, і ця стаття зробить вас розумнішими. 4.

Ви оператор мережі в магістральному Інтернет-провайдері. Ваш світ значною мірою складається з «префіксів» - пар мереж IP / мережі. Маски мережі в цих префіксах дуже важливі для вас. Наприклад, 121/8 належить Кореї; 121.128 / 10 належить Korea Telecom, 121.128.10 / 24 належить клієнту KT, а 121.128.10.53 - це один комп'ютер всередині цього клієнта. Якщо ви відстежуєте ботнет або операцію зі спамом або розповсюдження хробаків, цей номер маски для вас дуже важливий.

На жаль, важливі, хоча вони є, ніде в IP-пакеті немає штампу "мережевої маски" - мережеві маски є повністю деталі конфігурації. Отже, переглядаючи трафік, ви фактично маєте ці дані для роботи:

ips.png

Дивно, враховуючи достатню кількість пакетів для перегляду, цього достатньо інформації, з якою можна відгадати мережеві маски. Працюючи в Sony, Кенджіро Чо придумав дійсно елегантний спосіб зробити це на основі спроб. Ось як:

Візьміть основний бінарний триекс, так само, як і програмні маршрутизатори. Але обмежте кількість вузлів на дереві, скажімо, до 10000. На магістральному посиланні, записуючи адреси з IP-заголовків, ви за мить вичерпаєте 10000 вузлів.

Збережіть список вузлів у списку, відсортований у порядку LRU. Іншими словами, коли ви співставляєте IP-адресу з вузлом, "торкніться" вузла, наклеївши його у верхній частині списку. Поступово часто бачені адреси спливають до верху, а нечасто бачені вузли опускаються донизу.

Зображення 6.png

Тепер фокус. Коли у вас не вистачає вузлів і вам потрібен новий, відновіть знизу списку. Але коли ви це зробите, перекачіть дані з вузла в його батьківський контур, наприклад:

Зображення 5.png

10.0.1.2 і 10.0.1.3 - це брат / сестри / 32, дві половини 10.0.1.2/31. Щоб повернути їх, об'єднайте їх у 10.0.1.2/31. Якщо вам потрібно повернути 10.0.1.2/31, ви можете об'єднати його з 10.0.1.0/31, щоб утворити 10.0.1.0/30.

Зробіть це, скажімо, за хвилину, і видатні джерела захистять свою позицію на дереві, залишаючись у верхній частині списку LRU, в той час як навколишній / 32 шумових бульбашки до / 0. Для наведеного вище необмеженого списку IP-адрес із деревом 100 вузлів ви отримуєте це.

Чо називає це евристичним Агурі. 5.

Aguri має ліцензію на BSD. Ви можете завантажити його та програму драйверів, яка дивиться пакети через pcap, зі старої домашньої сторінки Чо. 6.

Я кудись іду з цим, але я зараз на цій посаді 1300 слів, і якщо ти людина з алгоритмами, ти мені вже набрид, і якщо ні, ти мені набрид зараз. Отже, дозвольте Агурі зануритися, і я дам вам щось круте і марне, щоб зробити це пізніше цього тижня.

Тут розкидані численні посилання. На жаль, Archive.org не зберігає зображення, а лише текст, тому кілька з них були втрачені. Ось ті, які він має, архівували:


Це дійсно показує інформацію, чи є причина, чому всі ці посилання більше не доступні?
phwd

@phwd Я просто копіюю / вставляю посилання внизу, звідки посилається машина Wayback. І вона посилається на себе, тому ви бачите ці сторінки такими, якими вони були, коли була зроблена публікація в блозі. Статті у Вікіпедії та порівняння, що я знаю, все ще існують.
Ізката
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.