加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 我怎样逐渐使数组更稀疏?

发布时间:2020-12-13 17:19:32 所属栏目:PHP教程 来源:网络整理
导读:我有一个完全填充的值数组,我想随意删除此数组中的元素,更多地移除到远端. 例如,给定输入(其中a.表示填充的索引) ............................................ 我想要的东西 ....... . ... .. . . .. . . 我的第一个想法是计算元素,然后遍历数组,在当前索
我有一个完全填充的值数组,我想随意删除此数组中的元素,更多地移除到远端.

例如,给定输入(其中a.表示填充的索引)

............................................

我想要的东西

....... . ...  .. .  .  ..    .          .

我的第一个想法是计算元素,然后遍历数组,在当前索引和数组的总大小之间产生一个随机数,例如:

if ( mt_rand( 0,$total ) > $total - $current_index ) 
    //remove this element

然而,因为这需要在循环每次循环时产生一个随机数,所以它变得非常艰巨.

有没有更好的方法呢?

解决方法

一种简单的方法是为每个条目翻转加权硬币,硬币翻转更加加权.例如,如果数组的大小为n,则对于每个条目,您可以选择0到n-1之间的随机数,并且只有在索引小于或等于随机数时才保留该值. (也就是说,保持每个条目的概率为1 – 索引/总数.)这有一个很好的优势,如果你打算压缩你的数组,你正在使用一个足够好但有效的随机数发生器(可能是对nonce进行简单的整数哈希),内存访问速度会相当快.

另一方面,如果您只是消除了一些项目并且没有重新排列数组,那么您可以使用某种加权随机数生成器,它通常会选择朝向索引末尾的数字.例如,如果你有一个随机数生成器,它生成值为[0,1]的浮点数(闭合或开放边界无关紧要),可以考虑获得这样一个随机浮点数并对其进行平方.这往往更喜欢较低的价值.你可以通过翻转来解决这个问题:1-r ^ 2.当然,你需要将它放在0到n – 1的索引范围内,所以取底线(n *(1 – r ^ 2))并将n向下舍入到n-1.

这两种技术实际上存在无限多种变化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读