golang实现binarySearch
Posted gpan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang实现binarySearch相关的知识,希望对你有一定的参考价值。
二分查找法
golang收获
- 获取随机数, 先设置一个随机时间 rand.Seed(time.Now()).UnixNano()), 然后执行rand.Intn(2<<16)可以获得随机数;
- 递归的实现,针对二分查找过程应该数 (](]的区间,中间一个数<=, 然后是 <
算法执行过程
通过一个数组,对里面的内容进行二分查找,数组的大小有2^16,里面为有序的整数;
arr [2 << 16]int
实现一个二分查找,看看返回是否则返回该值, 两种方法都实现,
- 一种是for循环,暴力比较;
- 一种是二分查找
暴力查询的时间约为 215.193μs, 二分查找的平均值为 500ns; 两者差了400倍的速度;
package main
import (
"fmt"
"math/rand"
"time"
)
const NUM = 100000
func main() {
fmt.Println("hello binary search")
arr := NewArr()
rand.Seed(time.Now().UnixNano())
t := time.Now()
for i := 0; i < NUM; i++ {
num := rand.Intn(2<<16 - 1)
// _ = FindV(arr, num)
_ = FindV2(arr, num, 0, 2<<16-1)
}
tt := time.Now().Sub(t) / NUM
fmt.Println(tt)
}
func FindV(arr *[2 << 16]int, v int) int {
for i := 0; i < len(arr); i++ {
if arr[i] == v {
return i
}
}
return 0
}
func FindV2(arr *[2 << 16]int, v int, l int, h int) int {
if l > h {
return -1
}
mid := l + (h-l)/2
if v == arr[mid] {
return arr[mid]
} else if v <= arr[mid] {
FindV2(arr, v, l, arr[mid])
} else {
FindV2(arr, v, arr[mid], h)
}
return 0
}
// 如何返回一个数组指针
func NewArr() *[2 << 16]int {
arr := [2 << 16]int{}
// return &arr
for i := 0; i < 2<<16; i++ {
arr[i] = i
}
return &arr
}
以上是关于golang实现binarySearch的主要内容,如果未能解决你的问题,请参考以下文章
golang goroutine例子[golang并发代码片段]