Здравствуйте, Аноним, Вы писали:
А>Но интуиция что-то подсказала что тут что-то не то. Все вроде логично. Но дорисуйте картинку в соответсвии с вашим алгоритмом.
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