barvins
barvins 2009-04-07 14:07

Palindromi

"seimā jokojāmies" ir palindroms, t.i., no abām pusēm lasāms vienādi. Reku vēl: http://www.creativity.lv/share/palindromi.txt

P.S. Parēķināju, ka, lai sameklētu visus iespējamos palindromus ar trīs vārdiem, manam datoram būtu nepārtraukti jādarboas 350 gadus. Ja saņemšos, uztaisīšu kaut ko līdzīgu folding@home, lai tie, kam ir vēlme piedalīties, varētu atvēlēt savu datoru brīvos resursus palindromu meklēšanai - ķipa skrīnseiveris, kas pamazām kombinē kopā vārdus no vārdnīcas meklējot palindromus un ik pa laikam nosūta rezultātus uz serveri vispārējai apbrīnošanai.
radars 2009-04-07 16:23

Virsraksts nolaizīts

Nevajag jau pārlasīt ar brute force - noteikti ir veids kā aplūkojamo variantu kopu samazināt pēc vārdos izmantoto burtu skaita un to dažādības - piemeklēt 2 vārdu kombinācijai ar summāro garumu x burti trešo vārdu ar garumu y, kur kopā ir pāra skaits katru burtu. nu kautkā tā, nemācēju skaidrāk uzrakstīt
barvins
barvins 2009-04-07 17:09

Virsraksts nolaizīts

Hmm, piemērs:
ABCDEF ED CBA
ABCDEF ED DEFEDCBA
ABCDEF ED XXXXXXXDEFEDCBA

Ja es zinu pirmos divus vārdus, tad trešais var būt gandrīz dajebkas gan pēc garuma, gan pēc izmantotajiem burtiem. Obligātais nosacījums ir, lai trešais vārds beigtos ar CBA. Varētu ieekonomēt laiku, ja man gatavībā būtu invertētu vārdu indekss (koks), kurā ātri sameklēt vērdus, ja ir zināms, ar ko tiem ir jābeidzas.
radars 2009-04-07 17:25

Virsraksts nolaizīts

Invertētu vārdu koku taču arī nav problēma iegūt, ja visi vārdi ir datu bāzē.

Par tiem garumiem man intuitīvi likās, ka to var kautkā izmantot, taču par to izmantošanas efektivitāti tiešām nepateikšu - jāpamēģina, tad varēšu komentēt.
radars 2009-04-07 18:33

Virsraksts nolaizīts

Līdz zinātnei vēl netiku, taču ar man pieejamo vārdu sarakstu (650 vārdi) šāds selekts

select a.vards+' '+b.vards+' '+c.vards from vardi_lv a, vardi_lv b, vardi_lv c
WHERE a.vards+b.vards+c.vards = c.vards_inverted+b.vards_inverted+a.vards_inverted
AND a.id<>b.id AND a.id<>c.id AND c.id<>b.id

izpildījās 3 minūtes, un atrada vairākus 3 vārdu variantus, jēdzīgākais no kuriem 'tiešs es šeit' ;) Mēģināšu atrast kādu lielāku vārdu sarakstu (nez cik to latviešu valodā vispār ir?). Protams, ka db serverim, lai izpildītu to pašu ar 20 tūkstošiem vārdu, vai ar 10 vārdiem būtu jābūt nemērīgam, tāpēc šis tāds pats brute force vien ir.
barvins
barvins 2009-04-07 19:10

Virsraksts nolaizīts

Tas ir brute-force, jā - db serveris tāpat ir spiests salīdzināt visas iespējamās kombenes. Bet cerīgi ir tas, ka izskatās, ka trīsvārdīgo palindromu patiešām ir daudz.
By the way, kāpēc tu pārbaudi, vai tie vārdi nesakrīt? Tādā veidā izslēdz, piemēram, "aka aka aka", kas ir visnotaļ valīds palindroms.
Man vārdnīcā kopā ir ap 500000 vārdu - visos iespējamajos locījumos. Pie tāda apjoma brute-force vairs neiet cauri.
radars 2009-04-07 22:32

Virsraksts nolaizīts

Pa dienu nesanāk laika ne īsti padomāt, ne uzrakstīt. Tagad mierīgā atmosfērā izdomāju, kā ar 3 vārdu palindromiem tikt galā ļoti ātri:

1) Tā kā frāzei jābūt vienādai no abiem galiem, pa priekšu atrodam pirmo un trešo vārdu, atlasot no 500 tūkstošiem tos, kur pirmais vārds pilnībā ietilpst trešā vārda reversajā versijā;
2) Tālāk meklējam otro vārdu, kam jābūt vismaz x burtus garam, kur x ir starpība starp trešā un pirmā vārda garumiem (pirmais <= trešais). Pie kam, ja x > 0, tad ir zināma meklējamā otrā vārda galotne - tā ir trešā vārda sākuma reversā versija. Ja x=0, tad par otro vārdu der jebkurš vienvārda palindroms.

Es biju domājis, ka trīs vienādi vārdi frāzē nav nekāda frāze, tāpēc aplūkoju tikai dažādus vārdus. Bet nu pēc definīcijas laikam Tev taisnība.

Pamēģināšu augstāk aprakstīto paņēmienu ar 180 tūkstošiem vārdu, ko es atradu OpenOffice vārdnīcā, domāju ka līdz rītam visi trīsvārdu varianti būs atrasti.
barvins
barvins 2009-04-07 23:31

Virsraksts nolaizīts

Es, savukārt, pamēģināju salādēt vārdus pa vienam burtam divos kokos, vienā no vārda sākuma, otrā no beigām. Pēc tam vienlaicīgi caurstaigāju abus kokus, un, kad nonācu līdz viena vārda beigām, pārbaudīju, vai otra vārda atlikusī daļa ir palindroms. Šādi dabūju visus divvārdīgos palindromus 5 minūtēs. Zvērīgs uzlabojums - ar brute-force metodi vajadēja 12 stundas.
Tagad štukoju, kā to izmantot 3 vārdu palindromiem.