Как заказать массив в лексикографическом порядке с отображенным файлом vb.net - PullRequest
0 голосов
/ 07 декабря 2018

Это довольно сложно для меня, чтобы понять

    Dim test() As Byte = New Byte() {50, 40, 30, 10, 10}
    Dim answer() As UInteger = SortLexicoGraphicallyArrayMappedFile(test)

Ответ - каждое вращение, отсортированное от наименьшего значения массива к наибольшему значению массива.

Rotation 0 = 50, 40, 30, 10, 10
Rotation 1 = 10, 50, 40, 30, 10
Rotation 2 = 10, 10, 50, 40, 30
Rotation 3 = 30, 10, 10, 50, 40
Rotation 4 = 40, 30, 10, 10, 50

Когда я сортирую этот массиввыше, я должен получить

Rotation 2 = 10, 10, 50, 40, 30
Rotation 1 = 10, 50, 40, 30, 10
Rotation 3 = 30, 10, 10, 50, 40
Rotation 4 = 40, 30, 10, 10, 50
Rotation 0 = 50, 40, 30, 10, 10

Таким образом, ответ должен быть 2, 1, 3, 4, 0

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

Как заказать массив в лексикографическом порядке vb.net

Вот мой код

Public Function GetRotation(Data As Byte(), rotation As UInteger) As Byte()
   'Rotation Left
    Dim rotationData As New List(Of Byte)

    Dim start As UInteger = Data.Length - rotation Mod Data.Length

    For i = 0 To Data.Length - 1
        rotationData.Add(Data((start + i) Mod (Data.Length)))
    Next

    Return rotationData.ToArray()
End Function

   Public Function SortLexicoGraphicallyArrayMappedFile(ByRef data As Byte()) As UInteger()
        Dim OrderedRotations As New List(Of UInteger)
        Dim rotatedData As Byte()
        Dim rotation As UInteger = 0


        Dim mmF As MemoryMappedFile
        mmF = MemoryMappedFile.CreateFromFile(My.Application.Info.DirectoryPath & "\outFile", FileMode.CreateNew, "test", CLng(data.LongLength * data.LongLength))
        Dim mmVA As MemoryMappedViewAccessor
        mmVA = mmF.CreateViewAccessor(0, data.LongLength * data.LongLength)

        Dim pos As Long = 0

        For rotation = 0 To data.Length - 1
            rotatedData = GetRotation(data, rotation)
            mmVA.WriteArray(Of Byte)(pos, rotatedData, 0, rotatedData.Length)
            pos += rotatedData.Length

        Next

        For rotation = 0 To data.Length - 1
            OrderedRotations.Add(rotation)
        Next

        Dim eachRotation As Integer = 0
        Dim data1() As Byte
        ReDim data1(data.Length - 1)
        Dim data2() As Byte
        ReDim data2(data.Length - 1)
        Dim index As Long
        For rotation = 0 To data.Length - 1
            Dim flag As Boolean
            Do
                flag = False
                For eachRotation = OrderedRotations.Count - 1 To 0 Step -1
                    mmVA.ReadArray(Of Byte)((OrderedRotations(rotation) * data.Length), data1, 0, data.Length)
                    If OrderedRotations(eachRotation) = OrderedRotations(rotation) Then Continue For
                    mmVA.ReadArray(Of Byte)((OrderedRotations(eachRotation) * data.Length), data2, 0, data.Length)

                    For index = 0 To data.Length - 1
                        If data1(index) > data2(index) Then
                            Exit For
                        ElseIf data1(index) < data2(index) Then
                            mmVA.WriteArray(Of Byte)((OrderedRotations(eachRotation) * data.Length), data1, 0, data1.Length)
                            mmVA.WriteArray(Of Byte)((OrderedRotations(rotation) * data.Length), data2, 0, data2.Length)

                            Dim tmpFirst As UInteger = OrderedRotations(rotation)
                            OrderedRotations(rotation) = OrderedRotations(eachRotation)
                            OrderedRotations(eachRotation) = tmpFirst
                            flag = True
                            Exit For
                        End If
                    Next
                Next
            Loop While flag
        Next

        Return OrderedRotations.ToArray()
    End Function

1 Ответ

0 голосов
/ 10 декабря 2018

Не знаю, правильно ли это, но я исправил это для вас.

Public Function SortLexicoGraphicallyArrayMappedFile(ByRef data As Byte()) As UInteger()
    Dim OrderedRotations As New List(Of UInteger)
    Dim rotatedData As Byte()
    Dim rotation As UInteger = 0


    Dim mmF As MemoryMappedFile
    mmF = MemoryMappedFile.CreateFromFile(My.Application.Info.DirectoryPath & "\outFile296", FileMode.CreateNew, "test", CLng(data.LongLength * data.LongLength))
    Dim mmVA As MemoryMappedViewAccessor
    mmVA = mmF.CreateViewAccessor(0, data.LongLength * data.LongLength)

    Dim pos As Long = 0

    For rotation = 0 To data.Length - 1
        rotatedData = GetRotation(data, rotation)
        mmVA.WriteArray(Of Byte)(pos, rotatedData, 0, rotatedData.Length)
        pos += rotatedData.Length

    Next

    For rotation = 0 To data.Length - 1
        OrderedRotations.Add(rotation)
    Next

    Dim eachRotation As Integer = 0
    Dim data1() As Byte
    ReDim data1(data.Length - 1)
    Dim data2() As Byte
    ReDim data2(data.Length - 1)
    Dim index As Long
    For rotation = 0 To data.Length - 1
        Dim flag As Boolean
        Do
            flag = False
            For eachRotation = OrderedRotations.Count - 1 To 0 Step -1
                If rotation = eachRotation Then Exit For
                mmVA.ReadArray(Of Byte)(rotation * data.Length, data1, 0, data.Length)
                mmVA.ReadArray(Of Byte)((eachRotation * data.Length), data2, 0, data.Length)

                For index = 0 To data.Length - 1
                    If data1(index) < data2(index) Then
                        Exit For
                    ElseIf data1(index) > data2(index) Then
                        mmVA.WriteArray(Of Byte)((eachRotation * data.Length), data1, 0, data1.Length)
                        mmVA.WriteArray(Of Byte)((rotation * data.Length), data2, 0, data2.Length)

                        Dim tmpFirst As UInteger = OrderedRotations(eachRotation)
                        OrderedRotations(eachRotation) = OrderedRotations(rotation)
                        OrderedRotations(rotation) = tmpFirst
                        flag = True
                        Exit For
                    End If
                Next
            Next
        Loop While flag
    Next

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