сегодня я сделал тест на работу, и меня попросили найти массив целых чисел, вот вопрос:
Цель этого упражнения - проверить наличие числа в массив.
Технические характеристики:
Элементы представляют собой целые числа, расположенные в порядке по возрастанию .
Массив может содержать до 1 миллион элементов
Реализация функции existInArray (_ numbers: [Int], _ k: Int) , чтобы она возвращала true , если k принадлежит числам , в противном случае функция должна вернуть false .
Пример:
let numbers = [-9, 14, 37, 102]
existsInArray(numbers, 102) // returns true
existsInArray(numbers, 36) //returns false
Примечание. Попробуйте сохранить циклы ЦП
Хорошо, поэтому я дал свой ответ, который является кодом ниже, и дождался результата
func existsInArray(_ numbers: [Int], _ k: Int) -> Bool {
if numbers.isEmpty {
return false
}
let numbersHalfIndex: Int = (numbers.count/2)
if k == numbers[numbersHalfIndex] {
return true
} else if k != numbers[0] && numbers.count == 1 {
return false
} else if k <= numbers[numbersHalfIndex] {
let leftHalfNumbersArray = numbers[0 ..< numbersHalfIndex]
return existsInArray(Array(leftHalfNumbersArray), k)
} else if k > numbers[numbersHalfIndex] {
let rightHalfNumbersArray = numbers[numbersHalfIndex ..< numbers.count]
return existsInArray(Array(rightHalfNumbersArray), k)
} else {
return false
}
}
Так получается, что "Решение не работает в разумных пределах время с миллионом элементов ", и теперь я не знаю, что я сделал не так, поскольку бинарный поиск работает быстро, как f * ck.
Мое единственное предположение что может быть number.count или числа [0 ... или числа [numbersHalfIndex ... делает все go медленнее, чем ожидалось.
Я спотыкаюсь или что-то в этом роде?
Редактировать: Если кому-то интересно, я протестировал свой код и код Мартина R, чтобы увидеть, какое влияние оказывает использование ArraySlice с точки зрения времени , Я использовал массив 100 000 000 итенов в порядке возрастания, начиная с 0. Вот как я захватил время:
print("////////// MINE //////////")
var startTime = CFAbsoluteTimeGetCurrent()
print(existsInArray(numbers, 0))
var timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time elapsed for mine: \(timeElapsed) s.")
print("////////// Martin R //////////")
counter = 0
startTime = CFAbsoluteTimeGetCurrent()
print(existsInArrayOptimal(numbers, 0))
timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time elapsed for Martin R: \(timeElapsed) s.")
И вот результат:
// //////// MINE //////////
true
Время, прошедшее для шахты:
1.2008800506591797 с.
////////// Martin R //////////
true
Время, прошедшее для Martin R: 0.00012993812561035156 с.
Это примерно в 1000 раз быстрее!