`
Hooopo
  • 浏览: 335996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shuffle in Array

    博客分类:
  • Ruby
阅读更多

# Timing different way to shuffle an array in ruby

class Array

  # The ruby way of swapping two variable values

  def swap!(a,b)
    self[a], self[b] = self[b], self[a]
  end


  # the "assembler" way of swapping two variable
values

 
def swap_with_int_var!(a,b)
    c = self[a]
    self[a] = self[b]
    self[b] = c
  end


  # Shuffling arrays is usually done by iterating through the
indices, and swapping
  # each value with a value at a random position

  # shuffling based on push/delete

 
def shuffle!
    size.downto(1) { |n| push delete_at(rand(n)) }
    self
  end


  # shuffling with the ruby way of swapping

 
def shuffle_II
    (size-1).downto(1) { |n| swap!(n, rand(size)) }
    self
  end


  # shuffling with the "assembler" way of swapping

 
def shuffle_III
    (size-1).downto(1) { |n| swap_with_int_var!(n, rand(size)) }
    self
  end



 
def shuffle_IV
    sort_by { rand }
  end

                                                           
 
def shuffle_V
    (length - 1).downto 1 do |slot|
      source = rand(slot + 1)
      self[slot], self[source] = self[source], self[slot]
    end
    self
  end
end



def time_shuffle_method(size)
  a = (0..size).to_a

  start_time = Time.new
  3000.times { yield a }
  end_time = Time.new

  return end_time - start_time
end


# To inspect shuffling methods, invoke with argument "test"
and optionally, size

if (ARGV[0] == 'test')                                      
  size =  ARGV[1] ? ARGV[1].to_i : 5
  puts (0..size).to_a.shuffle!
  puts '--'
  puts (0..size).to_a.shuffle_II
  puts '--'
  puts (0..size).to_a.shuffle_III
  puts '--'
  puts (0..size).to_a.shuffle_IV
  puts '--'
  puts (0..size).to_a.shuffle_V

  exit
end


shuffle_time = time_shuffle_method(500) { |a| a.shuffle! }
puts "Time elapsed for shuffle!    : #{shuffle_time}"

shuffle_time_II = time_shuffle_method(500) { |a| a.shuffle_II }
puts "Time elapsed for shuffle_II  :
#{shuffle_time_II}"

shuffle_time_III = time_shuffle_method(500) { |a| a.shuffle_III
}
puts "Time elapsed for shuffle_III : #{shuffle_time_III}"

shuffle_time_IV = time_shuffle_method(500) { |a| a.shuffle_IV }
puts "Time elapsed for shuffle_IV  :
#{shuffle_time_IV}"

shuffle_time_V  = time_shuffle_method(500) { |a| a.shuffle_V  }
puts "Time elapsed for shuffle_V   : #{shuffle_time_V
}"

=begin

  Here are results from running on my machine

  Conclusion: fancy ruby manipulations take their time
  Stick with the "ordinary" shuffle implementation
( shuffle_III )

stephan@[~/ruby/steam]: ruby /tmp/shuffle_timer
Time elapsed for shuffle!    : 4.352824
Time elapsed for shuffle_II  : 6.03016
Time elapsed for shuffle_III : 3.088946
Time elapsed for shuffle_IV  : 3.890105
Time elapsed for shuffle_V   : 6.351477
stephan@[~/ruby/steam]: ruby /tmp/shuffle_timer
Time elapsed for shuffle!    : 4.382251
Time elapsed for shuffle_II  : 6.046666                     
Time elapsed for shuffle_III : 3.220461
Time elapsed for shuffle_IV  : 4.00079
Time elapsed for shuffle_V   : 6.292253

=end
分享到:
评论

相关推荐

    leetcode伪代码-shuffle_the_array:shuffle_the_array

    leetcode伪代码suffle_the_array 题目解读: 题目来源: 原文: Given the array nums consisting of 2n elements in the form [x1,x2,...,xn,y1,y2,...,yn]. Return the array in the form [x1,y1,x2,y2,...,xn,yn]. ...

    Python实现随机取一个矩阵数组的某几行

    for i in range(10): array = np.vstack((array, [i+1, i+1])) print(array) # [[ 0 0] # [ 1 1] # [ 2 2] # [ 3 3] # [ 4 4] # [ 5 5] # [ 6 6] # [ 7 7] # [ 8 8] # [ 9 9] # [10 10]] rand_arr = np.arange...

    PHP中shuffle数组值随便排序函数用法

    - `in_array()`: 检查数组中是否存在指定的值。 - `explode()`: 使用分隔符将字符串拆分为数组。 - `array_key_first()` 和 `array_key_last()`: 分别获取数组的第一个和最后一个键。 - `end()`: 将数组内部指针移动...

    随机数的编写

    与方法一类似,但这里使用了`in_array()` 函数来检查新生成的随机数是否已经存在于数组中。 **示例代码解析:** ```php $tmp = []; while (count($tmp) ) { $a = rand(1, 20); if (!in_array($a, $tmp)) { $tmp...

    lodash underscore js库速查手册

    _.map(list, iterator, [context]) Alias: collect Produces a new array of values by mapping each value in list through a transformation function ( _.reduce(list, iterator, memo, [context]) Aliases: ...

    PHP数组详解[整理].pdf

    1. 键/值操作:`array_values()`返回数组值,`array_keys()`返回键,`in_array()`检查值是否在数组中,`array_flip()`交换键和值,`array_reverse()`反转数组。 2. 统计函数:`count()`计算数组元素数量,`array_...

    leetcode伪代码-shuffle-string:随机串

    leetcode伪代码shuffle-string 题目解读: 题目来源: 原文: Given a string s and an integer array indices of the same length. The string s will be shuffled such that the character at the ith position ...

    php数组函数序列之array_values() 获取数组元素值的函数与方法

    它们与其它数组函数,如`array_unique()`、`array_key_exists()`、`array_pop()`、`in_array()`、`shuffle()`、`array_rand()`、`array_splice()`、`array_sum()`等,共同构成了PHP强大的数组处理工具集,使得处理...

    PHP array操作10个小技巧分享

    要判断数组中是否存在某个值,可以使用in_array()函数。而对于判断数组中是否存在某个键,则可以使用array_key_exists()函数。 9、数组切片操作 PHP中没有专门的函数来实现数组切片操作,但是可以通过循环和条件...

    PHP数组详解.pdf

    - `in_array()`检查元素是否存在于数组中。 - `array_flip()`交换数组的键和值。 - `array_reverse()`反转数组。 2. 统计函数: - `count()`计算数组元素个数。 - `array_count_values()`统计数组中每个值出现...

    PHP关联数组的10个操作技巧

    echo "Atlanta exists as a value in the capitals array."; } ``` 10、使用数组键访问数组值:访问关联数组中的元素非常简单,只需要通过键来获取值。例如: ```php echo $capitals['Alabama']; // 输出: ...

    484个PHP必备的函数集

    #### 概述 ...通过对这些函数的理解与掌握,可以帮助开发者更加高效地完成任务、解决问题。 #### 详细知识点解析 ##### 数组操作函数 ...1. **array_change_key_case** ... - **示例**:`$new_arr = array(1, ...

    php手册精华总结

    #### 一、Array 函数 ...以下是一些常用的数组处理函数及其...25. **in_array**:检查数组中是否存在某个值。 - 参数: - `$value`:要检查的值。 - `$array`:目标数组。 - 示例代码: ```php $array = [1, 2, ...

    php数组函数分类

    - **in_array()**: 判断一个值是否存在于数组中。 - **array_search()**: 返回数组中某个值的键名,如果值不存在,则返回 `false`。 #### 排序(Sort) 排序函数可以按不同的规则对数组进行排序。 - **sort()**: ...

    PHP数组函数.doc

    例如,`in_array('value', $array)` 检查 'value' 是否在 `$array` 中。 12. **array_key_exists**:此函数检查数组中是否存在特定的键,返回布尔值。 13. **array_search**:在数组中搜索给定的值,返回第一个...

    resnet50图片分类作业.zip

    ④ Read all the pictures in the folder, read the pictures as data, change the picture size, convert it into array, and label the pictures ⑤ Divide the training set and test set, and encode the tag ...

    PHP函数参考手册(PDF版)

    - **`in_array()`**:检查数组中是否存在某个值。 - **`key()`**:返回数组中的当前键名。 - **`krsort()`**:对数组按照键名进行逆向排序。 - **`ksort()`**:对数组按照键名进行排序。 - **`list()`**:将数组元素...

    php数组——记忆卡

    - **in_array()**:检查数组中是否存在某个值。 - **next()**:将数组的内部指针向前移动一步。 - **prev()**:将数组的内部指针向后移动一步。 - **range()**:创建一个包含指定范围的数组。 - **reset()**:将数组...

    php函数iris整理

    - **`in_array()`**: 检查数组中是否存在某个值。 - **`key()`**: 返回数组中的当前键。 - **`list()`**: 将数组元素赋值给一组变量。 - **`next()`**: 将内部指针指向数组的下一个元素。 - **`pos()`**: 返回数组中...

Global site tag (gtag.js) - Google Analytics