码迷,mamicode.com
首页 > 其他好文 > 详细

golang实现binarySearch

时间:2018-11-05 22:26:10      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:查询   port   二分查找   方法   如何   查找   amp   个数   for   

二分查找法

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

标签:查询   port   二分查找   方法   如何   查找   amp   个数   for   

原文地址:https://www.cnblogs.com/gpan/p/9911866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!