分享
  1. 首页
  2. 文章

通过协程查找数组中元素

追风骚年 · · 874 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

给定一个无序数组,求某个数值是否存在数组当中。

正常需要先排序,再二分去做的,不过由于 golang 中是可以很方便就可以起多个协程,所以测试下,多个协程分别查找各自的一段,如果查到就通知其他协程停止查找,当然为了完整性,在程序执行 5 秒,还未找到则停止查找。

package main
import (
 "context"
 "fmt"
 "math"
 "math/rand"
 "time"
)
func generate(size int) []int {
 return rand.Perm(size)
}
func generateTarget(size int) int {
 rand.Seed(time.Now().Unix())
 return int(rand.Int31n(int32(size)))
}
func main() {
 size := math.MaxInt32 / 1000
 arr := generate(size)
 target := generateTarget(size)
 n := len(arr)
 routineCount := 10 // 开 routineCount 个 goroutine
 sp := n / routineCount // 将数组切割成每份 sp 个
 ctx, cancel := context.WithCancel(context.Background()) // 利用 context 的特性
 ch := make(chan int) // 找到结果的通知 chan
 fmt.Println("开始查找")
 for i := 0; i < routineCount; i++ {
 go func(i int, ctx context.Context) {
 curArr := arr[i*sp : (i+1)*sp] // 每次切割一部分
 for _, v := range curArr {
 select {
 case <-ctx.Done(): // 如果通知结束,则终止
 return
 default: // 其他情况直接去比较
 }
 if v == target {
 ch <- target // 找到了将消息发送出来
 }
 }
 }(i, ctx)
 }
 fmt.Println("target", target) // 需要找的 targe
 select {
 case t := <-ch:
 fmt.Println("找到了", t)
 cancel() // 找到了,结束所有子 goroutine
 case <-time.After(5 * time.Second): // 有个倒计时
 fmt.Println("未找到")
 }
}

测试了下速度,确实很快


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:追风骚年

查看原文:通过协程查找数组中元素

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
874 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏