Найти Ρ‚Π΅ΠΌΡƒ
10,2 тыс подписчиков

πŸ–₯ Π—Π°Π΄Π°Ρ‡Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ интСрполяционного поиска


Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ поиск β€” это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ «раздСляй ΠΈ властвуй», Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌΡƒ поиску. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска, ΠΎΠ½ Π½Π΅ всСгда Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ поиск с сСрСдины. Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ поиск вычисляСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ искомого элСмСнта ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

index = low + [(val-lys[low])*(high-low) / (lys[high]-lys[low])]
Π’ этой Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

lys β€” наш Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив.
val β€” искомый элСмСнт.
index β€” вСроятный индСкс искомого элСмСнта. Он вычисляСтся ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ высокоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val Π±Π»ΠΈΠΆΠ΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊ элСмСнту Π² ΠΊΠΎΠ½Ρ†Π΅ массива (lys[high]), ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ΅, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val Π±Π»ΠΈΠΆΠ΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊ элСмСнту Π² Π½Π°Ρ‡Π°Π»Π΅ массива (lys[low]).
low β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс массива.
high β€” послСдний индСкс массива.
Алгоритм осущСствляСт поиск ΠΏΡƒΡ‚Π΅ΠΌ вычислСния значСния индСкса:

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ (ΠΊΠΎΠ³Π΄Π° lys[index] == val), возвращаСтся индСкс.
Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val мСньшС lys[index], Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса пСрСсчитываСтся ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ для Π»Π΅Π²ΠΎΠ³ΠΎ подмассива.
Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val большС lys[index], Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса пСрСсчитываСтся ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ для ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ подмассива.

РСшСниС:

def InterpolationSearch(lys, val):
low = 0
high = (len(lys) - 1)
while low <= high and val >= lys[low] and val <= lys[high]:
index = low + int(((float(high - low) / ( lys[high] - lys[low])) * ( val - lys[low])))
if lys[index] == val:
return index
if lys[index] < val:
low = index + 1;
else:
high = index - 1;
return -1
Если ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для вычислСния:

>>> print(InterpolationSearch([1,2,3,4,5,6,7,8], 6))
Наши Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ:

val = 6,

low = 0,

high = 7,

lys[low] = 1,

lys[high] = 8,

index = 0 + [(6-1)*(7-0)/(8-1)] = 5

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ lys[5] Ρ€Π°Π²Π½ΠΎ 6, Ρ‡Ρ‚ΠΎ являСтся искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΌΡ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

5

Если Ρƒ нас большоС количСство элСмСнтов ΠΈ наш индСкс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСн Π·Π° ΠΎΠ΄Π½Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса послС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ high ΠΈ low.

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ интСрполяционного поиска Ρ€Π°Π²Π½Π° O(log log n), ΠΊΠΎΠ³Π΄Π° значСния распрСдСлСны Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ. Если значСния распрСдСлСны Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ, врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ случая Ρ€Π°Π²Π½Π° O(n) β€” Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ поиска.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ поиск Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСлСнных, отсортированных массивах. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ поиск с сСрСдины ΠΈ всСгда Π΄Π΅Π»ΠΈΡ‚ массив Π½Π° Π΄Π²Π΅ части, интСрполяционный поиск вычисляСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ элСмСнта ΠΈ провСряСт индСкс, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ нахоТдСния элСмСнта Π·Π° мСньшСС количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ.

πŸ‘‰ ΠŸΠΈΡˆΠΈΡ‚Π΅ вашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡΡ…πŸ‘‡

2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹
119 Ρ‡ΠΈΡ‚Π°Π»ΠΈ