Можно ли оптимизировать этот код? - PullRequest
1 голос
/ 08 января 2009

Меня интересует скорость, а не красивый код, поэтому я использую массив, а не список (целого числа).

У меня есть массив, похожий на: 0,1,0,1,1,0,1,0,1,1,1,0,0,1

Меня интересует положение каждого числа, поэтому я могу потом выбрать случайное.

Итак, я делаю цикл по массиву, чтобы получить номер позиции каждого 1, а затем создаю новый массив, похожий на этот: 2,4,5,7,9,10,11,14

это может быть побитовое здесь? Понятия не имею

код выглядит так:

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

* РЕДАКТИРОВАТЬ *

текущее решение (на 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

Я не думаю, что его можно оптимизировать больше, если только кто-то не найдет способ сделать именно то, что делает решение, но гораздо быстрее

До этого вопроса я мог делать около 25500 пробежек каждые 10 секунд.

Теперь он может работать более 32250 раз, увеличение на 21%, спасибо!

Ответы [ 11 ]

0 голосов
/ 08 января 2009

Скорость за сколько предметов?

Менять предметы?

Время компиляции или время выполнения?

С какими ограничениями пространства?

Известная стратегия - собрать несколько из них и записать все комбинации и их результаты: 0000 -> 0001 -> 4 0010 -> 3 0011 -> 3,4 0100 -> 2 0101 -> 2,4 0110 -> 2,3 ...

Почему вы хотите преобразовать это двоичное представление, чтобы выбрать случайный бит? Это вряд ли поможет с производительностью. Лучше сгруппируйте их по 8 битам, используйте таблицу, сообщающую, сколько единиц в группе, и повторите 5 раз. тогда вы знаете, сколько их. сделайте случайный выбор, а затем найдите выбранный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...