正如您在問題中所述,您比線性訪問元素更感興趣。我會建議考慮下面的有序數組(具有獨特的項目)。
該結構提供了具有對數複雜度的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:'Complexity:O(self.count) 。' –