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
}

转载于:https://www.cnblogs.com/gpan/p/9911866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值