Re: Вопросец возник...

From
Oleg Khovayko ()
To
Evgeniy Jirnov ()
Date
2003-01-25T04:48:28Z
Area
RU.ALGORITHMS
From: Oleg Khovayko <olegh@hotpop.com>

Так. За три дня никто не ответил.
Придется мне отвечать.

Evgeniy Jirnov wrote:
> Мир твоему дому, All.
> 
> Что-то я не соображу: бинарный поиск imho применить нельзя.

Нельзя. точно.

> Как же быть? 

Какой пустяк - медведя раздобыть! ;)

> Не
> перебирать же 3000 строк на совпадение с маской по возрастанию? 

А придется! :(

На самом деле, существуют методы, упрощающие твою задачу.
По списку масок надо строить конечный автомат, который и будет
тебе для каждой строки возвращать список масок, к которым
подходит данная строка.

К сожалению:

1. У меня нет готового генератора КА для списка масок.
Поэтому поделиться готовым рецептом не могу.

2. Всегда может существовать такой набор масок, где
КА не даст выигрыша по сравнению с простым сравнением
по маске "в лоб"

> Причем масок
> около 500. Получается мне надо перебрать 3000*500=1500000 комбинаций? :(
Ага.

Чем реально могу пособить - в свое время я написал эффективную процедуру
сравнения имени файла с маской, которая в худшем случае производит
(A+1)*L операций сравнения, где А - число звездочек в маске, а L - длина
строки-кандидата.

Хочу заметить, что это существенно лучше того, что сейчас применяется
в UNIX-ах. Ибо UNIX shell можно в легкую положить такой 
последовательностью команд:

touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ls *a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*b

Там процедура сравнения с маской написана убого, и при вышеуказаной
паре fname/fmask сваливается в факториальное время вычислений от 
количества звездочек.

Могу добавить, что та же убогость применяется и в ftpd, что
при известном умении и сноровке позволяет уложить удаленный
UNIX-сервер через internet.

Так же та же глюка есть в FAR-овском искателе по маске. Нарвавшись
на такой файл, FAR ложится напрочь, и затормаживает весь Windows.

Свою процедуру, свободную от этого глюка, я публиковал здесь несколько 
месяцев назад. Смотри архивы. Если не найдешь - спрашивай.
Опубликую еще раз.

--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)