MAXimal

���������: 30 Oct 2008 23:24
�������������: 20 Aug 2012 23:55

���������� [������]

����������� ����� � ������� ��� ���������� �������� �� O (1)

����� �� ���������� ��� ������: ��������������� ����� � ����������� ���������� ����������� �������� �� O (1), ����������� ��������������� �������, � ����� ���������� �� � ������ ���������� �������� �� ���� ����������� ������������� ����� ������� ������� �� O (N).

����������� �����

��������� �������� ����������� ���������� �������� � ����� �� O (1), �������� ����� �� ����������� ���������� � �������� ��������� �� �����.

��� ����� ����� ������� � ����� �� ���� ��������, � ����: ������� � ������� � �����, ������� � ����� �������� � ����. ����� �������, ���� ����������� ���� ��� ������ ���, ��

stack[i].second = min { stack[j].first }
                 j = 0..i

�������, ��� ����� ���������� �������� �� ��� ����� ����� ����������� ������ �� ������ �������� stack.top().second.

����� ��������, ��� ��� ���������� ������ �������� � ���� �������� second ����� ����� min (stack.top().second, new_element). �������� �������� �� ����� ����� �� ���������� �� �������� �� �������� �����, ��������� ��������� ������� ����� �� ��� �������� �� �������� second ��� ���������� ���������.

����������:

stack< pair<int,int> > st;
  • ���������� ��������:
    int minima = st.empty() ? new_element : min (new_element, st.top().second);
    st.push (make_pair (new_element, minima));
  • ���������� ��������:
    int result = st.top().first;
    st.pop();
  • ���������� ��������:
    minima = st.top().second;

����������� �������. ������ 1

����� ���������� ������� ������ ����������� �������, �� ������� ��� ����������, ��� ���������������� ������� ������� ����� ������� �� ��� �������� (�.�. ��� ���������� �������� �� ������� ��� ���� ����� ����� �������� ��������, ������� �� ����� �������). ����, ��� ��� ������ ����������� �������� (������ ������� ����� ��� ��� ��� ����, ����� �������� ��������� �������, � �� ��������), ������ ���� ������ ������������� ����� ���������. ����� ���� ����� �������� � ������ � ���������� �������� � ����������� (��. ����).

�������� ���� ����������� � ���, ����� ������� ������� � ������� �� ��� ��������, � ������ ������ ��� ��� ����������� ��������. � ������, ����� ������� ������������ ����� ����������� ������������������ ����� (�.�. � ������ �������� ���������� ��������), ������, ����������, �� ������������, � ������ ���������� �������. ����� ������� �� ���� ������� ������ ����� �������� ������ � ���������. ����� ����������� ������ �������� � ������� ���������� ���������� "������": ���� � ������ ������� ��������� �������, ������� ������ ��������, ����� ������� ���� ������� �� �������; ����� ������� ����� ������� � ����� �������. ��� ����� ��, � ����� �������, �� ������� �������, � � ������ �������, �� �������� ������� �������, ���� �� �� �����-���� ����������� ���� �������� ���������. �� ��� ���������� �������� �� ������ ������� ��� ���, ������ ������, ����� ��� �� ��������� - ���� ���������������� ������� ����� �������� ���� ������� � �������� ������������. ������� ��� �������� �������� ��� ���� ����� �������� ������������ �������� - ���� ������� � ���� ��������� ��������� � ������ �������, �� ��������� ���; ����� ������ ������ �� ������.

���������� ���������� ������������� ��������:

deque<int> q;
  • ���������� ��������:
    current_minimum = q.front();
  • ���������� ��������:
    while (!q.empty() && q.back() > added_element)
    	q.pop_back();
    q.push_back (added_element);
  • ���������� ��������:
    if (!q.empty() && q.front() == removed_element)
    	q.pop_front();

�������, ��� � ������� ����� ���������� ���� ���� �������� ���� O (1).

����������� �������. ������ 2

���������� ����� ������ ������ ����������� ������� ��� ���������� �������� �� O (1), ������� ��������� ����� ������ ��� ����������, ������ ����� ��������� ���������� ����������� ������: ��� �������� ������� ������� ����������� � ���, �, � ���������, ��� ���������� �������� �� ��������� ����� ��� ��������.

���� ����������� � ���, ����� ������ ������ � ������ �� ������, ������� ��� ���� ���� ������. �������� ������������ ������� � ������� ���� ������.

������ ��� �����: s1 � s2; ����������, ������� � ���� �����, ���������������� ��� ���������� �������� �� O (1). ��������� ����� �������� ����� ������ � ���� s1, � ��������� �������� - ������ �� ����� s2. ��� ����, ���� ��� ������� ���������� �������� �� ����� s2 �� �������� ������, ������ �������� ��� �������� �� ����� s1 � ���� s2 (��� ���� �������� � ����� s2 ��������� ��� � �������� �������, ��� ��� � ����� ��� ���������� ���������; ���� s1 �� ������ ������). �������, ���������� �������� � ������� ����� ���������� ����������� � ���������� �������� �� �������� � ����� s1 � �������� � ����� s2.

��� �����, �� ��������� ��� �������� ��-�������� �� O (1) (�� ��� ������� �������, ��� ������ ������� � ������ ������ 1 ��� ����������� � ���� s1, 1 ��� ����������� � ���� s2 � 1 ��� ����������� �� ����� s2).

����������:

stack< pair<int,int> > s1, s2;
  • ���������� ��������:
    if (s1.empty() || s2.empty())
    	current_minimum = s1.empty ? s2.top().second : s1.top().second;
    else
    	current_minimum = min (s1.top().second, s2.top().second);
  • ���������� ��������:
    int minima = s1.empty() ? new_element : min (new_element, s1.top().second);
    s1.push (make_pair (new_element, minima));
  • ���������� ��������:
    if (s2.empty())
    	while (!s1.empty()) {
    		int element = s1.top().first;
    		s1.pop();
    		int minima = s2.empty() ? element : min (element, s2.top().second);
    		s2.push (make_pair (element, minima));
    	}
    result = s2.top().first;
    s2.pop();

������ ���������� �������� �� ���� ����������� ������������� ����� ������� �������

����� ��� ������ A ����� N, � ���� ����� M ≤ N. ��������� ����� ������� � ������ ���������� ����� M ������� �������, �.�. �����:

min A[i],    min A[i],    min A[i],    ...,    min A[i]
0≤i≤M-1      1≤i≤M        2≤i≤M+1              N-M≤i≤N-1

����� ��� ������ �� �������� �����, �.�. O (N).

��� ����� ���������� ������� �������, ���������������� ��� ���������� �������� �� O (1), ��� ���� ����������� ���� ����, ������ � ������ ������ ������� ����� �� ���� ������� ���������� ����� �������. ����� ������� ��� �������: ������� � ������� ������ M ��������� �������, ����� � ��� ������� � ������� ���, ����� ������� � ������� ��������� �������, � �������� �� �� ������ ������� �������, ����� ������� �������, � �.�. ��������� ��� �������� � �������� ����������� � ������� �� ����������� �����, �� � ����������� ����� ��������� ��������� O (N).

����� ��������, ��� ���������� ���������������� ������� ������ ������� �����, ������ ��� ��, ��������, ����������� ������� ���� ������ (��������� �� i-�� ���� ����������� ����� i-�� � (i-M)-�� �������� �������). ��� ���������� ������� ������ ������� ������ A ������� ���� �� ����������� - ������ �������� ���������, i-�� ������� �������.