正如您在问题中所述,您比线性访问元素更感兴趣。我会建议考虑下面的有序数组(具有独特的项目)。
该结构提供了具有对数复杂度的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) 。' –