Ймовірність того, що не намалював слово з мішка з літерами в Scrabble


27

Припустимо, у вас був мішок з ятьма плитками, на кожному на якому буква. Є плитки з літерою 'A', з 'B' і так далі, і 'wildcard' плитками (у нас ). Припустимо, у вас був словник із обмеженою кількістю слів. Ви вибираєте плитки з сумки без заміни. Як би ви обчислили (або оцінили) ймовірність того, що ви можете сформувати нульові слова зі словника з урахуванням вибраних k плиток?n A n B n n = n A + n B + + n Z + n k knнАнБнн=нА+нБ++нZ+нкк

Для тих, хто не знайомий з Scrabble (TM), символом підстановки можна скористатися для відповідності будь-якій літери. Таким чином, слово [ BOOT ] може бути написане плитками "B", "*", "O", "T".

Щоб дати деяке уявлення про масштаб проблеми, к невеликий, як 7, н - близько 100, а словник містить близько 100 000 слів розміром к або менше.

редагувати: під «формувати слово» я маю на увазі слово довжиною не більше к . Таким чином, якщо слово [ A ] є у словнику, то, намалювавши з мішка навіть одне «A», «утворилося слово». Проблема підкреслень радикально спрощується, якщо можна припустити, що у словнику є слова довжиною 1. Оскільки, якщо є, будь-який малюнок підстановки автоматично може відповідати довжині 1 слова, і, таким чином, можна сконцентруватися на тому випадку, коли немає ніяких марок. Таким чином, більш слизькій формі задачі немає словника з 1 літери.

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


Чи не слід це "підбирати k плитки без заміни"? Дуже цікаве запитання.

ой. дійсно так і повинно бути.
shabbychef

Наскільки я пам’ятаю, Scrabble не дозволяє слова з однієї літери, тож принаймні та частина проблеми вирішена;)
nico

1
@nico хороший момент, але я думаю, що це лише для середини гри. Слово з однієї літери або не вимагає відтворення грамоти, або дозволить розмістити одну букву в будь-якому місці на дошці, обидва явно неприйнятні. Однак я думав про початковий хід. Насправді, для тих, хто знайомий з Scrabble, питання можна сказати компактно, як "яка ймовірність, що першому гравцеві доведеться пройти?"
shabbychef

@nico Дякую за роз'яснення. Теоретично подібне питання стосується словників, що містять усі можливі двобуквові комбінації у вигляді слів: коли це так, будь-яка рука з двох і більше літер автоматично містить слово. @ коментар shabbychef про середину гри показує, наскільки нерелевантним є вихідне питання для більшості Scrabble, тому що в середині гри у вас є доступ до масиву частин слів (префіксів, суфіксів та навіть середніх розділів) на додаток до 7 букв у вашій грі рукою. Це значно збільшує шанси на можливість скласти слово.
whuber

Відповіді:


14

Це (довгий!) Коментар до приємної роботи @vqv, розміщеної в цій темі. Він спрямований на отримання остаточної відповіді. Він провів важку роботу зі спрощення словника. Залишилося лише експлуатувати це повною мірою. Його результати говорять про те, що жорстоке рішення є можливим . Зрештою, включаючи підстановку, є щонайбільше слова, які можна скласти із 7 символів, і схоже, що менше 1/10000 з них - скажімо, близько мільйона - не включатимуть дійсних слово. 277=10,460,353,203

Перший крок - збільшити мінімальний словник з символом підстановки "?". 22 букви з’являються двобуквенними словами (усі, крім c, q, v, z). Приєднайте підстановку до цих 22 букв і додайте їх до словника: {a ?, b ?, d ?, ..., y?} Зараз. Так само ми можемо перевірити мінімальні трибуквні слова, викликаючи додаткові слова з’являтися в словнику. Нарешті додаємо "??" до словника. Після видалення результатів повторень він містить 342 мінімальних слова.

Елегантний спосіб продовження - той, що дійсно використовує дуже малу кількість кодування - це розглянути цю проблему як алгебраїчну . Слово, яке розглядається як не упорядкований набір букв, є лише мономієм. Наприклад, "шпліци" - одночлен . Словник тому є сукупністю мономіїв. Це виглядає якаpс2т

{а2,аб,аг,...,оzψ,шхψ,ψ2}

(де, щоб уникнути плутанини, я написав для символу підстановки).ψ

Стійка містить дійсне слово тоді і тільки тоді, коли це слово розділяє стійка.

Більш абстрактний, але надзвичайно потужний спосіб сказати це, що словник генерує ідеальне в поліноміальному кільці і що стійки з дійсними слова стають нульовими в кінцевому кільці , тоді як стійки без дійсних слів залишаються нульовими в частці. Якщо ми сформуємо суму всіх стелажів у і обчислимо її в цьому коефіцієнті, то кількість стійок без слів дорівнює кількості виразних одночленів у коефіцієнті.R = Z [ a , b , , z , ψ ] R / I RЯR=Z[а,б,,z,ψ]R/ЯR

Крім того, суму всіх стійок у просто виразити. Нехай - сума всіх літер в алфавіті. містить один монолог для кожної стійки. (В якості додаткового бонусу його коефіцієнти підраховують кількість способів формування кожної стійки, що дозволяє нам обчислити її ймовірність, якщо нам це подобається.)α = a + b + + z + ψ α 7Rα=а+б++z+ψα7

Як простий приклад (щоб побачити, як це працює), припустимо, (а) ми не використовуємо підстановку та (b) всі літери від "а" до "х" вважаються словами. Тоді єдині можливі стійки, з яких не можна сформувати слова, повинні повністю складатися з y і z. Ми обчислюємо по модулю ідеал, породжений один крок за часом, таким чином: { a , b , c , , x }α=(а+б+c++х+у+z)7{а,б,c,,х}

α0=1α1=а+б+c++х+у+zу+zмодЯα2(у+z)(а+б++у+z)(у+z)2модЯα7(у+z)6(а+б++у+z)(у+z)7модЯ.

З остаточної відповіді ми можемо прочитати шанс отримання несловної стійки, : кожен коефіцієнт підраховує способи, за якими можна намалювати відповідну стійку. Наприклад, існує 21 (з 26 ^ 7 можливих) способів намалювати 2 y та 5 z's, оскільки коефіцієнт дорівнює 21.y 2 z 5у7+7у6z+21у5z2+35у4z3+35у3z4+21у2z5+7уz6+z7у2z5

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

Зверніть увагу, як зменшення модуля потужності ідеалом на кожному етапі скорочує обчислення: ось ярлик, виявлений таким підходом. (Кінець прикладу.)

Системи поліноміальної алгебри реалізують ці розрахунки . Наприклад, ось код Mathematica :

alphabet =  a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + 
            p + q + r + s + t + u + v + w + x + y + z + \[Psi];
dictionary = {a^2, a b, a d, a e, ..., w z \[Psi], \[Psi]^2};
next[pp_] := PolynomialMod[pp alphabet, dictionary];
nonwords = Nest[next, 1, 7];
Length[nonwords]

(Словник може бути побудований прямо з @ vqv's min.dict; я ставлю сюди рядок, який показує, що він досить короткий, щоб бути визначеним безпосередньо, якщо вам подобається.)

Вихід - який займає десять хвилин на обчислення - становить 577958. ( Примітка. У попередній версії цього повідомлення я допустив невелику помилку при підготовці словника і отримав 577940. Я відредагував текст, щоб відобразити те, на що я сподіваюся, що зараз. правильні результати!) Трохи менше, ніж я очікував мільйон, але такого ж порядку.

Щоб обчислити шанс отримання такої стійки, нам потрібно врахувати кількість способів, яким можна намалювати стійки. Як ми бачили в прикладі, це дорівнює його коефіцієнту в . Шанс намалювати якусь таку стійку - це сума всіх цих коефіцієнтів, яку легко знайти, встановивши всі літери, що дорівнюють 1:α7

nonwords /. (# -> 1) & /@ (List @@ alphabet)

Відповідь дорівнює 1066056120, що дає шанс 10,1914% намалювати стійка, з якої не може бути сформовано жодного дійсного слова (якщо всі букви однакові).

Коли ймовірність букв змінюється, просто замініть кожну букву на її шанс намалювати:

tiles = {9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 
         4, 2, 2, 1, 2, 1, 2};
chances = tiles / (Plus @@ tiles);
nonwords /. (Transpose[{List @@ alphabet, chances}] /. {a_, b_} -> a -> b)

Вихід становить 1.079877553303%, точна відповідь (хоча і з використанням приблизної моделі, креслення із заміною). Озираючись назад, для введення даних (алфавіту, словника та частоти алфавіту) знадобилось чотири рядки і лише три рядки для виконання роботи: опишіть, як приймати наступну потужність модуля , приймати 7-ту потужність рекурсивно та замінювати ймовірності для букв.IαЯ


+1 Приєднання до лексикону і потім його мінімізація - це розумна ідея. Алгебра поза мною, але відчувається, що ви обчислюєте мультиноміальну ймовірність, а не гіпергеометричну. Тому ймовірність полягає у вибірці з заміною. Я думаю, це пояснює, чому ваша відповідь у 1,08% настільки більша, ніж моя оцінка в 0,4%. Чи є спосіб змінити підхід до обробки вибірки без заміни?
vqv

2
@vqv Так. Тепер, коли у нас є список півтора мільйонів стійок без слів, можна просто (змінивши останні два рядки коду) обчислити шанс кожної стійки (без заміни) та отримати гіпергеометричний результат. Точна відповідь дорівнює 349870667877/80678106432000 = 0,43366% . При випробуваннях N = 100K ваш SE становить 0,021%, тому відповідь повинна була скласти від 0,38% до 0,49% (двостороння 99% ІС). Я так рада, що наші відповіді погоджуються!
whuber

@whuber Чи можете ви виконати обчислення, використовуючи розподіл плитки Words With Friends (WWF)? Моя оцінка 0,4% ґрунтується на лексиконі WWF та розподілі плиток WWF. Я думаю, ви використовуєте розподіл плиток Scrabble з лексиконом WWF.
vqv

На жаль Точна відповідь насправді - 349870675899 (я вимикався 8022 через помилку в моєму словнику.) Це, на щастя, не має жодної практичної різниці.
whuber

@vqv Я не знайомий з різними розподілами плиток. Я скопіював шахту прямо з вашого коду (і я використав ваш словник) :-). Якщо ви маєте на увазі розподіл на osxreality.com/2010/01/01/… , то я отримую 1,15444% (із заміною), 0,43366% (без заміни). Другий номер насправді відрізняється від частоти Scrabble на 8-й значущій цифрі.
whuber

14

Дуже важко намалювати стійку, яка не містить жодного дійсного слова в Scrabble та його варіантах. Нижче представлена ​​програма, яку я написав, щоб оцінити ймовірність того, що початковий стелаж із 7 плиток не містить дійсного слова. Він використовує підхід monte carlo та лексикон Words With Friends (я не міг знайти офіційний лексикон Scrabble у простому форматі). Кожна пробна версія складається із складання 7-плиткової стійки та перевірки, чи містить стійка дійсне слово.

Мінімальні слова

Не потрібно сканувати весь лексикон, щоб перевірити, чи містить стійка дійсне слово. Вам просто потрібно сканувати мінімальний лексикон, що складається з мінімальних слів. Слово є мінімальним, якщо воно не містить іншого слова як підмножини. Наприклад, 'em' - це мінімальне слово; "порожній" - ні. Сенс цього полягає в тому, що якщо стійка містить слово x, то вона також повинна містити будь-яку підмножину x . Іншими словами: стійка не містить слів, якщо вона не містить мінімальних слів. На щастя, більшість слів у лексиконі не мінімальні, тому їх можна усунути. Ви також можете об'єднати перестановочні еквівалентні слова. Мені вдалося скоротити лексикон Words With Friends з 172 820 до 201 мінімальних слів.

З маскими можна легко обробляти, обробляючи стійки та слова як розподіли по буквах. Ми перевіряємо, чи містить стійка слово, віднімаючи один розподіл від іншого. Це дає нам номер кожної літери, пропущеної зі стійки. Якщо сума цієї кількості дорівнює кількості символів, то це слово знаходиться в стійці.

Єдина проблема підходу до monte carlo полягає в тому, що подія, яка нас цікавить, зустрічається дуже рідко. Тому потрібно пройти багато, багато випробувань, щоб отримати оцінку з досить малою стандартною помилкою. Я запустив свою програму (вставлений внизу) з випробувань і отримав оціночну ймовірність 0,004, що початкова стійка не містить дійсного слова . Розрахункова стандартна похибка цієї оцінки становить 0,0002. На моєму Mac Pro пройшло всього кілька хвилин, включаючи завантаження лексикону.N=100,000

Мені було б цікаво подивитися, чи може хтось придумати ефективний точний алгоритм. Наївний підхід, заснований на включенні та виключенні, здається, може включати комбінаторний вибух.

Включення-виключення

Я думаю, що це погане рішення, але тут все-таки є неповний ескіз. В принципі, ви можете написати програму, щоб зробити розрахунок, але специфікація була б сумною.

Ймовірність, яку ми хочемо обчислити, становить Подія всередині ймовірності з правого боку - це об'єднання подій: де - мінімальний лексикон. Ми можемо розширити його за допомогою формули включення-виключення. Він передбачає розгляд усіх можливих перетинів подій, зазначених вище. Нехай позначимо множину потужності , тобто безліч всіх можливих підмножин . Потім P ( k -стильна стійка містить слово ) = P

П(к-стильна стійка не містить слова)=1-П(к-стильна стійка містить слово).
M P ( M ) M M
П(к-стильна стійка містить слово)=П(хМ{к-стильна стійка містить х}),
МП(М)ММ
П(к-стильна стійка містить слово)=П(хМ{к-стильна стійка містить х})=j=1|М|(-1)j-1SП(М):|S|=jП(хS{к-стильна стійка містить х})

Останнє, що потрібно вказати - це обчислити ймовірність в останньому рядку вище. Він передбачає багатовимірний гіпергеометричний. є подією , що стійка містить кожне слово в . Це біль, з якою потрібно боротися через макіяж. Нам доведеться, умовно, враховувати кожен із наступних випадків: на стійці немає ніяких символів, стійка містить 1 підстановку, стійка містить 2 макетів, ...
S

хS{к-стильна стійка містить х}
S

Потім

П(хS{к-стильна стійка містить х})=ш=0нП(хS{к-стильна стійка містить х}|к-стильна стійка містить ш макетів)×П(к-стильна стійка містить ш макетів).

Я збираюся зупинитися тут, бо розширення дошкульно виписати і зовсім не просвітницькі. Простіше написати комп’ютерну програму, щоб це зробити. Але на даний момент ви повинні бачити, що підхід до виключення непереборний. Він включає терміни, кожен з яких також дуже складний. Для лексикону я розглянув вище .2|М|2|М|3.2×1060

Сканування всіх можливих стелажів

Я думаю, що це обчислювально простіше, тому що існує менше можливих стійок, ніж можливі підмножини мінімальних слів. Послідовно зменшуємо набір можливихк- стійкі стійки, поки ми не отримаємо набір стелажів, у яких немає слів. Для Scrabble (або Words With Friends) кількість можливих 7-плиткових стелажів становить десятки мільярдів. Підрахунок кількості тих, що не містять можливого слова, слід виконати з кількох десятків рядків коду R. Але я думаю, ви повинні вміти краще, ніж просто перераховувати всі можливі стелажі. Наприклад, "aa" - це мінімальне слово. Це негайно усуває всі стійки, що містять більше одного "a". Ви можете повторити з іншими словами. Пам'ять не повинна бути проблемою для сучасних комп'ютерів. 7-плитковий стелаж Scrabble потребує менше 7 байт. У гіршому випадку ми використали б кілька гігабайт для зберігання всіх можливих стійок, але я теж не думаю, що це гарна ідея. Хтось, можливо, захоче подумати над цим.

Програма Монте-Карло Р

# 
#  scrabble.R
#  
#  Created by Vincent Vu on 2011-01-07.
#  Copyright 2011 Vincent Vu. All rights reserved.
# 

# The Words With Friends lexicon
# http://code.google.com/p/dotnetperls-controls/downloads/detail?name=enable1.txt&can=2&q=
url <- 'http://dotnetperls-controls.googlecode.com/files/enable1.txt'
lexicon <- scan(url, what=character())

# Words With Friends
letters <- c(unlist(strsplit('abcdefghijklmnopqrstuvwxyz', NULL)), '?')
tiles <- c(9, 2, 2, 5, 13, 2, 3, 4, 8, 1, 1, 4, 2, 5, 8, 2, 1, 6, 5, 7, 4, 
           2, 2, 1, 2, 1, 2)
names(tiles) <- letters

# Scrabble
# tiles <- c(9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 
#            2, 2, 1, 2, 1, 2)


# Reduce to permutation equivalent words
sort.letters.in.words <- function(x) {
  sapply(lapply(strsplit(x, NULL), sort), paste, collapse='')
}

min.dict <- unique(sort.letters.in.words(lexicon))
min.dict.length <- nchar(min.dict)

# Find all minimal words of length k by elimination
# This is held constant across iterations:
#   All words in min.dict contain no other words of length k or smaller
k <- 1
while(k < max(min.dict.length))
{
  # List all k-letter words in min.dict
  k.letter.words <- min.dict[min.dict.length == k]

  # Find words in min.dict of length > k that contain a k-letter word
  for(w in k.letter.words)
  {
    # Create a regexp pattern
    makepattern <- function(x) {
      paste('.*', paste(unlist(strsplit(x, NULL)), '.*', sep='', collapse=''), 
            sep='')
    }
    p <- paste('.*', 
               paste(unlist(strsplit(w, NULL)), 
                     '.*', sep='', collapse=''), 
               sep='')

    # Eliminate words of length > k that are not minimal
    eliminate <- grepl(p, min.dict) & min.dict.length > k
    min.dict <- min.dict[!eliminate]
    min.dict.length <- min.dict.length[!eliminate]
  }
  k <- k + 1
}

# Converts a word into a letter distribution
letter.dist <- function(w, l=letters) {
  d <- lapply(strsplit(w, NULL), factor, levels=l)
  names(d) <- w
  d <- lapply(d, table)
  return(d)
}

# Sample N racks of k tiles
N <- 1e5
k <- 7
rack <- replicate(N,
                  paste(sample(names(tiles), size=k, prob=tiles), 
                        collapse=''))

contains.word <- function(rack.dist, lex.dist)
{
  # For each word in the lexicon, subtract the rack distribution from the 
  # letter distribution of the word.  Positive results correspond to the 
  # number of each letter that the rack is missing.
  y <- sweep(lex.dist, 1, rack.dist)

  # If the total number of missing letters is smaller than the number of 
  # wildcards in the rack, then the rack contains that word
  any(colSums(pmax(y,0)) <= rack.dist[names(rack.dist) == '?'])
}

# Convert rack and min.dict into letter distributions
min.dict.dist <- letter.dist(min.dict)
min.dict.dist <- do.call(cbind, min.dict.dist)
rack.dist <- letter.dist(rack, l=letters)

# Determine if each rack contains a valid word
x <- sapply(rack.dist, contains.word, lex.dist=min.dict.dist)

message("Estimate (and SE) of probability of no words based on ", 
        N, " trials:")
message(signif(1-mean(x)), " (", signif(sd(x) / sqrt(N)), ")")

Нічого ... дуже приємне спостереження.
Метт Паркер

Я дещо здивований, що вона скоротилася до 201 слова. Хоча для першого відіграного слова наші домашні правила приймають "Я" та "А" як слова, що, ймовірно, ще більше зменшить кількість мінімальних слів. Я сподівався побачити, що хтось
вирве

@shabbychef В лексиконі немає слів з 1 літери. Більшість мінімальних слів - це 2- та 3-літерні слова. Ось повний розподіл мінімальної довжини слова: 2: 73, 3:86, 4:31, 5: 9, 6: 2. 6-літерними словами є: GLYCYL та SYZYGY.
vqv

@shabbychef Я оновив свою відповідь, щоб включити ескіз точного підходу до виключення. Він гірший, ніж волохатий.
vqv

чудова робота! Мені подобається, що це запитання, яке може бути поставлене як одне речення (для тих, хто має достатній досвід), призвело до монте-карло, включення-виключення, DAG, пошуку дерев, поліноміальної алгебри, і що ваші симуляції підтверджені теоретично @ бурмотіти. ура!
shabbychef

7

Шрікант правий: дослідження в Монте-Карло - це шлях. Є дві причини. По-перше, відповідь сильно залежить від структури словника. Дві крайності - це (1) словник містить усі можливі однолітерні слова. У цьому випадку шанс не скласти слово в малюнку або більше літер дорівнює нулю. (2) Словник містить лише слова, утворені з однієї літери ( наприклад , "a", "aa", "aaa" тощо ). Шанс не скласти слово в малюнку з літер легко визначається і, очевидно, не нульовий. Будь-яка визначена відповідь закритої форми повинна містити всю структуру словника і була б справді жахливою і довгою формулою.к1к

Друга причина полягає в тому, що MC справді здійсненний: ви просто повинні зробити це правильно. Попередній параграф дає підказку: не просто генеруйте слова навмання, а шукайте їх; натомість спершу проаналізуйте словник та скористайтеся його структурою.

Один із способів представляє слова у словнику як дерево. Дерево вкорінюється в порожній символ і гілляться на кожній букві аж донизу; його листя - це, звичайно, самі слова. Однак ми також можемо вставити в дерево всі нетривіальні перестановки кожного слова (до з них на кожне слово). Це можна зробити ефективно, оскільки не потрібно зберігати всі ці перестановки; тільки краї в дереві потрібно додати. Листя залишаються однаковими. Насправді, це може бути спрощено далі, наполягаючи на тому, що дерево слід дотримуватися за алфавітом .к!-1

Іншими словами, щоб визначити, чи є багато слов із символів у словнику, спершу впорядкуйте елементи у відсортованому порядку,кпотім шукайте це відсортоване "слово" у дереві, побудованому з відсортованих представників слів у оригінальному словнику. Це насправді буде менше, ніж початкове дерево, оскільки воно об'єднує всі набори слів, еквівалентні сорту, такі як {stop, post, lons, opts, spot}. Справді, в словнику англійської мови цього класу слів ніколи б не було досягнуто, оскільки "так" було б знайдено першим. Побачимо це в дії. Відсортований мультисет "opst"; "o" буде гілкою на всі слова, що містять лише літери {o, p, ..., z}, "p" буде гіллям на всі слова, що містять лише {o, p, ..., z} і щонайбільше одне "о", і, нарешті, "s" розгалужиться на лист "так"! (Я припускав, що жоден із правдоподібних кандидатів "о", "оп", "

Необхідна модифікація для обробки макіяжів: я дозволю програмістам серед вас подумати над цим. Це не збільшить розмір словника (насправді має зменшити його); це трохи сповільнить обхід дерева, але не змінюючи його принципово. У будь-якому словнику, який містить однобуквене слово, наприклад англійське ("a", "i"), немає ніяких ускладнень: наявність підстановки означає, що ви можете сформувати слово! (Це натякає, що оригінальне запитання може бути не таким цікавим, як це звучить.)

Підсумок полягає в тому, що для одного пошуку словника потрібно (a) сортування -letter мультисети та (b) проходження не більше країв дерева. Час роботи - . Якщо ви вміло генеруєте випадкові мультисети в упорядкованому порядку (я можу придумати декілька ефективних способів зробити це), час роботи скорочується до . Помножте це на кількість ітерацій, щоб отримати загальний час роботи.k O ( k log ( k ) ) O ( k )ккО(кжурнал(к))О(к)

Надіюсь, ви могли провести це дослідження за допомогою справжнього набору Scrabble та мільйона ітерацій за лічені секунди.


@whuber Дерево - це ідеальна ідея (підказка для цієї ідеї), але чи не потребує вона багато пам’яті? Я думаю, це залежить від того, наскільки різноманітний словник, але я здогадуюсь, що для досить різноманітного словника знадобиться багато дерев. Наприклад, дерево 'b' починається з літери 'b' замість 'a' для всіх тих слів, які не мати "а" в них. Аналогічно, дерево "c" починалося б з літери "c" для тих слів, у яких немає "a" і "b", але є "c". Мій запропонований прямий підхід здається більш простим, оскільки він вимагає одноразового переходу всіх слів у словнику, ні?

1
@Srikant: Дереву, ймовірно, потрібно набагато менше оперативної пам’яті, ніж кешування всього словника для початку. Чи дійсно вас турбує кілька мегабайт оперативної пам’яті? До речі, є лише одне дерево, не багато: усі вони вкорінені в порожнє слово. Як я зрозумів, ваш підхід вимагає багаторазового пошуку словника (до 7!) На кожній ітерації , що робить його нездійсненним як страхи @shabbychef. Було б корисно, якщо ви могли б детальніше розглянути алгоритм, який ви маєте на увазі, де ви пишете "подивіться, чи можете ви сформувати слово": це приховує безліч важливих деталей!
whuber

@whuber: Я зрозумів факт, що є лише одне дерево після того, як я опублікував свій коментар. Зареєструйте мій підхід - я погоджуюсь, що моя пропозиція про Монте-Карло нечітка, і ваша відповідь чітко визначає, як реально реалізувати Монте-Карло в цій обстановці. Я фактично мав на увазі, що прямий підхід (див. Мою відповідь) може насправді бути простішим, оскільки такий підхід вимагає одноразової операції зі словником на відміну від monte carlo, який вимагає декількох тисяч ітерацій на дереві. Просто цікаво відносних достоїнств підходів.

@Srikant Я утримався коментувати ваш прямий підхід, тому що, я думаю, він отримує неправильні відповіді. Здається, вона не враховує структуру словника: тобто відношення підмножини між словами. Наприклад, чи отримала б ваша формула правильну відповідь нуля для всіх словників, які містять усі можливі однобуквені слова?
whuber

@whuber hmmm хороший момент. Можливо, я відповідаю на неправильне запитання!

2

Підхід Монте-Карло

кмкмш

1-мшм

Прямий підхід

Sтссгосгома,мб,...,мzсгомаN

N=(нк)

і

тс=(нама)(нбмб)...(нzмz)

(У тому числі вплив плитки підказки трохи складніше. Зараз я відкладу цю проблему.)

Таким чином, бажана ймовірність:

1-стсN

Швидкий і брудний підхід може бути не таким швидким! Словник може містити 100 000 слів, а пошук відповідності заданих плиток може бути катастрофою.
shabbychef

@shabbychef Це щось добре зроблене, щоб відповідати орфографам. Дивіться, наприклад, n3labs.com/pdf/lexicon-squeeze.pdf

@shabbychef Reg monte-carlo- якщо словник відсортований, відповідність має бути досить швидкою, ні? У будь-якому випадку, прямий підхід, який я окреслив раніше, був хибним. Я полагодив це. Проблема в моєму попередньому рішенні полягала в тому, що одне і те ж слово може утворюватися декількома способами (наприклад, 'bat', 'b * t' тощо).

1
@shabbychef Що стосується подальшої рефлексії, я згоден з вами, що підхід monte carlo не спрацює. Одне питання полягає в тому, що вам потрібно розібратися, які слова ви можете насправді утворити за допомогою плиток k, а друге - це те, що ви можете утворювати кілька слів за допомогою плиток k Обчислити ці комбінації з k плиток, мабуть, не так просто.

1
@Srikant Дякую Здається, ваша формула передбачає, що ви повинні використовувати всі k літери, щоб утворити слово, але я не думаю, що це запитує ОП. (У будь-якому випадку це не так, як відтворюється Scrabble.) З цим неявним припущенням ви на правильному шляху, але вам потрібно змінити алгоритм: ви не повинні повторювати обчислення для слів у словнику, які є перестановками один одного. Наприклад, у формулі ви не повинні віднімати і t_ {stop}, і t_ {post}. (Це проста модифікація, яку можна реалізувати.)
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.