Swift中领域列表的时间复杂性
我想知道这些领域列表是如何在swift中实现的。更具体地说,我想知道它们是链表还是类似于数组列表。例如,在索引中检索项的时间复杂度是多少。假设我有一个长度为m的领域列表,我想检索[n],这个操作是像链表一样在O(n)中运行,还是像数组列表一样在O(k)中运行 编辑: 下面是对这个问题的进一步澄清: 假设我想将用户的好友列表存储在领域数据库中。我将这样做的方法是定义一个新的类用户,如下所示:Swift中领域列表的时间复杂性,swift,realm,realm-list,Swift,Realm,Realm List,我想知道这些领域列表是如何在swift中实现的。更具体地说,我想知道它们是链表还是类似于数组列表。例如,在索引中检索项的时间复杂度是多少。假设我有一个长度为m的领域列表,我想检索[n],这个操作是像链表一样在O(n)中运行,还是像数组列表一样在O(k)中运行 编辑: 下面是对这个问题的进一步澄清: 假设我想将用户的好友列表存储在领域数据库中。我将这样做的方法是定义一个新的类用户,如下所示: Class User: Object{ @objc dynamic var name: Strin
Class User: Object{
@objc dynamic var name: String?
@objc dynamic var userName: String?
@objc dynamic var email: String?
var friendList = RealmSwift.List<String>() //Contains the names of all friends
}
我想知道user.friendList[4]
操作的时间复杂度是多少。如果Realm将RealmSwift.List视为一个链表,那么复杂性必须是O(n),而如果用户被调用到内存时,RealmSwift.List被实现为一个ArrayList,那么访问列表中的第四个内存地址将是O(1)
我的好奇心来自于想知道哪个会更快:
在这两种情况下,让我们假设朋友的名字或我们正在使用的索引存在于朋友列表中。由于涉及的变量数量和领域的固有性质,这个问题将无法直接回答。我会提供一些信息,但让我澄清一点很重要 Realm不支持列表中的原语(非常好) 编辑:10.7版增加了对过滤器/查询以及原语聚合函数的支持,因此以下信息不再完全有效。然而,这仍然是需要注意的 所以你不想这么做
var friendList = RealmSwift.List<String>()
然后再这样做
let friendList = List<FriendClass>()
请记住,它正在处理领域中的所有好友对象。同样,您也可以在特定列表上执行相同的操作。因此,如果您的用户对象有一个friendsList列表:
if let peter = user.friendsList.filter("friendName == 'Peter'").first {
//do something with the peter object
}
这里是变量位:领域对象是延迟加载的。这允许Realm包含数百万个对象,但在需要它们之前不会将它们加载到内存中。这样可以防止设备过载
这是一个巨大的变量,因为磁盘访问和对象是否已加载等因素都会产生影响。然而,使用我上面介绍的技术,无论是朋友列表中的一个朋友还是10000个朋友,查询实际上都是即时的
我们的一个项目有10GB的数据,上面所示的过滤器会立即响应Realm
下面是其他变量:
let peter = realm.object(ofType: FriendClass.self, forPrimaryKey: "peters key")
为清晰起见,具有主键的对象需要O(logn)时间。n是数据库中该类型的对象数。简言之,检索朋友所需的时间与域中对象的总数无关
列表是间接寻址的另一层,一般来说,它比直接读取对象“慢”。也就是说,“较慢”是非常主观的,并且与用例相关。花.03秒从100000个好友列表中检索好友并不有效。这将是非常主观的,并且是特定于用例的,因为领域对象是延迟加载的,而不像传统数组或链表实现那样“保存在内存中”。你能提供一个示例用例并澄清这个问题吗?Hello@Jay谢谢你的回答,很抱歉我的问题不够清楚。我添加了一个示例以使其更清楚。
class FriendClass: Object {
@objc dynamic var friendName = ""
}
let friendList = List<FriendClass>()
if let peter = realm.objects(FriendClass.self).filter("friendName == 'Peter'").first {
//do something with the peter object
}
if let peter = user.friendsList.filter("friendName == 'Peter'").first {
//do something with the peter object
}
let peter = realm.object(ofType: FriendClass.self, forPrimaryKey: "peters key")