分享
  1. 首页
  2. 文章

go高效洗牌算法

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

我们团队全面采用golang,语法简单,开发效率高,运行效率也高,用gin可以很轻松撑起高并发。强烈推荐大家学习和使用它,国内越来越多的公司转go----php转go,python转go甚至是java转go----成为很多企业的选择。比如头条,知乎,B站,360等都在核心系统中使用go。

正好有一个小需求,需要将一个切片里的数据随机打散重排。我搜了下,发现一个最高效最简单的办法--使用go自带的rand.Perm()函数

先看源代码:

package main

import (
"fmt"
"math/rand"
)

type Articlestruct {
Titlestring
Authorstring
}

var articles =[]Article{{Title:"Study golang",Author:"yuanfang"},{Title:"Effective golang",Author:"yuanfang"},{Title:"Effective python",Author:"yuanfang"}}

func main() {
newArticles :=[3]Article{}
l := rand.Perm(3)
for i:=0;i<3;i++ {
newArticles[i]=articles[l[i]]
}
fmt.Println(l)
fmt.Println(newArticles) }
}

先构造一个有3个元素的Article切片,然后用rand.Perm(3)生成0-2的随机排序数组,然后构造一个新的Article切片,新切片按顺序用随机数组里的下标从老切片取数据,这样就完成了随机重排。

那rand.Perm的实现算法是什么呢?

这是采用随机交换的算法,随着i从0到n循环,先生成随机数j := r.Intn(i +1),然后交换m[i] = m[j],m[j] = i,每次将数组里的随机位置与当前最大值(i)进行交换(原来的值放入最后)。这个时间复杂度是O(n),是很快的算法。

func Perm(nint) []int {return globalRand.Perm(n) }

func (r *Rand)Perm(nint) []int {

m :=make([]int, n)

for i :=0; i < n; i++ {

m[i] = m[j]

m[j] = i

}

return m
}

我现在每天也拿出至少2个小时写代码,看家的本事还是不能丢的。后面要学习推荐算法并实践,也欢迎大家一起交流。


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

本文来自:简书

感谢作者:

查看原文:go高效洗牌算法

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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