Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中领域列表的时间复杂性_Swift_Realm_Realm List - Fatal编程技术网

Swift中领域列表的时间复杂性

Swift中领域列表的时间复杂性,swift,realm,realm-list,Swift,Realm,Realm List,我想知道这些领域列表是如何在swift中实现的。更具体地说,我想知道它们是链表还是类似于数组列表。例如,在索引中检索项的时间复杂度是多少。假设我有一个长度为m的领域列表,我想检索[n],这个操作是像链表一样在O(n)中运行,还是像数组列表一样在O(k)中运行 编辑: 下面是对这个问题的进一步澄清: 假设我想将用户的好友列表存储在领域数据库中。我将这样做的方法是定义一个新的类用户,如下所示: Class User: Object{ @objc dynamic var name: Strin

我想知道这些领域列表是如何在swift中实现的。更具体地说,我想知道它们是链表还是类似于数组列表。例如,在索引中检索项的时间复杂度是多少。假设我有一个长度为m的领域列表,我想检索[n],这个操作是像链表一样在O(n)中运行,还是像数组列表一样在O(k)中运行

编辑:

下面是对这个问题的进一步澄清:

假设我想将用户的好友列表存储在领域数据库中。我将这样做的方法是定义一个新的类用户,如下所示:

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)

我的好奇心来自于想知道哪个会更快:

  • 在列表中循环查找我们要显示的朋友的姓名:
  • 知道我们要显示的朋友的索引,比如索引4:

  • 在这两种情况下,让我们假设朋友的名字或我们正在使用的索引存在于朋友列表中。

    由于涉及的变量数量和领域的固有性质,这个问题将无法直接回答。我会提供一些信息,但让我澄清一点很重要

    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是数据库中该类型的对象数。简言之,检索朋友所需的时间与域中对象的总数无关

  • 索引
  • 索引对象使写入速度稍慢,但使查询速度更快,在上面的示例中,如果将名称设置为indexedProperty,则在查询该属性时会提高总体读取速度

  • 列表

  • 列表是间接寻址的另一层,一般来说,它比直接读取对象“慢”。也就是说,“较慢”是非常主观的,并且与用例相关。花.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")