Найти Ρ‚Π΅ΠΌΡƒ
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 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹