Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.068 c
6-1170760601
inex
2007-02-06 14:16
2007.10.07
Ошибка отправки ответа ServerSocket


15-1189090603
Нуждающийся в совете
2007-09-06 18:56
2007.10.07
Учебник по теории вероятности и математической статистике.


5-1161060613
DimaBr
2006-10-17 08:50
2007.10.07
Dock &amp; IDE


15-1189085643
savyhinst_
2007-09-06 17:34
2007.10.07
Сломаная винда.


2-1189199640
dima123
2007-09-08 01:14
2007.10.07
ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский