zoukankan      html  css  js  c++  java
  • 洗牌算法

    网站模块化项目第一期终于在加班75天后完成了。

    接下去要多看书还要多看娃

    项目需求数组随机排序

    洗牌算法

    数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):

    是一种将有限集合的顺序打乱的一种算法

    首先是一种常见的错误随机排序

    为什么是错误的排序我也是看了一篇文字

    链接:https://gold.xitu.io/entry/573164cc1ea4930064f70b01

    比较常见的用法  递归的方法来处理

    underscore.js 中的 shuffle 方法

    原理

    定义一个数组(shuffled),长度(length)是原数组(arr)长度
    取 0 到 index (初始0) 随机值 rand, shuffled[index] = shuffled[rand],

    shuffled[rand] = arr[index]
    index++ ; 重复第二步,

    直到 index = length -1
    就是 shuffled 从 0 到 length-1 的赋值过程,并且新加入的值是 arr[index],shuffled[index] 的值是已赋值的元素中随机值shuffled[rand],因为这样会有两个重复的值,所以 shuffled[rand] 就等于新加入的值 arr[index]

     第三种 使用临时变量保存  

    Knuth-Durstenfeld Shuffle

    Fisher-Yates 洗牌算法的一个变种是 Knuth Shuffle

    每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从 Fisher 算法的 O(n2)提升到了 O(n)

    1. 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
    2. 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
    3. 重复第 1 2 步,直到剩下1个元素为止
    function shuffle(arr){
        var length = arr.length,
            temp,
            random;
        while(0 != length){
            random = Math.floor(Math.random() * length)
            length--;
            // swap
            temp = arr[length];
            arr[length] = arr[random];
            arr[random] = temp;
        }
        return arr;
    }
  • 相关阅读:
    JSON 串 自定义解析字段
    JspWriter与PrintWriter的关系
    Map 根据value 排序
    Log4j NDC MDC
    stray '/241' in program 错误
    【Qt开发】修改源码文件的编码格式的小技巧 .
    Tomcat 虚拟目录映射
    《疯狂Java讲义精粹》读书笔记4 基本包装类
    《疯狂Java讲义精粹》读书笔记8 不可变类
    《疯狂Java讲义精粹》读书笔记9 接口
  • 原文地址:https://www.cnblogs.com/h5monkey/p/6289222.html
Copyright © 2011-2022 走看看