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


9

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

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

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

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

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

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

  • Підстановочні рядки утворюють з'єднання-напіврешітку. У нас може бути дерев яне дерево, яке містить рядки підстановки; листя були б рядковими рядками, а гілки представляли б з'єднання всіх дітей. Якщо запит і об'єднання є незрівнянними, то нам не доведеться витрачати час на спроби порівняти всіх дітей цієї галузі. Крім того, якщо ми зробимо оновлення, і оновлення буде більшим за об'єднання, ми можемо просто видалити всю гілку. На жаль, це все-таки в гіршому випадку, і ми не завжди знаходимо "найкращі" об'єднання, які можна зробити при скануванні через дерево, щоб додати елементи.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)vw
Крістофер Монсанто

Мій вище коментар, ймовірно, не корисний для аргументу складності :(. Насправді не існує жодного зв’язку між розміром рядків і розміром набору, якщо ви дозволяєте змінюватись і розмір рядків. Якщо це це правда про те, що найгірший випадок, який нещасливий, але мене все одно набагато більше цікавить середній випадок (або наближення).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.