Объединить отсортированный массив в Swift - PullRequest
1 голос
/ 27 января 2020

Я пытался реализовать алгоритм сортировки массивов слияния в Swift для соревнования и столкнулся с проблемой производительности. Мое решение основано на использовании MinHeap и работает хорошо, но требует больше времени, чем требуется для конкурса (более 1 секунды). К сожалению, я не знаю фактический размер тестового ввода. Ограничения следующие: k <= 1024, количество элементов в каждом массиве должно быть меньше k * 10. </p>

Что я делаю не так? Что я могу сделать, чтобы улучшить производительность моего решения?

Мое решение:

// Reading input file
let k = Int(readLine()!)!
var input: [[UInt8]] = Array(repeating: [], count: k)
for i in 0..<k {
    input[i] = readLine()!.split(separator: " ").dropFirst().map{ UInt8($0)! }
}

// Create min heap
var heap: Heap<(indexOfArray: Int, indexWithinArray: Int)> = Heap { [input] (left, right) -> Bool in
    return input[left.indexOfArray][left.indexWithinArray] < input[right.indexOfArray][right.indexWithinArray]
}

// Fill heap with indices of min element in each array
for indexOfArray in 0..<k {
    if input[indexOfArray].isEmpty { continue }
    heap.insert((indexOfArray: indexOfArray, indexWithinArray: 0))
}

while let min = heap.peek() {
    // Print min element
    print(input[min.indexOfArray][min.indexWithinArray])

    // If it's the last element of the array, remove it from the heap
    if min.indexWithinArray + 1 == input[min.indexOfArray].endIndex {
        heap.remove()
    } else {
        // Increment the index and decrease its' priority in the heap if needed
        heap.updateTop((indexOfArray: min.indexOfArray, indexWithinArray: min.indexWithinArray + 1))
    }
}

Оттуда была взята реализация кучи: https://github.com/raywenderlich/swift-algorithm-club/tree/master/Heap

Единственное, что я добавил, - это функция обновления верхнего элемента:

extension Heap {
    mutating func updateTop(_ newElement: T) {
        if isEmpty { return }
        nodes[0] = newElement
        shiftDown(0)
    }
}

Пример ввода:

4
6 2 26 64 88 96 96
4 8 20 65 86
7 1 4 16 42 58 61 69
1 84

// Format note:
// The first line - k - is the number of arrays
// The first element of each line contains the number of elements in k-th array 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...