Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 048de6b

Browse files
add interpolation search
1 parent 89d5f7e commit 048de6b

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

‎README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616
* Binary search (Бинарный поиск): [example](https://github.com/dreddsa5dies/algorithm/tree/master/binarySearch)
1717
* Breadth-first search, BFS (Поиск в ширину (англ. breadth-first search, BFS) — метод обхода графа и поиска пути в графе): [example](https://github.com/dreddsa5dies/algorithm/tree/master/BFS)
1818
* Linear search (Линейный, последовательный поиск): [example](https://github.com/dreddsa5dies/algorithm/tree/master/linearSearch)
19+
* Interpolation search (Интерполяционный, интерполирующий поиск): : [example](https://github.com/dreddsa5dies/algorithm/tree/master/interpolationSearch)
20+
1921
### ADT:
2022
* Stack (абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO): [example](https://github.com/dreddsa5dies/algorithm/tree/master/stack)
2123
* Queue (абстрактный тип данных, представляющий собой список элементов, организованных по принципу FIFO): [example](https://github.com/dreddsa5dies/algorithm/tree/master/queue)
2224
* binary search tree, BST (Двоичное дерево поиска): [example](https://github.com/dreddsa5dies/algorithm/tree/master/BST)
2325
* HEAP (Ку́ча - динамически распределяемая память приложения): [example](https://golang.org/pkg/container/heap/)
2426
* Doubly linked list (Двунаправленный список): [example](https://golang.org/pkg/container/list/)
2527
* Circular lists (Круговой связанный список): : [example](https://golang.org/pkg/container/ring/)
28+
2629
## The code contains comments in Russian
2730

2831
## License

‎interpolationSearch/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Интерполяционный поиск (интерполирующий поиск) основан на принципе поиска в телефонной книге или, например, в словаре. Вместо сравнения каждого элемента с искомым, как при линейном поиске, данный алгоритм производит предсказание местонахождения элемента: поиск происходит подобно двоичному поиску, но вместо деления области поиска на две части, интерполирующий поиск производит оценку новой области поиска по расстоянию между ключом и текущим значением элемента. Другими словами, бинарный поиск учитывает лишь знак разности между ключом и текущим значением, а интерполирующий ещё учитывает и модуль этой разности и по данному значению производит предсказание позиции следующего элемента для проверки. В среднем интерполирующий поиск производит log(log(N)) операций, где N есть число элементов, среди которых производится поиск. Число необходимых операций зависит от равномерности распределения значений среди элементов. В плохом случае (например, когда значения элементов экспоненциально возрастают) интерполяционный поиск может потребовать до O(N) операций.

‎interpolationSearch/interSearch.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"sort"
8+
9+
"github.com/dreddsa5dies/algorithm/util"
10+
)
11+
12+
func main() {
13+
s1 := util.RandomInt() // срез int
14+
sort.Ints(s1)
15+
fmt.Printf("Sorted list:\t%v\n", s1)
16+
a := util.Integer("Inter number")
17+
interSearch(s1, a)
18+
}
19+
20+
func interSearch(sortedArray []int, toFind int) {
21+
var mid int
22+
low := 0
23+
high := len(sortedArray) - 1
24+
25+
for sortedArray[low] < toFind && sortedArray[high] > toFind {
26+
mid = low + ((toFind-sortedArray[low])*(high-low))/(sortedArray[high]-sortedArray[low])
27+
28+
if sortedArray[mid] < toFind {
29+
low = mid + 1
30+
} else if sortedArray[mid] > toFind {
31+
high = mid - 1
32+
} else {
33+
fmt.Println("Found: ", mid)
34+
os.Exit(0)
35+
}
36+
}
37+
38+
if sortedArray[low] == toFind {
39+
fmt.Println("Found: ", low)
40+
os.Exit(0)
41+
} else if sortedArray[high] == toFind {
42+
fmt.Println("Found: ", high)
43+
os.Exit(0)
44+
} else {
45+
fmt.Println("Not found")
46+
}
47+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /