질문에 언급했듯이 요소에 대한 선형 액세스보다 더 관심이 있습니다. 정렬 된 배열 (고유 항목 포함)을 따르는 것이 좋습니다.
이 구조는 로그 복잡성을 갖는 indexOf
방법을 제공합니다. 도움이된다면 인스턴스를위한 재귀를 제거하여 최적화 할 수 있습니다 (대신 루프를 사용하는 것이 더 좋습니다).
public class OrderedArray<T: Comparable>
{
var a = Array<T>()
func append(item: T) {
if let _ = indexOf(item) {
//already exists
return
}
a.append(item)
a.sortInPlace()
}
func indexOf(item: T) -> Int? {
//do logoriphmic search
return searchItemIndex(item, start: 0, end: a.count - 1)
}
func searchItemIndex(item: T, start: Int, end: Int) -> Int? {
if (start > end) {
return nil
}
let m = (start + end)/2
if a[m] > item {
return searchItemIndex(item, start: start, end: m - 1)
} else if a[m] < item {
return searchItemIndex(item, start: m + 1, end: end)
} else {
return m
}
}
func objectAt(index: Int) -> T {
return a[index]
}
var count: Int {
return a.count
}
}
CLEINTS 코드 :
public func ==(lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
public func <(lhs: User, rhs: User) -> Bool {
return lhs.id < rhs.id
}
public func >(lhs: User, rhs: User) -> Bool {
return lhs.id > rhs.id
}
public func <=(lhs: User, rhs: User) -> Bool {
return lhs.id <= rhs.id
}
public func >=(lhs: User, rhs: User) -> Bool {
return lhs.id >= rhs.id
}
public class User: Comparable {
var id: Int
init(id: Int) {
self.id = id
}
}
var users = OrderedArray<User>()
let mike = User(id: 1)
let john = User(id: 2)
let ash = User(id: 3)
let sam = User(id: 4)
let lens = User(id: 5)
users.append(mike)
users.append(ash)
users.append(john)
users.append(mike)
users.append(lens)
if let index = users.indexOf(lens) {
print("User with id found: \(users.objectAt(index).id)")
} else {
print("User not found")
}
'같이 IndexOf()는' –
@MartinR 당신은 같이 IndexOf 선형 시간입니다 확신합니다 ...뿐만 아니라 선형 시간이 필요합니다? 스위프트는 각 어레이에 대해 자체 맵을 가지고 있다고 생각했습니다. – TIMEX
나는 꽤 확신한다. 배열은 사전이 아닙니다. 또한 https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_CollectionType_Protocol/index.html#//apple_ref/swift/intf/s:Ps14CollectionType :'Complexity : O (self.count)를 참조하십시오. . " –