На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Составление слова из букв заданного слова
    Допустим есть слово миранда, есть источник слов (допустим текстовый файл), нужно составить слова из букв заданного слова (мир, марина, рама ....).

    Подскажите оптимальный вариант алгоритма.
    Заранее благодарен.
      Оптимальный по какому критерию?
        Цитата dima_s_d_s @
        Допустим есть слово миранда, есть источник слов (допустим текстовый файл), нужно составить слова из букв заданного слова (мир, марина, рама ....).

        возмоден такой вариант:

        1. генерируем все подмножества данного множества, учитывая ограничения на длину слова (см. эдесь)
        2. для каждого слова строим перестановки без повторений (см. здесь)
        3. сверяем найденные слова со словарем и получаем все слова, которые есть в словаре
          Словарь из файла организовать в виде дерева, в котором каждый путь - слово, а каждая вершина - буква.
          Обходить дерево слева направо, осуществляя поиск очередной буквы-вершины в исходном слове. Если буква есть - вычеркнуть её из копии исходного слова и спускаться дальше по ветке, если нет - возврат.
            Цитата andrew.virus @
            возмоден такой вариант:

            1. генерируем все подмножества данного множества, учитывая ограничения на длину слова (см. эдесь)
            2. для каждого слова строим перестановки без повторений (см. здесь)
            3. сверяем найденные слова со словарем и получаем все слова, которые есть в словаре

            Начну с первого.
            1. генерируем все подмножества данного множества, учитывая ограничения на длину слова (см. эдесь)
            Из статьи не совсем понял алгоритм, поискал по форуму примеры, в и тоге получил что-то похожее на следующее

            ExpandedWrap disabled
              $a = "миранда";
              $count = 0;
              for($i=0; $i<7; $i++){
                  $cnt = 0;
                  for($j=0; $j <= $count; $j++){
                      $cnt++;
                      $array[$count+$cnt] = $array[$j].$a[$i];
                  }
                  $count+=$cnt+1;
                  $array[$count] = $a[$i];
              }


            Помогите привести до ума.
              Есть алгоритм Размещение
              Там же есть пример организации алгоритма на Java.
              ExpandedWrap disabled
                import java.util.Arrays;
                 
                public class PermutationsWithRepetition {
                    private Object[] source;
                    private int variationLength;
                 
                    public PermutationsWithRepetition(Object[] source, int variationLength) {
                        this.source = source;
                        this.variationLength = variationLength;
                    }
                 
                    public Object[][] getVariations() {
                        int srcLength = source.length;
                        int permutations = (int) Math.pow(srcLength, variationLength);
                 
                        Object[][] table = new Object[permutations][variationLength];
                 
                        for (int i = 0; i < variationLength; i++) {
                            int t2 = (int) Math.pow(srcLength, i);
                            for (int p1 = 0; p1 < permutations;) {
                                for (int al = 0; al < srcLength; al++) {
                                    for (int p2 = 0; p2 < t2; p2++) {
                                        table[p1][i] = source[al];
                                        p1++;
                                    }
                                }
                            }
                        }
                 
                        return table;
                    }
                 
                    public static void main(String[] args) {
                        PermutationsWithRepetition gen = new PermutationsWithRepetition(
                                new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
                                5);
                 
                        Object[][] variations = gen.getVariations();
                 
                        for (Object[] s : variations) {
                            System.out.println(Arrays.toString(s));
                        }
                    }
                }

              Пример хороший, но он реализует размещение с повторениями.
              Может есть подобный пример алгоритма, для размещение без повторений?
                dima_s_d_s набросал пример, который работает ...

                ExpandedWrap disabled
                  function generateAllWords(baseStr: string; baseFile: string): TStrings;
                  // генерация слов на базе основного с проверкой по словарю
                  var
                    indArr: array of byte;
                    i, j, lenArr: integer;
                    tmpStr: string;
                    dicArr: TStrings;
                   
                  begin
                    lenArr:=length(baseStr);
                    setlength(indArr, lenArr + 1);  // формирование массива индексов ...
                                                          // ... для формирования базовых основ
                    result:=TStringList.Create;
                    // формирование списка основ для генерации слов ...
                    // ... и получение на их основе полного списка
                    // начальная инициализация массива индексов
                    for i:=0 to lenArr do
                      indArr[i]:=0;
                    //
                    while indArr[lenArr] <> 1 do
                      begin
                        i:=0; // индекс бита двоичного числа
                        while indArr[i] = 1 do
                          begin
                            indArr[i]:=0; // моделируем перенос в следующий разряд, ...
                                          // ... возникающий при сложении
                            i:=i+1
                          end;
                        indArr[i]:=1;
                        // получение простой подстроки от основы ...
                        // ... для генерации слов
                        tmpStr:='';
                        for i:=0 to (lenArr - 1) do
                          if indArr[i] = 1 then
                            tmpStr:=tmpStr + baseStr[i + 1];
                        // добавление очередной подстроки в список основ
                        if length(tmpStr) > 1 then
                          if result.IndexOf(tmpStr) < 0 then
                            result.Add(tmpStr)
                      end;
                    // формирование списка реальных слов на ...
                    // ... основе проверки по словарю
                    dicArr:=TStringList.Create;
                    dicArr.LoadFromFile(baseFile);
                    for i:=(result.Count - 1) downto 0 do
                      begin
                        j:=dicArr.IndexOf(result[i]);
                        if j < 0 then
                          result.Delete(i)
                      end;
                    result.SaveToFile('out.txt')
                  end;

                вызывается всё таким образом:

                ExpandedWrap disabled
                  generateAllWords(edit1.text, 'in.txt');

                для входного слова "маскарад" и словаря:

                ExpandedWrap disabled
                  ар
                  ор
                  мортира
                  антивирус
                  маска
                  маскарад
                  дар
                  пена
                  ад
                  мор
                  парад
                  пенопласт
                  лиман
                  боль
                  лемон
                  фунт
                  кадр
                  дама
                  тиф
                  смерть

                получаем:

                ExpandedWrap disabled
                  маска
                  ар
                  ад
                  маскарад

                з.ы.: в прилагаемом архиве пример целиком ...
                Прикреплённый файлПрикреплённый файлcombin_words.zip (2.89 Кбайт, скачиваний: 346)
                  Цитата andrew.virus @
                  dima_s_d_s набросал пример, который работает ...
                  ...
                  з.ы.: в прилагаемом архиве пример целиком ...

                  Большое спасибо.
                  Буду разбираться, жаль что не С/С++ или PHP :(
                  Сообщение отредактировано: dima_s_d_s -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,1433 ]   [ 15 queries used ]   [ Generated: 26.04.24, 12:21 GMT ]