是否可以优化该代码?

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%,谢谢!

nic*_*ckf 8

而不是存储整数数组,为什么不将它们全部放入一个整数?

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问题:
什么是按位运算符?
你如何设置,清除和切换一个位?