Ruby 将两个数组交叉合并分享

zhq_zhq · 2015年05月21日 · 最后由 zhq_zhq 回复于 2015年05月22日 · 4243 次阅读

如何将两个数组交叉合并?如果是我的话,一般情况下,就会想到把一个数组中的元素迭代插入到另外一个数组,往往会忽略到数组扩容问题!造成性能上面的问题! 另外一种方法:新建一个长度是两个数组之和的新数组,并按照余数把两个数组插入新创数组,恰恰正好解决了这个问题。

利用数组 insert 方法把一个数组中的元素迭代插入到另外一个数组 方法一:

def test_one
    a = [1,3,5]
    b = [2,4,6]
    b.each_with_index do |i,index|
        a.insert(2*index+1,i)
    end
    a
end

新建一个长度是两个数组之和的新数组,并按照余数把两个数组插入新创数组 方法二:

def test_two(c)
    a = [1,3,5]
    b = [2,4,6]
    c.each_with_index do |i,index|
        c[index] = index % 2 == 0 ? a[index/2] : b[index/2]
    end
end

测试两个方法的效率如下: 测试方法一:

def test_time
    start = Time.now
    1000000.times {  test_one }
    Time.now - start
end

测试方法二:

def test_time
    start = Time.now
            c = Array.new(6)
    1000000.times {  test_two(c) }
    Time.now - start
end

具体耗时如何,请自己动手试试!

a.zip(b).flatten

需要性能可以写个 C extension...

@luikore a.zip(b).flatten 虽然写法简便了许多但是仍然没有跨过数组扩容问题

其实结果就是=====》你的想当然优化版更慢。

@hhuai 经验是需要慢慢累积的,说句不好听的话,当暂时想不到很好的解决方式时,暂时使用想当然的方法也不至于项目的整体进程,至于问题还是需要提出来,大家讨论的

这不是经验,只是你不想自己测,我就告诉你结果。

zip 就可以,为什么想那么复杂?

@jcd zip 仅仅是实现效果,在实际项目中用处不大

需要 登录 后方可回复, 如果你还没有账号请 注册新账号