Cum de a face o propunere de literele introduse de revărsare stiva utilizator în limba rusă

Intrarea la programul servit un set de litere englezești. Există un dicționar de cuvinte.

Cum de a genera astfel de propuneri de cuvinte pentru fiecare dintre propuneri a constat numai din acele scrisori care au fost trimise la intrare, având în vedere numărul de repetiții.

Set de caractere de intrare: hellomyfriend

Alegeți cuvinte care satisfac un set de simboluri de intrare am făcut. Dar a face rapid Exemple din ele nu funcționează.

Am făcut prin sortarea toate cuvintele. Pentru script-ul fraza myfavoritegame am practicat timp de aproximativ 5 minute. Ofertele site-ului sunt date instantaneu.

Poți avea orice sfat?

set 28 august '15 la 07:43

Mai multe sfaturi pentru a se uite la motorul de căutare, cum ar fi Sphinx - Rikaz 28 august '15 la 08:25

Problema pe care suna „Cum de a face selecția de cuvinte din dicționar pentru a obține o frază predeterminată“, ca în exemplul pe care conduci anagrame de căutare. Ați putea să clarifice problema ta cum unele exemplu. - Ruslan 28 august '15 la 08:53

Să presupunem că trebuie doar să găsească toate combinațiile posibile de cuvinte din dicționar, care satisfac condiția. Este axat pe limbajul special, este.

  1. prezența literelor din cuvântul. Excludeți scrisori conținând este definit. Excludem, în măsura în care intrarea utilizată deja.
  2. Noi credem caractere. La orice intrare dat este cunoscut, cuvintele de o lungime corespunzătoare, sau pur și simplu nu se potrivesc.
  3. repetări de scrisori.
  1. ordinea literelor din cuvântul de vocabular.
  2. Semnificația cuvântului.

Pentru a accelera aveți nevoie pentru a căuta caracteristici importante cât mai repede posibil, prin eliminarea aspectelor lipsite de importanță, dacă este necesar.

Pentru a găsi rapid un cuvânt cu un set adecvat de scrisori, dar excluzând repetări, acesta poate fi indicele de biți așa cum a propus @Mirdin: 26 litere englezești = 26 biți. Numărul de cuvinte într-un dicționar (sau doar indicele este numărul liniei) și de a crea un indice separat în două coloane: id cuvânt - mască de bit litere disponibile. Pentru vocabular mai puțin de 65 mii. Cuvinte, un index va „cantari“ 6 bytes pe cuvânt, mai puțin de 400K. Acesta poate fi păstrată în memorie pentru căutarea aproape instantanee. Deci, puteți găsi rapid exemplu, primul cuvânt al frazei - doar pentru a fi sigur pe biți de litere „extra“.

Acesta ar trebui să facă o copie a dicționarului, în cazul în care literele cuvântului sunt sortate în ordine alfabetică. iar cuvintele sunt sortate în ordine alfabetică. Ie indicele din nou separat: sortirovannye_bukvy - id_slova. Acest indice va fi mai greu asupra dicționarului în sine (numărul de cuvinte * 2, sau 3 octeți). În acest indice, puteți găsi rapid cuvintele potrivite și aruncați exact-nepotrivite.

Algoritmul despre astfel. Cautam primul cuvânt. Vreau să găsesc primul cuvânt de cea mai mare lungime posibilă. Bust în lungime, de la cel mai mare la cel mai mic. Consumul de un set valid de caractere și lungime. Găsiți primul cuvânt, actualizat set corect de litere și cuvinte de lungime - sunt în căutarea pentru următorul cuvânt.

Răspuns 28 '15 august la 20:59

  1. Faci o structură (un tabel în baza de date, un tabel hash, dicționar, și astfel că există în PHP) din cele două câmpuri cu privire la intrarea: hash și spune de fapt cuvântul. Am bătut cuvinte această structură.
  2. Hash este de aproximativ după cum urmează: indicele de litere din alfabet - o putere de două, se adaugă la toate literele cuvântului (32 de biți pentru limba română trebui să fie suficient). Aceasta este cea mai ușoară opțiune, poate fi necesar să vină cu o funcție mai complexă.
  3. Obținerea cuvântul că este necesar să se zaanagramit - calcula hash și uita-te la el în structura noastră

UPD: Aceasta este pentru un singur cuvânt, o frază va fi mai complicat, dar principiul este același

Răspuns 28 '15 august la 07:59

litere strica Repeating întregi zmeură. Cuvântul „liber“, la „e“ indicele de 4, in suma se va dubla la 2 ^ 4, care este aceeași ca 2 ^ 5, litera „f“. - Sergiks 28 august '15 la 20:49

@Sergiks, da, ai dreptate, am descris cazul cel mai simplu, în practică, trebuie să utilizeze un pic mai complicat decât oricând. - Mirdin 29 august '15 la 04:32