美文网首页
go高效洗牌算法

go高效洗牌算法

作者: 元芳hi | 来源:发表于2019-11-06 14:42 被阅读0次

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高效洗牌算法

    golang,语法简单,开发效率高,运行效率也高,用gin可以很轻松撑起高并发。强烈推荐大家学习和使用它,国内越来...

  • Golang洗牌算法,抢红包算法

    本文为转载,原文:Golang洗牌算法,抢红包算法 1. 洗牌算法 洗牌算法,即将原来的顺序打乱,组成新的随机排序...

  • 洗牌算法

    一次偶然的机会,需要我生成一个长度为len的数组。数组的内容是[0-len)。这并不难,分分钟生成这样一个数组: ...

  • 洗牌算法

    在工作中需要重写一个洗牌算法,根据网络中的资料分析了一下,已经有总结得很好的了,就直接总结转载了一下。 洗牌算法大...

  • 洗牌算法

    洗牌算法是一个比较形象的术语,本质上让一个数组内的元素随机排列。

  • 洗牌算法

    问题 实现一个最简单的洗牌算法。 分析 很多人第一次都可能会很迷惑,其实只要理解好了这个题目,实现起来相信并不难。...

  • 洗牌算法

    概述### 洗牌算法(可以归类到随即算法中),顾名思义,就是只利用一次循环等概率的取到不同的元素(牌)。 描述##...

  • 洗牌算法

    打乱一个序列 暴力方法 每次生成一个随机数,然后将对应下标的原序列数添加到新数组中。同时应该有一个memo用来记录...

  • 洗牌算法

    第一次接触洗牌算法是在一次面试上,面试官要求我写出一个算法将一个1~100的有序数组打乱,不考虑性能,那次我想了许...

  • 洗牌算法

    随机打乱一个数组的顺序。场景:验证码之类。要求生成n位不重复的数字组合(0

网友评论

      本文标题:go高效洗牌算法

      本文链接:https://www.haomeiwen.com/subject/sxdubctx.html