golang实现binarySearch

Posted gpan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang实现binarySearch相关的知识,希望对你有一定的参考价值。

二分查找法

golang收获

  1. 获取随机数, 先设置一个随机时间 rand.Seed(time.Now()).UnixNano()), 然后执行rand.Intn(2<<16)可以获得随机数;
  2. 递归的实现,针对二分查找过程应该数 (](]的区间,中间一个数<=, 然后是 <

算法执行过程

通过一个数组,对里面的内容进行二分查找,数组的大小有2^16,里面为有序的整数;

arr [2 << 16]int

实现一个二分查找,看看返回是否则返回该值, 两种方法都实现,

  1. 一种是for循环,暴力比较;
  2. 一种是二分查找

暴力查询的时间约为 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 实现集合操作

golang代码片段(摘抄)

golang goroutine例子[golang并发代码片段]

json [Golang] golang #golang #snippets中有用的片段

java golang oop 2文章片段

golang 去练习片段