10,2 ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²
π ΠΠΏΠΈΡΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄Π»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΡ ΡΠΈΡΠ΅Π» Π² Π½Π°Π±ΠΎΡΠ΅ ΠΈΠ· ΠΌΠΈΠ»Π»ΠΈΠ°ΡΠ΄Π° ΡΠΈΡΠ΅Π». ΠΠ°ΠΌΡΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π²Π΅ΡΡ ΠΌΠΈΠ»Π»ΠΈΠ°ΡΠ΄ ΡΠΈΡΠ΅Π». ΠΡΠ»ΠΈ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΎΡΠ΅Π½ΠΈΡΠ΅ Π΅Π³ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΡΡ Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 1. Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°
ΠΠΎΠΆΠ½ΠΎ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²Π·ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΡΠΈΡΠ΅Π». ΠΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ O(n log(n)) Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 2. ΠΠΈΠ½ΠΈΠΌΡΠΌ ΠΊΡΡΠΈ
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ Π·Π°Π΄Π°ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΊΡΡΠΈ. ΠΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΡΠΈΡΠ΅Π» Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π΅ΡΡ
Ρ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ. ΠΡΡΠ°Π²Π»ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΎΠΊ, ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΡΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΡ
ΡΠΈΡΠ΅Π». ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° O(n log(m)), Π³Π΄Π΅ m β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 3. Π Π°Π½ΠΆΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π΅ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²)
ΠΠ°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΉΡΠΈ i-ΠΉ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ (ΠΈΠ»ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ) ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅.
ΠΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½Ρ, ΠΏΠΎΠΈΡΠΊ i-Π³o Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ Π(n) Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ:
ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΅Π³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Β«ΡΠ΅Π½ΡΡΠ°Β». Π Π°Π·Π±Π΅ΠΉΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²ΠΎΠΊΡΡΠ³ ΡΠ΅Π½ΡΡΠ°, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ»Π΅Π²Π°.
ΠΡΠ»ΠΈ ΡΠ»Π΅Π²Π° Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ²Π½ΠΎ i ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
ΠΡΠ»ΠΈ ΡΠ»Π΅Π²Π° Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠ΅ΠΌ i, ΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π»Π΅Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ»Π΅Π²Π° ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ i, ΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΏΡΠ°Π²Π°, Π½ΠΎ ΠΈΡΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ Ρ ΡΠ°Π½Π³ΠΎΠΌ i - leftSize.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π΄Π°Π»Π΅Π΅ ΠΊΠΎΠ΄ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ.
public int partition(int[] array, int left, int right, int pivot) {
while (true) {
while (left <= right && array[left] <= pivot) {
left++;
}
while (left <= right && array[right] > pivot) {
right--;
}
if (left > right) {
return left - 1;
}
swap(array, left, right);
}
}
public int rank(int[] array, int left, int right, int rank) {
int pivot = array[randomIntInRange(left, right)];
/* Π Π°Π·Π΄Π΅Π» ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΊΠΎΠ½ΡΠ° Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° */
int leftEnd = partition(array, left, right, pivot);
int leftSize = leftEnd - left + 1;
if (leftSize == rank + 1) {
return max(array, left, leftEnd);
} else if (rank < leftSize) {
return rank(array, left, leftEnd, rank);
} else {
return rank(array, leftEnd + 1, right, rank - leftSize);
}
}
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Π½ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ i-ΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈΡΡ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΈ Π½Π°ΠΉΡΠΈ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π½Ρ ΡΡΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ.
ΠΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΡΡ (Π²ΡΡΠ΄ Π»ΠΈ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Β«ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌΠΈΒ»), ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π³ΠΊΠ° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π» ΡΡΠΎΠΌΡ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ΠΌΡ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡΠΈΠΉ, ΡΡΠΎ ΠΌΡ Π½Π°ΠΉΠ΄Π΅ΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ i-ΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Β«ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΠΈΒ» ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ° Π·Π°Π΄Π°ΡΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. ΠΡΠ»ΠΈ Π²Π°Ρ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»Π° ΡΡΠ° ΡΠ΅ΠΌΠ°, ΡΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΊΠ½ΠΈΠ³Π΅ Π’. ΠΠΎΡΠΌΠ΅Π½, Π§. ΠΠ΅ΠΉΠ·Π΅Ρ-ΡΠΎΠ½, Π . Π ΠΈΠ²Π΅ΡΡΠΏ, Π. Π¨ΡΠ°ΠΉΠ½ Β«CLRSβ Introduction to AlgorithmsΒ» (Π΅ΡΡΡ Π² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅).
ΠΠΈΡΠΈΡΠ΅ ΡΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
π
2 ΠΌΠΈΠ½ΡΡΡ
5Β ΠΎΠΊΡΡΠ±ΡΡΒ 2023