代码之家  ›  专栏  ›  技术社区  ›  SSpoke

如何使用映射文件vb.net按字典顺序排列数组

  •  -1
  • SSpoke  · 技术社区  · 6 年前

    这对我来说有点复杂

        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


    我前面的问题之所以有效,是因为这里的数据始终是静态的,我尝试将所有数据移动到各个地方,这可能就是它被卡住的原因,我无法找到解决方法。。我需要移动所有数据以节省以后的cpu时间,这就是为什么我没有从下面的页面中选择答案。

    How to order array in lexicographical order 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 回复  |  直到 6 年前
        1
  •  1
  •   user3435580    6 年前

    我不知道这是否正确,但我帮你修好了。

    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
    
    推荐文章