source

Swift Array에서 최소/최대값 검색

nicesource 2023. 4. 14. 21:53
반응형

Swift Array에서 최소/최대값 검색

Swift 숫자 배열이 지정된 경우 최소값과 최대값을 찾으려면 어떻게 해야 합니까?

지금까지 심플한(그러나 잠재적으로 비용이 많이 드는) 방법을 생각해 왔습니다.

var myMax = sort(myArray,>)[0]

그리고 학교에서 어떻게 배웠는지:

var myMax = 0
for i in 0..myArray.count {
    if (myArray[i] > myMax){myMax = myArray[i]}
}

Swift의 정수 어레이에서 최소값 또는 최대값을 얻을 수 있는 더 좋은 방법이 있습니까?이상적으로는 Ruby's와 같은 한 줄의 라인입니다..min그리고..max.

지정:

let numbers = [1, 2, 3, 4, 5]

스위프트 3:

numbers.min() // equals 1
numbers.max() // equals 5

스위프트 2:

numbers.minElement() // equals 1
numbers.maxElement() // equals 5

어레이의 최소값과 최대값을 직접 계산하려면reduce이 솔루션은 이전 버전에서는.min()그리고..max()스위프트에 출연하고 있습니다.


전능하신 분들을 이용하다reduce:

let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, { max($0, $1) })

마찬가지로:

let numMin = nums.reduce(Int.max, { min($0, $1) })

reduce는 내부 어큐뮬레이터 변수의 초기값인 첫 번째 값을 가져온 다음 전달된 함수(여기서는 익명)를 어큐뮬레이터 및 어레이의 각 요소에 순차적으로 적용하여 새 값을 어큐뮬레이터에 저장합니다.그러면 마지막 누적기 값이 반환됩니다.

Swift 5에서는Array, 다른 것과 같이Sequence프로토콜 준수 개체(Dictionary,Set( , etc )에는, 다음의 2개의 방법이 있습니다.max()그리고.max(by:)시퀀스 내의 최대 요소를 반환하거나nil시퀀스가 비어 있는 경우.


#1. 사용방법Arraymax()방법

시퀀스 내의 요소 유형이 다음 조건을 충족하는지 여부Comparableprotocol(그럴 수도 있음)String,Float,Character또는 커스텀 클래스 또는 구조 중 하나)를 사용할 수 있습니다.max()다음 선언이 있습니다.

@warn_unqualified_access func max() -> Element?

시퀀스의 최대 요소를 반환합니다.

다음 Playground 코드는 사용법을 보여줍니다.max():

let intMax = [12, 15, 6].max()
let stringMax = ["bike", "car", "boat"].max()

print(String(describing: intMax)) // prints: Optional(15)
print(String(describing: stringMax)) // prints: Optional("car")
class Route: Comparable, CustomStringConvertible {

    let distance: Int
    var description: String { return "Route with distance: \(distance)" }

    init(distance: Int) {
        self.distance = distance
    }

    static func ==(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance == rhs.distance
    }

    static func <(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance < rhs.distance
    }

}

let routes = [
    Route(distance: 20),
    Route(distance: 30),
    Route(distance: 10)
]

let maxRoute = routes.max()
print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)

#2. 사용방법Arraymax(by:)방법

시퀀스 내의 요소 유형이 다음 조건에 맞지 않는 경우Comparableprotocol을(를)max(by:)다음 선언이 있습니다.

@warn_unqualified_access func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?

지정된 술어를 요소 간 비교로 사용하여 시퀀스의 최대 요소를 반환합니다.

다음 Playground 코드는 사용법을 보여줍니다.max(by:):

let dictionary = ["Boat" : 15, "Car" : 20, "Bike" : 40]

let keyMaxElement = dictionary.max(by: { (a, b) -> Bool in
    return a.key < b.key
})

let valueMaxElement = dictionary.max(by: { (a, b) -> Bool in
    return a.value < b.value
})

print(String(describing: keyMaxElement)) // prints: Optional(("Car", 20))
print(String(describing: valueMaxElement)) // prints: Optional(("Bike", 40))
class Route: CustomStringConvertible {

    let distance: Int
    var description: String { return "Route with distance: \(distance)" }

    init(distance: Int) {
        self.distance = distance
    }

}

let routes = [
    Route(distance: 20),
    Route(distance: 30),
    Route(distance: 10)
]

let maxRoute = routes.max(by: { (a, b) -> Bool in
    return a.distance < b.distance
})

print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)

다른 답변은 모두 맞지만 다음과 같이 수집 연산자를 사용할 수도 있습니다.

var list = [1, 2, 3, 4]
var max: Int = (list as AnyObject).valueForKeyPath("@max.self") as Int

또한 다음과 같은 방법으로 평균을 구할 수 있습니다.

var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double

이 구문은 다른 솔루션보다 명확하지 않을 수 있지만,-valueForKeyPath:아직 사용할 수 있습니다. : )

와 함께 사용할 수 있습니다.reduce:

let randomNumbers = [4, 7, 1, 9, 6, 5, 6, 9]
let maxNumber = randomNumbers.reduce(randomNumbers[0]) { $0 > $1 ? $0 : $1 } //result is 9

Swift 3.0

이 코드를 프로그래밍 방식으로 시도할 수 있습니다.

func getSmallAndGreatestNumber() -> Void {

    let numbers = [145, 206, 116, 809, 540, 176]
    var i = 0
    var largest = numbers[0]
    var small = numbers[0]
    while i < numbers.count{

        if (numbers[i] > largest) {
            largest = numbers[i]
        }
        if (numbers[i] < small) {
            small = numbers[i]
        }
        i = i + 1
    }
    print("Maximum Number ====================\(largest)")// 809
    print("Minimum Number ====================\(small)")// 116
}

Swift 1.2(또는 그 이전 버전)에서는 다음을 사용해야 합니다.

let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, combine: { max($0, $1) })

Double Value를 사용하기 위해 다음과 같은 방법을 사용했습니다.

let nums = [1.3, 6.2, 3.6, 9.7, 4.9, 6.3];
let numMax = nums.reduce(-Double.infinity, combine: { max($0, $1) })

2에서는 Swift 2.0을 사용하고 .minElement ★★★★★★★★★★★★★★★★★」maxElementSequenceType프로토콜은 다음과 같이 불러야 합니다.

let a = [1, 2, 3]
print(a.maxElement()) //3
print(a.minElement()) //1

「」를 사용합니다.maxElement같은 기능은 현재 사용할 수 없습니다.

Swift의 구문은 유동적이기 때문에 Xcode version 7 beta6에서 확인만 하면 됩니다.

향후 수정될 가능성이 있으므로 이 방법을 사용하기 전에 문서를 확인하는 것이 좋습니다.

여기에 게재된 솔루션의 퍼포먼스 테스트를 나타냅니다.https://github.com/tedgonzalez/MaxElementInCollectionPerformance

Swift 5가 가장 빠릅니다.

array.max()

var numbers = [1, 2, 7, 5];    
var val = sort(numbers){$0 > $1}[0];

애플이 2021년에 선보인 스위프트 알고리즘은 고도로 최적화된 것을 포함하고 있다.

문서의 예:

let numbers = [7, 1, 6, 2, 8, 3, 9]
if let (smallest, largest) = numbers.minAndMax(by: <) {
    // Work with 1 and 9....
}

총 복잡도는 O(k log k + nk)이며, k가 소량일 경우 O(n)에 가까운 런타임이 발생합니다.k가 대량(컬렉션의 10% 이상)인 경우 어레이 전체를 정렬하는 것으로 돌아갑니다.현실적으로 이는 최악의 경우가 실제로는 O(n log n)임을 의미합니다.

Swift 3/4용으로 업데이트됨:

아래의 간단한 코드 행을 사용하여 어레이에서 최대값을 구합니다.

var num = [11, 2, 7, 5, 21]
var result = num.sorted(){
    $0 > $1
}
print("max from result: \(result[0])") // 21

학교에서 가르치는 방식이 잠재적으로 비싸다고 생각하는 이유가 궁금해서요?【O(N)】는 【O(N)】를 의미합니다.실제로 , 차수의 할 수 .reduce.

따라서 성능 면에서는 for loop이 가장 좋다고 생각합니다.맥스를 찾는 데 O(N)보다 더 좋은 건 없을 거야

그냥 ..max()사과가 제공하는 방법이 가장 좋은 방법입니다.

최소값과 최대값을 모두 원하는 경우, 효율적인 접근법은 단일 값을 사용하는 것입니다.reduce플플: :

let values = [11, 2, 7, 5, 21]

let (minimum, maximum) = values.reduce((Int.max, Int.min)) {
    (min($0.0, $1), max($0.1, $1))
}

print(minimum, maximum) // 2, 21
let array: [Int] = [2, -22, -1, -5600, 333, -167]
var min = 0
var max = array[0]

for i in array {
    // finding the min
    if min > i {
        min = i
    }
    // finding the max
    if max < i {
        max = i
    }
}

print("Minimum: \(min)\nMaximum: \(max)")

하여 ""를 사용할 도 있습니다.array.first ★★★★★★★★★★★★★★★★★」array.last

언급URL : https://stackoverflow.com/questions/24036514/find-min-max-value-in-swift-array

반응형