Как Вы реализуете расстояние Левенштейна в Delphi?

Вам нужно будет сохранить индекс, повторяя цикл вперед, когда вы достигнете конца:

i = 0
while sum(myList) != 22:
    myList[i] += 1
    i = (i + 1) % len(myList)

Выражение (i + 1) % len(myList) возвращает цикл назад к 0, когда вы в противном случае увеличьте i, чтобы выйти за пределы.

Демонстрация:

>>> myList = [0, 0, 0, 0, 0, 0]
>>> i = 0
>>> while sum(myList) != 22:
...     myList[i] += 1
...     i = (i + 1) % len(myList)
...
>>> myList
[4, 4, 4, 4, 3, 3]

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

def distribute(oranges, plates):
    base, extra = divmod(oranges, plates)
    return [base + (i < extra) for i in range(plates)]
blockquote>

, который для вашего примера с 6 слотами и 22 предметами дает:

>>> distribute(22, 6)
[4, 4, 4, 4, 3, 3]

20
задан JosephStyons 10 September 2008 в 18:13
поделиться

1 ответ

function EditDistance(s, t: string): integer;
var
  d : array of array of integer;
  i,j,cost : integer;
begin
  {
  Compute the edit-distance between two strings.
  Algorithm and description may be found at either of these two links:
  http://en.wikipedia.org/wiki/Levenshtein_distance
  http://www.google.com/search?q=Levenshtein+distance
  }

  //initialize our cost array
  SetLength(d,Length(s)+1);
  for i := Low(d) to High(d) do begin
    SetLength(d[i],Length(t)+1);
  end;

  for i := Low(d) to High(d) do begin
    d[i,0] := i;
    for j := Low(d[i]) to High(d[i]) do begin
      d[0,j] := j;
    end;
  end;

  //store our costs in a 2-d grid  
  for i := Low(d)+1 to High(d) do begin
    for j := Low(d[i])+1 to High(d[i]) do begin
      if s[i] = t[j] then begin
        cost := 0;
      end
      else begin
        cost := 1;
      end;

      //to use "Min", add "Math" to your uses clause!
      d[i,j] := Min(Min(
                 d[i-1,j]+1,      //deletion
                 d[i,j-1]+1),     //insertion
                 d[i-1,j-1]+cost  //substitution
                 );
    end;  //for j
  end;  //for i

  //now that we've stored the costs, return the final one
  Result := d[Length(s),Length(t)];

  //dynamic arrays are reference counted.
  //no need to deallocate them
end;
17
ответ дан 30 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: