Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Подскажите алгоритм генерации текста   Найти похожие ветки 

 
integery   (2007-09-10 21:47) [0]

Подскажите алгоритм  генерации текста
Например есть массив слов :  слово1, слово2, слово3

Нужно получить все возможные варианты словосочитания, но слова не должны повторятся:

слово1  слово2  слово3
слово1  слово3  слово2
слово2  слово1  слово3
слово2  слово3  слово1
…….

Массив слов может иметь от 2 до 10 слов.
Спасибо за любую информацию.


 
Вася Правильный   (2007-09-10 22:13) [1]

вложенные циклы?


 
Dib@zol ©   (2007-09-10 22:14) [2]

Неа. Рекурсия!


 
Efir ©   (2007-09-10 22:46) [3]

Десять слов - это жесть, 3628800 комбинаций.


 
новичёк   (2007-09-10 23:17) [4]

inds: array[0..WordsCount - 1];
for i := 0 to WordsCount - 1 do inds[i] := i;
for i := 0 to WordsCount - 1 do swapinds(i, random(WordsCount));
for i := 0 to WordsCount - 1 do Result := Result + Words[inds[i]];


 
Вася Правильный   (2007-09-11 10:10) [5]


> Неа. Рекурсия!

это продвинутый варинат для заранее неизвестного числа слов


 
integery   (2007-09-11 11:16) [6]

10 слов ето максимум в основном 3 - 7


 
Ega23 ©   (2007-09-11 11:18) [7]

Уточни задачу: тебе именно "словосочетания", или просто комбинации из набора слов?
Просто вторая задачка - тривиальна, а вот первая - на хороший курсовик тянет.


 
integery   (2007-09-11 11:38) [8]


> for i := 0 to WordsCount - 1 do swapinds(i, random(WordsCount));

што за финкция swapinds ?????


 
integery   (2007-09-11 11:43) [9]

нужно  просто комбинации из набора слов
Нужно получить все возможные варианты комбинации , но слова не должны повторятся


 
Efir ©   (2007-09-11 11:47) [10]


> 10 слов ето максимум в основном 3 - 7


Ты хочешь сказать, что 10!=7 или 3?


 
ЮЮ ©   (2007-09-11 11:54) [11]

> Ты хочешь сказать, что 10!=7 или 3?


Он хочет сказать, что ему в основном придется вращаться между 3! и 7!, а 10! - в крайнем случае :)

P.S. Автор точно уверен, что ему нужно такое количество вариантов? Кто такой манускрипт читать то будет?


 
Efir ©   (2007-09-11 12:05) [12]

Виноват, не понял.


 
Efir ©   (2007-09-11 12:08) [13]

Может http://progpage.narod.ru/alg/per.html


 
integery   (2007-09-11 17:54) [14]

может ктото на дельфях может подкинуть пример.


 
Efir ©   (2007-09-11 19:08) [15]

Вот тут написал, правда слегка коряво, но вроде работает.
На форме Button, Memo и UpDown с Edit"ом.

procedure TForm1.ButtonClick(Sender: TObject);
var
 Count,i,k,min,buf:integer;
 mas:array of byte;
 s:string;

 function isAnd:boolean;
 var
   j:integer;
 begin
   Result:=true;
   for j:=0 to High(mas) do
     if mas[j]<>Length(mas)-j then begin
       Result:=false;
       Break;
     end;
 end;

 procedure Sort;
 var
   x:integer;
   changed:boolean;
 begin
   repeat
     changed:=false;
     for x:=i+1 to Count-2 do
       if mas[x]>mas[x+1] then begin
         buf:=mas[x];
         mas[x]:=mas[x+1];
         mas[x+1]:=buf;
         changed:=true;
       end;
   until not changed;
 end;

begin
 Count:=UpDown.Position;
 SetLength(mas, Count);

 if Count<2 then Exit;

 for i:=0 to High(mas) do mas[i]:=i+1;

 s:="";
 for i:=0 to High(mas) do s:=s+" "+inttostr(mas[i]);
 Memo.Lines.Add(s);

 repeat
   for i:=Count-2 downto 0 do
     if mas[i]<mas[i+1] then begin
       min:=i+1;
       for k:=i+1 to Count-1 do
         if (mas[i]<mas[k]) and (mas[k]<mas[min]) then min:=k;
       if mas[i]<mas[min] then begin
         buf:=mas[i];
         mas[i]:=mas[min];
         mas[min]:=buf;
         Sort;
       end;
       Break;
     end;

   s:="";
   for i:=0 to High(mas) do s:=s+" "+inttostr(mas[i]);
   Memo.Lines.Add(s);
 until isAnd;
end;


 
Efir ©   (2007-09-11 19:10) [16]

Сделано по алгоритму Дейкстры.


> Пусть у нас есть первая перестановка (например 1234). Для
> нахождения следующей выполняем три шага. 1. Двигаясь с предпоследнего
> элемента перестановки, ищем элемент a[i], удовлетворяющий
> неравенству a[i] < a[i + 1]. Для перестановки 1234, это
> число 3, т. к. (3 < 4).
> 2. Меняем местами элемент a[i] с наименьшим элементом, который:
>
> а) находится праве a[i].
> б) является больше чем a[i].
> В нашем случае меняем 3 и 4.
> 3. Все элементы стоящие за a[i] сортируем. В нашем случем
> нужно отсортировать число 4, но это единственный элемент,
>  следовательно так его и оставляем.
>
> В результате выполнения этих трех шагов получаем следующую
> по алфавиту перестановку 1243.
> Выполнять эти шаги нужно циклически до тех пор, пока в перестановке
> не будет находится искомый в первом шаге элемент a[i], т.
>  е. пока перестановка не станет отсортированной по убыванию:
>  4321.


 
integery   (2007-09-12 10:33) [17]


> Efir
- спасибо !!!



Страницы: 1 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-1180925040
Slider007
2007-06-04 06:44
2007.10.07
Даты в хранимых процедурах (FireBird 1.5)


4-1175766573
Степан Журавлев
2007-04-05 13:49
2007.10.07
GetParent


15-1188973346
de.
2007-09-05 10:22
2007.10.07
Город мастеров (Полу сабж, полу вопрос... :)


15-1189108877
max_
2007-09-07 00:01
2007.10.07
info


2-1189472253
Glivera
2007-09-11 04:57
2007.10.07
экземпляр формы