赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
本帖最后由 紫苏 于 2009-7-13 23:40 编辑
弱弱的问下21L...
^=是什么意思,找了下米找到...
交换位置的方法总觉得有些怪怪的...偶还是觉得直接用hash最方便...
新月の道化师 发表于 2009-7-13 15:09
自异或运算,这是最高效的交换两个整数的方法~
两次异或相同的数后会得到原数,所以可以用来交换两个变量的值
浮点的话,则是用 +- 交换的方法~
想了下子,偶觉得交换似乎是牺牲了时间复杂度换取空间复杂度的感觉,感觉还是从数组或者hash中抽取效率要高些...个人感觉>_<
新月の道化师 发表于 2009-7-13 15:09
怎么会呢,从数组中抽取不也占用了一个数组嘛~最后得到的数也是需要空间占用的
而且就算换也是换了时间复杂度……
用了星子的那段代码,比较两个方法执行的时间,运算量大的时候就可以看出差别了:- def genRandom1(n)
- arr = Array.new(n)
- for i in 0...arr.size
- arr[i] = i
- end
- i = n - 1
- begin
- r = rand(i)
- arr[i] ^= arr[r]
- arr[r] ^= arr[i]
- arr[i] ^= arr[r]
- end until (i -= 1) < 1
- return arr
- end
- def genRandom2(n)
- array = (0...n).to_a
- result = []
- n.times{result.push(array.delete_at(rand(array.size)))}
- return result
- end
- a = Time.now
- genRandom1(60000)
- p Time.now - a
- a = Time.now
- genRandom2(60000)
- p Time.now - a
复制代码 动态数组也是线性数据结构,底层还是静态的顺序数组,当数组需要插入/删除元素时,就会有一个线性的批量元素替换,比如插入时从插入点往后的元素依次后移,删除时则是依次往前移~ |
|