Fre*_*dou 1 .net vb.net algorithm
我对速度感兴趣,而不是好看的代码,这就是为什么我使用数组而不是列表(整数).
我有一个数组看起来像:0,1,0,1,1,0,1,0,1,1,1,0,0,1
我对每个数字的位置感兴趣,所以我可以随后随机选择一个.
所以我所做的是循环遍历数组以获取每个1的位置编号,然后创建一个如下所示的新数组:2,4,5,7,9,10,11,14
在这里可以使用bitwise吗?我不知道
代码看起来像:
Private Function theThing() As Integer()
Dim x As Integer
'arIn() would be a parameter
Dim arIn() As Integer = {0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1}
Dim ar() As Integer = Nothing
Dim arCount As Integer = -1
For x = 1 To arIn.GetUpperBound(0)
If arIn(x) = 1 Then
arCount += 1
End If
Next
If arCount > -1 Then
'using redim preseve is slower than the loop above
ReDim ar(arCount)
arCount = 0
For x = 1 To arIn.GetUpperBound(0)
If arIn(x) = 1 Then
ar(arCount) = x
arCount += 1
End If
Next
End If
Return ar
End Function
Run Code Online (Sandbox Code Playgroud)
*编辑*
现在的解决方案(速度提高10%到15%)
Private Function theThing() As Integer
Dim ar() As Integer = {0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1}
Dim arLenght As Integer = ar.GetUpperBound(0)
Dim arCount As Integer = 0
Dim x As Integer
For x = 1 To arLenght
If ar(x) = 1 Then
ar(arCount) = x
arCount += 1
End If
Next
dim r As New Random()
Return ar(r.Next(arCount))
End Function
Run Code Online (Sandbox Code Playgroud)
我不认为它可以比这更优化,除非有人找到一种方法来完成解决方案所做的事情,但速度更快
在这个问题之前,我的整个事情能够做到每10秒钟运行25500次.
现在,它可以一直超过32250,增加21%,谢谢!
而不是存储整数数组,为什么不将它们全部放入一个整数?
oldArray = [0, 1, 1, 0, 1]
newValue = 22 (binary 10110)
Run Code Online (Sandbox Code Playgroud)
如果要检查是否设置了特定的位位置,请按两位与该位置的幂进行逐位比较:
is position 2 set?
value: 10110
4 (2^2): 00100
result: 00100 --> true
is position 0 set?
value: 10110
1 (2^0): 00001
result: 00000 --> false
Run Code Online (Sandbox Code Playgroud)
搜索按位比较,你应该找到很多帮助.
以下是一些可能有用的Stack Overflow问题:
什么是按位运算符?
你如何设置,清除和切换一个位?
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |