Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
artem_ka
Member

Откуда: Томск
Сообщений: 88
есть у нас набор букв, есть табличка, содержащая словарик. Как нам сделать так, чтобы по этому набору выбирались все слова, получаемые из них?
9 сен 04, 17:08    [948307]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Hummer
Member

Откуда:
Сообщений: 2583
Простым перебором порядка следования символов - получаем набор (можно назвать словом) - по нему прямой запрос к таблице (т.е. можно по лайку можно на полное совпадение), найдено вхождение - записываем в коллекцию или в другую таблицу.

Цикл перебора позиций букв писать не буду:)
9 сен 04, 17:11    [948331]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
sasha_1
Member

Откуда: Санкт-Петербург
Сообщений: 1640
есть такая чудная функция InStr
пишешь условие:
InStr(перваяИзБукв,Слово) and InStr(втораяИзБукв,Слово) and ... and InStr(последняяИзБукв,Слово) and Len(Слово)=КоличествоБукв
все слова удовлетворяющие этому условию - твои
9 сен 04, 17:13    [948341]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
sasha_1
Member

Откуда: Санкт-Петербург
Сообщений: 1640
правда с длинной можно подумать по другому, чтобы включались слова с повторами букв.
9 сен 04, 17:15    [948358]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 sasha_1
Вот у меня набор букв: мамаздапа. Слова (некоторые) - мама, мазда, дам и т.п.

Так что тут нужно сначала получить все возможные наборы, включая и наборы из одной буквы.
9 сен 04, 17:17    [948366]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
sasha_1
Member

Откуда: Санкт-Петербург
Сообщений: 1640
я понял немножко по другому вопрос.
но функция все равно полезная :)
9 сен 04, 17:19    [948376]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18323
случаем не Т9 для мобил?
9 сен 04, 20:03    [948952]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
lobodava
Member

Откуда: Москва
Сообщений: 386
Это, кажется, для игры "Эрудит" или "Scramble"

Предлагаю так...

Разложить набор букв в таблицу
мамаздапа

tblНаборБукв:

БукваНабора  БуквВНаборе
м                  2
а                  4
з                  1
д                  1
п                  1

Словарик на две таблицы
tblСловарик:

СловоID   Слово   УникальныхБукв
---------------------------------
1            мама     2
2            мазда    4
3            дам      3
4            кара     3

tblБуквыСлова:

СловоID  БукваСлова  БуквВСлове 
1           м              2
1           а              2
2           м              1
2           а              2
2           з              1
2           д              1
3           д              1
3           а              1
3           м              1
4           к              1
4           а              2
4           р              1

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

SELECT tblБуквыСлова.СловоID
FROM tblБуквыСлова INNER JOIN tblНаборБукв ON tblБуквыСлова.БукваСлова = tblНаборБукв.БукваНабора
WHERE (((tblБуквыСлова.БуквВСлове)<=[tblНаборБукв].[БуквВНаборе]));

А теперь найти нужные слова
SELECT tblСловарик.Слово
FROM qrySub INNER JOIN tblСловарик ON qrySub.СловоID = tblСловарик.СловоID
GROUP BY tblСловарик.Слово, tblСловарик.УникальныхБукв
HAVING (((Count(tblСловарик.СловоID))=[tblСловарик].[УникальныхБукв]));

В прикрепленном файле база с этими таблицами и запросами.

К сообщению приложен файл (Scramble.zip - 8Kb) cкачать
9 сен 04, 23:30    [949173]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
artem_ka
Member

Откуда: Томск
Сообщений: 88
спасибо
последнее решение интересное
10 сен 04, 10:58    [949945]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
маяк
Member

Откуда: MSU, Moscow, Russia
Сообщений: 280
Не проще ли генерить len(string)! (в смысле факториал) штук выражений типа like "*м*а*м*а*з*д*а*л*а*"?
10 сен 04, 12:03    [950284]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
artem_ka
Member

Откуда: Томск
Сообщений: 88
не проще
слов в словарике 18 тыщ
а комбинаций могут быть миллионы...
10 сен 04, 13:59    [951014]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
ппп
Guest
На этот счет гдето я видел готовое решение.Однако тест показал серьезные иормоза после 1000 записей. если интересно еому могу поискать.
10 сен 04, 15:21    [951501]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
lobodava
Member

Откуда: Москва
Сообщений: 386
artem_ka
слов в словарике 18 тыщ
а комбинаций могут быть миллионы...


Это уже интереснее... :)

Если не влом, можно ли выложить тестовые данные куда-нибудь? Например на am.rusimport.ru.
Не все конечно, хотя бы кил 100.

Мы бы дальше порешали бы
10 сен 04, 18:40    [952456]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Предлагаю решение, хотя оно и не привязано к Аксессу.

1. В обоих словах (в том, которое надо проверить, и в разрешенном наборе букв) сортируем буквы по алфавиту при помощи любого алгоритма сортировки массива:

мазда -> аадзм
мамаздапа -> аааадзммп

2. В слове, которое надо проверить, вставляем звездочки между группами разных букв и пишем условие:

"аааадзммп" like "*аа*д*з*м*"

Если в слове есть какая-то лишняя буква (даже из разрешенных, но с превышением количества, например второе "д" или пятое "а"), то условие будет ложно.
10 сен 04, 18:51    [952476]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
Geo
Member

Откуда:
Сообщений: 6883
От нечего делать попробовал еще вариант. Сделал упрощенно, чтоб не возиться.

Итак, считаю, что набор символов в словах ограничен (для себя взял знаки "0"-"9"). Считаю, что количество повторов в знаков в "слове" не важно, важно лишь их наличие.

Сделал таблицу "Слова"
слово - varchar(50) - Primary key
[0] - boolean
[1] - boolean
[2] - boolean
[3] - boolean
[4] - boolean
[5] - boolean
[6] - boolean
[7] - boolean
[8] - boolean
[9] - boolean

В случае, если кол-во повторов важно, вместо boolean используем byte, например, и в поля кладем именно количество вхождений символов в слово, а не признак вхождения. Делал все в a97. В таблице создал второй индекс из полей [0]-[9].

Сделал запрос "разбить":
UPDATE Слова SET 
Слова.[0] = InStr([Слово],'0')<>0, Слова.[1] = InStr([Слово],'1')<>0, 
Слова.[2] = InStr([Слово],'2')<>0, Слова.[3] = InStr([Слово],'3')<>0, 
Слова.[4] = InStr([Слово],'4')<>0, Слова.[5] = InStr([Слово],'5')<>0, 
Слова.[6] = InStr([Слово],'6')<>0, Слова.[7] = InStr([Слово],'7')<>0, 
Слова.[8] = InStr([Слово],'8')<>0, Слова.[9] = InStr([Слово],'9')<>0;

Сделал форму с тремя кнопками:
Option Compare Database
Option Explicit

Private Sub Заполнить_Click()
  Dim t As Long
  
  For t = 1 To 100000 '(сто тысяч)
    CurrentDb.Execute "insert into Слова (слово) values(" & Abs(Int(Rnd * 1000000)) & ")"
  Next
  MsgBox "Готово"
End Sub

Private Sub Разбить_Click()
  Dim i As Double
  
  i = Now
  CurrentDb.Execute "разбить"
  Debug.Print Now - i
  MsgBox "Готово"
End Sub

Private Sub Найти_Click()
  Dim s As String
  Dim rs As DAO.Recordset
  Dim i As Double
  
  s = "000000"
  i = Now
  Set rs = CurrentDb.OpenRecordset("select слово from слова where " & _
               "[0]=" & IIf(InStr(s, "0") <> 0, "True", "False") & " And " & _
               "[1]=" & IIf(InStr(s, "1") <> 0, "True", "False") & " And " & _
               "[2]=" & IIf(InStr(s, "2") <> 0, "True", "False") & " And " & _
               "[3]=" & IIf(InStr(s, "3") <> 0, "True", "False") & " And " & _
               "[4]=" & IIf(InStr(s, "4") <> 0, "True", "False") & " And " & _
               "[5]=" & IIf(InStr(s, "5") <> 0, "True", "False") & " And " & _
               "[6]=" & IIf(InStr(s, "6") <> 0, "True", "False") & " And " & _
               "[7]=" & IIf(InStr(s, "7") <> 0, "True", "False") & " And " & _
               "[8]=" & IIf(InStr(s, "8") <> 0, "True", "False") & " And " & _
               "[9]=" & IIf(InStr(s, "9") <> 0, "True", "False"))
  On Error Resume Next
  rs.MoveLast
  Debug.Print "word:'" & s & "', records:" & rs.RecordCount & ", time:" & (Now - i)
  MsgBox "Готово"
End Sub

Результат работы: создалось ок. 95 000 записей, создавалось минут 15 (celeron 633). Остальное вот:
0:00:37 
word:'001122', records:49, time:0:00:00
word:'000000', records:0, time:0:00:00
word:'123456', records:70, time:0:00:00
10 сен 04, 19:44    [952553]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Гео, ты же вроде сейчас водку пьянствуешь сотоварищи :)
10 сен 04, 20:00    [952566]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
Geo
Member

Откуда:
Сообщений: 6883
Не - я завтра водку пьянствую :))
10 сен 04, 20:20    [952578]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос (чтобы по набору букв выбирались все слова, получаемые из них)  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Тоди-ой! :))
10 сен 04, 20:35    [952588]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить