Re[3]: Скользящий поиск максимума?
От: MBo  
Дата: 03.06.11 10:25
Оценка: 12 (1)
Здравствуйте, Аноним, Вы писали:


А>Но интуиция что-то подсказала что тут что-то не то. Все вроде логично. Но дорисуйте картинку в соответсвии с вашим алгоритмом.


  X: TElement = record
       Index: Integer;
       Data: Integer;
    end;
  A: массив целых
 
  Deque := TDeque.Create(NMax);

  for i := 0 to Count + WinSize - 2 do begin

    //если передний элемент старый, удаляем его
    if (not Deque.Empty) and (Deque.PeekFront.Index = i - WinSize) then
      Deque.GetFront;

    if i < Count then begin
    //Если задние меньше нового, то они уже не будут максимумами
    //Удаляем, если такие есть
      while (not Deque.Empty) and (Deque.PeekBack.Data < A[i]) do
        Deque.GetBack;

    //Вставляем новый элемент
      X.Index := i;
      X.Data := A[i];
      Deque.PutBack(X);
    end;

    //Текущий максимум - на переднем конце дека
    CurMax := Deque.PeekFront.Data;
    
   //вывод состояния
  end;
  Deque.Free;


Выдача:

Окно размером 4 на массиве 
 10 26 12  4 18  9 28 23 17  4 
--------------------
[10]26 12  4 18  9 28 23 17  4     WinMax: 10
[10 26]12  4 18  9 28 23 17  4     WinMax: 26
[10 26 12] 4 18  9 28 23 17  4     WinMax: 26
[10 26 12  4]18  9 28 23 17  4     WinMax: 26
 10[26 12  4 18] 9 28 23 17  4     WinMax: 26
 10 26[12  4 18  9]28 23 17  4     WinMax: 18
 10 26 12[ 4 18  9 28]23 17  4     WinMax: 28
 10 26 12  4[18  9 28 23]17  4     WinMax: 28
 10 26 12  4 18[ 9 28 23 17] 4     WinMax: 28
 10 26 12  4 18  9[28 23 17  4]    WinMax: 28
 10 26 12  4 18  9 28[23 17  4]    WinMax: 23
 10 26 12  4 18  9 28 23[17  4]    WinMax: 17
 10 26 12  4 18  9 28 23 17[ 4]    WinMax: 4
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.