質問に記載されているように、要素への線形アクセスよりも優れています。私は順序配列(ユニークな項目を持つ)に従うことをお勧めします。
この構造体は、対数複雑さを持つ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のCODE:
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のは線形時間であるあなたがよろしいですか?私はswiftが各配列のために独自のマップを持っていると思った? – TIMEX
私はかなり確信しています。配列は辞書ではありません。 https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_CollectionType_Protocol/index.html#//apple_ref/swift/intf/s:Ps14CollectionType: '複雑さ:O(self.count)も参照してください。 " –