Вирішення, чи рядок підстановки повністю відповідає іншій рядковій послідовності в наборі


9

Ось проблема, яка мене клопоче певний час. Скажімо, рядок - це послідовність 1s і 0s, а wildcard - послідовність 1, 0 і? S. Всі рядки та рядки підкреслення мають однакову довжину. Це стандартні символи UNIX; 10 × 1 відповідає 10011, 10111 тощо - a? відповідає 1 або 0 у цій позиції. Якщо і це рядкові підстановки, то запишемо якщо кожна рядок, відповідна , також відповідає .vwv≤wvw

Проблеми : з урахуванням набору рядків підстановки та запиту (також рядок підстановки), чи існує такий, що ? А якщо ні, то чи можемо ми ефективно додати до ?Svw∈Sv≤wvS

Ось очевидне рішення (де - розмір рядків, - розмір слова ОЗУ (як правило, 32 або 64)): пройдіть кожен елемент списку та протестуйте умова (яка може бути виконана за 2 або 3 операції з використанням біт-подвійності). Також перевіряйте, чи утримує будь-який елемент під час сканування. Якщо провалить наш тест, то додайте до набору та видаліть , який ми позначили.O(kmn)kmv≥wwvvw

Але це не досить швидко. Було б дуже здорово, якби існувало рішення , або, в ідеальному світі, за складністю, схожим на дерево з радіацією ( ). Також добре, щоб запити були приблизно правильними : тобто, якщо , повертайте так чи ні; але якщо умова не виконується, точно не поверніть ні.O(log⁡n)O(k)v≤w

Хоча це не допомагає в найгіршому випадку складності, можна припустити, що всі елементи в обмежені рядком підстановки; тобто існує деякий такий, що для всіх , .Svw∈Sv≥w

Ідеї, які я пробував

  • Підстановочні рядки утворюють з'єднання-напіврешітку. У нас може бути дерев яне дерево, яке містить рядки підстановки; листя були б рядковими рядками, а гілки представляли б з'єднання всіх дітей. Якщо запит і об'єднання є незрівнянними, то нам не доведеться витрачати час на спроби порівняти всіх дітей цієї галузі. Крім того, якщо ми зробимо оновлення, і оновлення буде більшим за об'єднання, ми можемо просто видалити всю гілку. На жаль, це все-таки в гіршому випадку, і ми не завжди знаходимо "найкращі" об'єднання, які можна зробити при скануванні через дерево, щоб додати елементи.O(n)
  • Можна сформувати базисне з синтаксичного дерева . Ми знаємо, що обмежений якоюсь рядовою лінією; припустимо, що це? 0? 0. Тоді всі гілки трійки повинні бути лише на 1-му та 3-му розрядах рядків. Якщо поточний біт, на який ми розгалужуємо запит, є 1, ми повинні перевірити? і 1 гілки; якщо це 0, ми перевіряємо? і 0 гілок; якщо це так, ми лише перевіряємо? відділення. Оскільки ми маємо потенційно взяти кілька гілок, це здається не дуже гарним (важко оновити трійку з тієї ж причини). Оскільки відповідність - це дуже швидка операція, боляче порівняно з наївною стратегією робити багато обходу дерева (слідування за цілою купою покажчиків набагато дорожче, ніж виконання деяких АБО та ІН).SS

Пов'язані роботи

  • У мережевій спільноті ця проблема проявляється як "класифікація пакетів", ось добре опитування відомих алгоритмів та структур даних . На жаль, майже завжди робиться припущення, що рядки підстановки відповідають лише префіксам, а запит є кортежем таких рядків. Звичайно, ми завжди можемо перетворити загальну рядок підстановки, щоб відповідати цим критеріям: 1? 00? 1 ?? є (1,?, 0, 0,?, 1,?,?). Однак це не буде ефективно. Інше припущення, що ці кортежі пов'язані з "кольором", і запит повинен повернути колір (не тільки те, що він збігався). Це значно ускладнює проблему, оскільки нам потрібно замовити кортежі (інакше неоднозначно, який з (0,?) Та (?, 1) відповідає (0, 1)).

  • У спільноті алгоритмів я знайшов чимало результатів, пов’язаних із пошуком підрядків, які відповідають "не цікавить". Це набагато важча проблема, і я не можу реально використовувати жодну з методик.

На закінчення

Дякуємо за будь-яку допомогу!


1
наскільки великими можуть бути струни? І чому ви не враховуєте їх довжину в складності? Очевидно, що вам потрібні рядки, щоб вони були інакше у вас просто не буде чітких рядків для роботи. Також здається інтуїтивно зрозумілим, що якщо ви дозволите рядки довжини , то в гіршому випадку вам доведеться подивитися на всі ваші рядки у вашій структурі даних ... Чи є межі довжини рядка? Полі-логарифмічний? ? Ω(logn)nO(n)o(n)
— Артем Казнатчеєв

Вибачте, якщо я не зрозумів. Струни мають розмір ; для всіх намірів і цілей ви можете вважати, що вони мають 32 символи. "Рядок" був просто зручною абстракцією для постановки проблеми - вони насправді представлені як (цілі числа, бітмаски) кортежі, так що я можу обчислити приєднання і лише за кілька машинних операцій. (Звичайно, проблема може бути природно розширена на більші рядки постійного розміру за рахунок збільшення кількості цілих чисел та полів біткої маски). O(1)v≤w
— Крістофер Монсанто

Мій вище коментар, ймовірно, не корисний для аргументу складності :(. Насправді не існує жодного зв’язку між розміром рядків і розміром набору, якщо ви дозволяєте змінюватись і розмір рядків. Якщо це це правда про те, що найгірший випадок, який нещасливий, але мене все одно набагато більше цікавить середній випадок (або наближення).O(n)
— Крістофер Монсанто,

Відповіді:


3

Як щодо використання автомата з кінцевим станом? Мова кінцева і тому регулярна. Навіть після перетворень внизу вона все ще буде регулярною. Отже, після звичайних кроків для перетворення регулярного виразу в детермінований автоматичний кінцевий стан, у вас з'явиться розпізнавальник того, що ви хочете, що працює в час. Сподіваємось, ця ідея все-таки буде реальною, якщо є помилки у запропонованому нижче.SO(k)

Зморшкою є те, як поводитися з оператором wildcard:?. Підстановочний знак у рядку підстановки відповідає 0 або 1 у тестовій рядку. Але оскільки ми намагаємось розпізнати рядки підстановки, підстановочний знак у рядку підстановок відповідає 0, 1 або? в іншій рядковій послідовності. Цей набір все ще регулярний, тому ми перетворюємо кожне виникнення? до регулярного виразу (0 | 1 |?), де вертикальний штрих є звичайним оператором чергування. Отже, якщо весь ваш набір дорівнює {10 ?? 1, 0? 1? 0}, то результуюче регулярне вираження буде (10 (0 | 1 |?) (0 | 1 |?) 1 | 0 (0 | 1 | ?) 1 (0 | 1 |?) 0)S

Що стосується додавання рядків до машини, є нещодавні роботи з поступової зміни автоматики з кінцевим станом. Дивіться цей документ Daciuk et al: "Поступова побудова мінімальних ациклічних кінцевих державних автоматів".

Чи допомагає це?


Я розглядав автомати, так (те, що я робив з трійкою, було схоже на те, як можна було б прийняти рядок з автоматами). Однак я не знайшов такої роботи над поступовою побудовою зазначених автоматів. Я перевірю це, дякую за вказівник ShyPerson.
— Крістофер Монсанто

Я цитував документ Daciuk та ін, тому що він здавався найближчим до того, що ви намагаєтесь досягти. Але я вважаю, що варто згадати, що проблема була вирішена останнім часом для довільних автоматів з кінцевим станом Carrasco та Forcada у своїй роботі "Поступова побудова та обслуговування мінімальних автоматів кінцевих держав": mitpressjournals.org/doi/abs/10.1162/ …
— ShyPerson

Гаразд, я не думаю, що я ще багато чого з цієї теми вийду, тому я приймаю вашу відповідь. Дякую!
— Крістофер Монсанто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.