перестановки пошли не так - PullRequest
2 голосов
/ 12 апреля 2010

Я написал код для реализации алгоритма, который я нашел в перестановках строк. У меня есть массив слов (до 200), и мне нужно переставить список на 5 уровнях. По сути, сгруппировать строковые слова в пять и переставить их. Что у меня берет первые 5 слов, генерирует перестановки и игнорирует остальную часть массива? Любые идеи приветствуются.

Private Function permute(ByVal chunks As ArrayList, ByVal k As Long) As ArrayList
        ReDim ItemUsed(k)
        pno = 0
        Permutate(k, 1)

        Return chunks
    End Function


    Private Shared Sub Permutate(ByVal K As Long, ByVal pLevel As Long)

        Dim i As Long, Perm As String
        Perm = pString ' Save the current Perm
        ' for each value currently available


        For i = 1 To K

            If Not ItemUsed(i) Then
                If pLevel = 1 Then
                    pString = chunks.Item(i)
                    'pString = inChars(i)
                Else
                    pString = pString & chunks.Item(i)
                    'pString += inChars(i)
                End If
                If pLevel = K Then 'got next Perm
                    pno = pno + 1
                    SyncLock outfile
                        outfile.WriteLine(pno & " = " & pString & vbCrLf)
                    End SyncLock
                    outfile.Flush()
                    Exit Sub
                End If
                ' Mark this item unavailable
                ItemUsed(i) = True
                ' gen all Perms at next level
                Permutate(K, pLevel + 1)
                ' Mark this item free again
                ItemUsed(i) = False
                ' Restore the current Perm 
                pString = Perm
            End If
        Next

K выше = = 5 для количества слов в одной перестановке, но когда я изменяю цикл for на размер массива, я получаю ошибку индекса за пределами границ

Ответы [ 3 ]

0 голосов
/ 04 ноября 2010

Вы получите эту ошибку.

Когда вы делаете

Для i = 1 К

Последнее значение i будет размером вашего массива.

chunks.Item (я)

Сбой, когда я равняюсь размеру массива, так как индекс начинается с 0.

Я бы предложил вам изменить цикл for на

для i = 0 до K - 1

Или вы измените способ доступа к значениям в ваших массивах на

chunks.Item (I-1)

0 голосов
/ 11 января 2011

C ++ Перестановка

#include <stdio.h>

void print(const int *v, const int size)
{
  if (v != 0) 
  {
    for (int i = 0; i < size; i++) 
    {
      printf("%4d", v[i] );
    }
    printf("\n");
  }
} // print


void permute(int *v, const int start, const int n)
{  
  if (start == n-1) {
    print(v, n);
  }
  else {
    for (int i = start; i < n; i++) {
      int tmp = v[i];

      v[i] = v[start];
      v[start] = tmp;
      permute(v, start+1, n);
      v[start] = v[i];
      v[i] = tmp;
    }
  }
}


main()
{
  int v[] = {1, 2, 3, 4};
  permute(v, 0, sizeof(v)/sizeof(int));
}
0 голосов
/ 01 октября 2010

Ошибка индекса вне границ обычно возникает при запуске цикла от 1 до длины. Цикл for выглядит следующим образом.


    For i  = 0 to array.length - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...